lexer grammar CTFLexer; options { language = Java; } @lexer::header { package org.eclipse.linuxtools.ctf.parser; } /* * Lexer grammers */ /* * Keywords */ ALIGNTOK : 'align' ; CONSTTOK : 'const' ; CHARTOK : 'char' ; DOUBLETOK : 'double' ; ENUMTOK : 'enum' ; EVENTTOK : 'event' ; FLOATINGPOINTTOK : 'floating_point' ; FLOATTOK : 'float' ; INTEGERTOK : 'integer' ; INTTOK : 'int' ; LONGTOK : 'long' ; SHORTTOK : 'short' ; SIGNEDTOK : 'signed' ; STREAMTOK : 'stream' ; STRINGTOK : 'string' ; STRUCTTOK : 'struct' ; TRACETOK : 'trace' ; TYPEALIASTOK : 'typealias' ; TYPEDEFTOK : 'typedef' ; UNSIGNEDTOK : 'unsigned' ; VARIANTTOK : 'variant' ; VOIDTOK : 'void' ; BOOLTOK : '_Bool' ; COMPLEXTOK : '_Complex' ; IMAGINARYTOK : '_Imaginary' ; ENVTOK : 'env' ; CLOCKTOK : 'clock' ; /* * Spec still to come. */ NANNUMBERTOK : 'NaN' ; INFINITYTOK : '+inf' ; NINFINITYTOK : '-inf' ; /* * Symbols */ SEPARATOR : ',' ; COLON : ':' ; ELIPSES : '...' ; ASSIGNMENT : '=' ; TYPE_ASSIGNMENT : ':=' ; LT : '<' ; GT : '>' ; OPENBRAC : '[' ; CLOSEBRAC : ']' ; LPAREN : '(' ; RPAREN : ')' ; LCURL : '{' ; RCURL : '}' ; TERM : ';' ; POINTER : '*' ; SIGN : '+' | '-' ; ARROW : '->' ; DOT : '.' ; fragment BACKSLASH : '\\' ; /* * Boolean literals * - We better leave them as identifiers and numbers... */ /*TRUE : 'true' | 'TRUE' ; FALSE : 'false' | 'FALSE' ; ZERO : '0' ; ONE : '1' ;*/ /* * Integer literals */ OCTAL_LITERAL : '0' ('0'..'7')+ INTEGER_TYPES_SUFFIX? ; DECIMAL_LITERAL : DIGIT+ INTEGER_TYPES_SUFFIX? ; HEX_LITERAL : HEX_PREFIX HEX_DIGIT+ INTEGER_TYPES_SUFFIX? ; fragment HEX_DIGIT : DIGIT | ('a'..'f') | ('A'..'F') ; fragment HEX_PREFIX : '0' ('x' | 'X') ; /* Helpers for integer literals */ fragment DIGIT : '0'..'9' ; fragment NONZERO_DIGIT : '1'..'9' ; /** * Integer suffix for long, long long and unsigned. * * Matches all possible combination of L, LL and U. */ fragment INTEGER_TYPES_SUFFIX : ('l' ('l')? | 'L' ('L')?) // l, ll | ('u' | 'U') // u | ('u' | 'U') ('l' ('l')? | 'L' ('L')?) // ul, ull | ('l' ('l')? | 'L' ('L')?) ('u'| 'U') // lu, llu ; /** * Escape sequences */ fragment ESCAPE_SEQUENCE : BACKSLASH ('\'' | '"' | '?' | BACKSLASH | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) | OCTAL_ESCAPE | UNICODE_ESCAPE | HEXADECIMAL_ESCAPE ; /** * Octal escape sequence */ fragment OCTAL_ESCAPE : BACKSLASH ('0'..'3') ('0'..'7') ('0'..'7') | BACKSLASH ('0'..'7') ('0'..'7') | BACKSLASH ('0'..'7') ; /** * Hexadecimal escape sequence */ fragment HEXADECIMAL_ESCAPE : BACKSLASH 'x' HEX_DIGIT+ ; /** * Unicode escape sequence */ fragment UNICODE_ESCAPE : BACKSLASH 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT | BACKSLASH 'U' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT ; /* Used in both character and string literal */ fragment STRINGPREFIX : 'L'; /* * Character literal */ CHARACTER_LITERAL : STRINGPREFIX? SINGLEQUOTE CHAR_CONTENT+ SINGLEQUOTE ; fragment CHAR_CONTENT : (ESCAPE_SEQUENCE | ~(BACKSLASH | SINGLEQUOTE)) ; fragment SINGLEQUOTE : '\''; /* * String literal */ STRING_LITERAL : STRINGPREFIX? DOUBLEQUOTE STRING_CONTENT* DOUBLEQUOTE ; fragment STRING_CONTENT : (ESCAPE_SEQUENCE | ~(BACKSLASH | DOUBLEQUOTE)) ; fragment DOUBLEQUOTE : '"' ; /** * Whitespaces */ WS : (' ' | '\r' | '\t' | '\u000C' | '\n') { $channel=HIDDEN; } ; /** * Multiline comment */ // About the greedy option: see page 100-101 of The Definitive ANTLR reference // COMMENT : '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;} ; COMMENT : COMMENT_OPEN .* COMMENT_CLOSE { $channel = HIDDEN; } ; fragment COMMENT_OPEN : '/*'; fragment COMMENT_CLOSE : '*/'; /** * Single line comment */ LINE_COMMENT : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} ; /** * Identifiers */ IDENTIFIER : NONDIGIT (NONDIGIT | DIGIT)* ; fragment NONDIGIT : ('_') | ('A'..'Z') | ('a'..'z') ;