package com.siberika.idea.pascal.lang.lexer;
import com.intellij.lexer.DelegateLexer;
import com.intellij.lexer.FlexAdapter;
import com.intellij.lexer.FlexLexer;
import com.intellij.lexer.Lexer;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.tree.TokenSet;
import com.siberika.idea.pascal.lang.psi.PasTypes;
import org.jetbrains.annotations.NotNull;
public abstract class PascalLexer extends DelegateLexer implements PasTypes {
public static final TokenSet KEYWORDS = TokenSet.create(
BEGIN, END,
CLASS, DISPINTERFACE,
PROGRAM, UNIT, LIBRARY, PACKAGE,
USES, INTERFACE, IMPLEMENTATION,
EXPORTS, INITIALIZATION, FINALIZATION,
CONTAINS, REQUIRES,
TRY, RAISE, EXCEPT, ON, FINALLY,
VAR, CONST, TYPE, THREADVAR, RESOURCESTRING,
PROCEDURE, FUNCTION, ARRAY, RECORD, SET, FILE, OBJECT,
OF, ABSOLUTE, PACKED, OPERATOR,
CONSTRUCTOR, DESTRUCTOR, PROPERTY,
LABEL, GOTO, EXIT, BREAK, CONTINUE,
STRICT, PRIVATE, PROTECTED, PUBLIC, PUBLISHED, AUTOMATED,
VIRTUAL, DYNAMIC, ABSTRACT, OVERLOAD, OVERRIDE, REINTRODUCE,
MESSAGE, STATIC, SEALED, FINAL, ASSEMBLER,
CDECL, PASCAL, REGISTER, SAFECALL, STDCALL, EXPORT, INLINE,
DISPID, EXTERNAL, FORWARD, HELPER, IMPLEMENTS,
DEFAULT, INDEX, READ, WRITE,
DEPRECATED, EXPERIMENTAL, PLATFORM, REFERENCE,
FOR, TO, DOWNTO, REPEAT, UNTIL, WHILE, DO,
IF, THEN, ELSE, CASE, WITH,
NIL, FALSE, TRUE,
ASM, INHERITED, OUT, SELF, NEW
);
public static final TokenSet NUMBERS = TokenSet.create(
NUMBER_INT, NUMBER_REAL, NUMBER_HEX, NUMBER_BIN, NUMBER_OCT
);
public static final TokenSet SYMBOLS = TokenSet.create(
ASSIGN, RANGE,
MULT, DIV, PLUS, MINUS,
EQ, GT, LT, NE,
COLON, COMMA, DOT, DEREF, AT,
HEXNUM, CHARNUM
);
public static final TokenSet OPERATORS = TokenSet.create(
AND, OR, NOT, XOR, IDIV, MOD, SHR, SHL, IN, AS, IS
);
public static final TokenSet STATEMENTS = TokenSet.create(
FOR, WHILE, REPEAT,
IF, CASE, WITH,
GOTO, EXIT,
TRY, RAISE,
END
);
public static final TokenSet STATEMENTS_IN_CYCLE = TokenSet.create(BREAK, CONTINUE);
public static final TokenSet VALUES = TokenSet.create(NIL, FALSE, TRUE);
public static final TokenSet MODULE_HEADERS = TokenSet.create(PROGRAM, UNIT, LIBRARY, PACKAGE);
public static final TokenSet TOP_LEVEL_DECLARATIONS = TokenSet.create(CONTAINS, REQUIRES);
public static final TokenSet UNIT_SECTIONS = TokenSet.create(
INTERFACE, IMPLEMENTATION,
INITIALIZATION, FINALIZATION
);
public static final TokenSet DECLARATIONS = TokenSet.create(
VAR, CONST, TYPE, THREADVAR, RESOURCESTRING,
PROCEDURE, FUNCTION, CONSTRUCTOR, DESTRUCTOR
);
public static final TokenSet STRUCT_DECLARATIONS = TokenSet.create(
PROCEDURE, FUNCTION, CONSTRUCTOR, DESTRUCTOR,
CLASS, OPERATOR, PROPERTY, END
);
public static final TokenSet DIRECTIVE_ROUTINE = TokenSet.create(
OVERLOAD, INLINE, ASSEMBLER,
CDECL, PASCAL, REGISTER, SAFECALL, STDCALL, EXPORT,
DEPRECATED, EXPERIMENTAL, PLATFORM, LIBRARY
);
public static final TokenSet DIRECTIVE_METHOD = TokenSet.create(
REINTRODUCE, OVERLOAD, MESSAGE, STATIC, DYNAMIC, OVERRIDE, VIRTUAL,
CDECL, PASCAL, REGISTER, SAFECALL, STDCALL, EXPORT,
ABSTRACT, FINAL, INLINE, ASSEMBLER,
DEPRECATED, EXPERIMENTAL, PLATFORM, LIBRARY, DISPID
);
public static final TokenSet VISIBILITY = TokenSet.create(STRICT, PRIVATE, PROTECTED, PUBLIC, PUBLISHED, AUTOMATED);
/*EXPORTS,
EXCEPT, ON, FINALLY,
OF, ABSOLUTE, OPERATOR,
CONSTRUCTOR, DESTRUCTOR, PROPERTY,
LABEL,
STRICT, PRIVATE, PROTECTED, PUBLIC, PUBLISHED, AUTOMATED,
MESSAGE, STATIC, SEALED, FINAL,
DISPID, EXTERNAL, FORWARD, HELPER, IMPLEMENTS,
OUT, DEFAULT, INDEX, READ, WRITE,
TO, DOWNTO, UNTIL, DO,
THEN, ELSE,
ASM, INHERITED, SELF, NEW*/
public static final TokenSet PARENS = TokenSet.create(LBRACK, LPAREN, RPAREN, RBRACK);
public static final TokenSet COMPILER_DIRECTIVES = TokenSet.create(PasTypes.INCLUDE, PasTypes.CT_DEFINE, PasTypes.CT_ELSE, PasTypes.CT_ENDIF, PasTypes.CT_IF,
PasTypes.CT_IFDEF, PasTypes.CT_IFNDEF, PasTypes.CT_IFOPT, PasTypes.CT_UNDEFINE, PasTypes.COMP_OPTION);
public static final TokenSet COMMENTS = TokenSet.orSet(TokenSet.create(PasTypes.COMMENT), COMPILER_DIRECTIVES);
protected final PascalFlexLexerImpl pascalFlexLexer;
public PascalLexer(@NotNull Lexer delegate) {
super(delegate);
pascalFlexLexer = (PascalFlexLexerImpl) getFlexLexer();
}
public FlexLexer getFlexLexer() {
return myDelegate instanceof FlexAdapter ? ((FlexAdapter) myDelegate).getFlex() : null;
}
public static class ParsingPascalLexer extends PascalLexer {
public ParsingPascalLexer(Project project, VirtualFile virtualFile) {
super(new FlexAdapter(new PascalFlexLexerImpl(null, project, virtualFile, false)));
}
}
public static class SyntaxHighlightingPascalLexer extends PascalLexer {
public SyntaxHighlightingPascalLexer(Project project, VirtualFile virtualFile) {
super(new FlexAdapter(new PascalFlexLexerImpl(null, project, virtualFile, true)));
}
@Override
public int getState() {
return pascalFlexLexer.getStateWithConditionals();
}
}
}