package org.chartsy.stockscanpro.lexer.api; import java.util.ArrayList; import java.util.Collection; import java.util.EnumSet; import java.util.HashMap; import java.util.Map; import org.chartsy.stockscanpro.lexer.ScanLexer; import org.netbeans.api.lexer.InputAttributes; import org.netbeans.api.lexer.Language; import org.netbeans.api.lexer.LanguagePath; import org.netbeans.api.lexer.Token; import org.netbeans.api.lexer.TokenId; import org.netbeans.spi.lexer.LanguageEmbedding; import org.netbeans.spi.lexer.LanguageHierarchy; import org.netbeans.spi.lexer.Lexer; import org.netbeans.spi.lexer.LexerRestartInfo; /** * * @author Viorel */ public enum ScanTokenId implements TokenId { ERROR (null, "error"), IDENTIFIER (null, "identifier"), AND ("and", "keyword"), OR ("or", "keyword"), OPEN_VAR ("open", "literal"), CLOSE_VAR ("close", "literal"), HIGH_VAR ("high", "literal"), LOW_VAR ("low", "literal"), VOLUME_VAR ("volume", "literal"), SPREAD_VAR ("spread", "literal"), // Price OPEN ("open", "indicator"), CLOSE ("close", "indicator"), HIGH ("high", "indicator"), LOW ("low", "indicator"), VOLUME ("volume", "indicator"), SPREAD ("spread", "indicator"), BODY_TOP ("body_top", "indicator"), BODY_BOTTOM ("body_bottom", "indicator"), MIN ("min", "indicator"), MAX ("max", "indicator"), // Bollinger Bands BOLLINGER_UPPER ("bollinger_upper", "indicator"), BOLLINGER_LOWER ("bollinger_lower", "indicator"), BOLLINGER_MIDDLE ("bollinger_middle", "indicator"), // Commodity Channel Index CCI ("cci", "indicator"), CCI_EMA ("cci_ema", "indicator"), // Directional Movement Index ADX ("adx", "indicator"), PDI ("pdi", "indicator"), MDI ("mdi", "indicator"), // Moving Average SMA ("sma", "indicator"), EMA ("ema", "indicator"), // Average True Range ATR ("atr", "indicator"), // Force Index FORCE_INDEX ("force_index", "indicator"), // MACD, Moving Average Convergence/Divergence MACD ("macd", "indicator"), MACD_SIGNAL ("macd_signal", "indicator"), MACD_HISTOGRAM ("macd_histogram", "indicator"), // Money Flow MONEY_FLOW ("money_flow", "indicator"), MONEY_FLOW_AVG ("money_flow_avg", "indicator"), // On Balance Volume ON_BALANCE_VOLUME ("on_balance_volume", "indicator"), // Relative Strength Index RSI ("rsi", "indicator"), // Full Stochastics STO_K ("sto_k", "indicator"), STO_D ("sto_d", "indicator"), // Ultimate Oscillator ULTIMATE_OSCILLATOR ("ultimate_oscillator", "indicator"), // Williams %R PCTR ("pctr", "indicator"), INT_LITERAL (null, "number"), LONG_LITERAL (null, "number"), FLOAT_LITERAL (null, "number"), DOUBLE_LITERAL (null, "number"), LPAREN ("(", "separator"), RPAREN (")", "separator"), LBRACKET ("[", "separator"), RBRACKET ("]", "separator"), COMMA (",", "separator"), US ("_", "separator"), EQ ("=", "operator"), GT (">", "operator"), LT ("<", "operator"), LTEQ ("<=", "operator"), GTEQ (">=", "operator"), PLUS ("+", "operator"), MINUS ("-", "operator"), STAR ("*", "operator"), SLASH ("/", "operator"), WHITESPACE (null, "whitespace"), FLOAT_LITERAL_INVALID (null, "number"); private final String fixedText; private final String primaryCategory; ScanTokenId(String fixedText, String primaryCategory) { this.fixedText = fixedText; this.primaryCategory = primaryCategory; } public String fixedText() { return this.fixedText; } public String primaryCategory() { return this.primaryCategory; } private static final Language<ScanTokenId> language = new LanguageHierarchy<ScanTokenId>() { @Override protected String mimeType() { return "text/x-scan"; } @Override protected Collection<ScanTokenId> createTokenIds() { return EnumSet.allOf(ScanTokenId.class); } @Override protected Map<String,Collection<ScanTokenId>> createTokenCategories() { Map<String,Collection<ScanTokenId>> cats = new HashMap<String,Collection<ScanTokenId>>(); // Additional literals being a lexical error cats.put("error", EnumSet.of(ScanTokenId.FLOAT_LITERAL_INVALID)); // Literals category EnumSet<ScanTokenId> nums = EnumSet.of( ScanTokenId.INT_LITERAL, ScanTokenId.LONG_LITERAL, ScanTokenId.FLOAT_LITERAL, ScanTokenId.DOUBLE_LITERAL ); cats.put("number", nums); EnumSet<ScanTokenId> kwds = EnumSet.of( ScanTokenId.AND, ScanTokenId.OR ); cats.put("keyword", kwds); EnumSet<ScanTokenId> inds = EnumSet.of( ScanTokenId.ADX, ScanTokenId.ATR, ScanTokenId.BODY_BOTTOM, ScanTokenId.BODY_TOP, ScanTokenId.BOLLINGER_LOWER, ScanTokenId.BOLLINGER_MIDDLE, ScanTokenId.BOLLINGER_UPPER, ScanTokenId.CCI, ScanTokenId.CCI_EMA, ScanTokenId.CLOSE, ScanTokenId.EMA, ScanTokenId.FORCE_INDEX, ScanTokenId.HIGH, ScanTokenId.LOW, ScanTokenId.MACD, ScanTokenId.MACD_HISTOGRAM, ScanTokenId.MACD_SIGNAL, ScanTokenId.MAX, ScanTokenId.MDI, ScanTokenId.MIN, ScanTokenId.MONEY_FLOW, ScanTokenId.MONEY_FLOW_AVG, ScanTokenId.OPEN, ScanTokenId.ON_BALANCE_VOLUME, ScanTokenId.PCTR, ScanTokenId.PDI, ScanTokenId.RSI, ScanTokenId.SMA, ScanTokenId.SPREAD, ScanTokenId.STO_D, ScanTokenId.STO_K, ScanTokenId.ULTIMATE_OSCILLATOR, ScanTokenId.VOLUME ); cats.put("indicator", inds); EnumSet<ScanTokenId> lits = EnumSet.of( ScanTokenId.CLOSE_VAR, ScanTokenId.HIGH_VAR, ScanTokenId.LOW_VAR, ScanTokenId.OPEN_VAR, ScanTokenId.SPREAD_VAR, ScanTokenId.VOLUME_VAR ); cats.put("literal", lits); return cats; } @Override protected Lexer<ScanTokenId> createLexer(LexerRestartInfo<ScanTokenId> info) { return new ScanLexer(info); } @Override protected LanguageEmbedding<?> embedding( Token<ScanTokenId> token, LanguagePath languagePath, InputAttributes inputAttributes) { return null; // No embedding } }.language(); public static Language<ScanTokenId> language() { return language; } }