lexer grammar KeyLangLexer; channels { WHITESPACE } // Whitespace NEWLINE : '\r\n' | '\r' | '\n' ; WS : [\t ]+ -> channel(WHITESPACE) ; RANGE_INCLUSIVE : '..' ; RANGE_EXCLUSIVE_UNTIL : 'until' ; RANGE_EXCLUSIVE : '..<' ; RANGE_DOWNTO : 'downTo' ; STEP : 'step' ; // Identifiers ID : [$_]*[a-zA-Z][A-Za-z0-9_]* | '`'[$_]*[A-Za-z0-9_-]*'`'; FUNCTION_ID : [$_]*[a-z][A-Za-z0-9_]* ; // Literals DECLIT : [0-9][0-9]* '.' [0-9]+ ; INTLIT : '0'|[0-9][0-9]* ; // Operators PLUS : '+' ; PERCENTAGE : '%' ; MINUS : '-' ; ASTERISK : '*' ; DIVISION : '/' ; ASSIGN : '=' ; LPAREN : '(' ; RPAREN : ')' ; LBRACKET : '[' ; RBRACKET : ']' ; LCURLY : '{' ; RCURLY : '}' ; QUESTION_MARK : '?' ; COLON : ':' ; ARROW : '->' ; COMMA : ',' ; DOT : '.' ; EQ : '==' ; LT : '<' ; LTEQ : '<=' ; GT : '>' ; GTEQ : '>=' ; AND : '&&' ; OR : '||' ; NOT : '!' ; STRING_OPEN : '"' -> pushMode(MODE_IN_STRING); UNMATCHED : . ; mode MODE_IN_STRING; ESCAPE_STRING_DELIMITER : '\\"' ; ESCAPE_SLASH : '\\\\' ; ESCAPE_NEWLINE : '\\n' ; ESCAPE_SHARP : '\\#' ; STRING_CLOSE : '"' -> popMode ; STRING_CONTENT : ~["\n\r\t\\#]+ ;