Commit | Line | Data |
---|---|---|
866e5b51 FC |
1 | lexer grammar CTFLexer; |
2 | ||
3 | options { | |
91fd06f5 | 4 | language = Java; |
866e5b51 FC |
5 | } |
6 | ||
7 | @lexer::header { | |
91fd06f5 | 8 | package org.eclipse.linuxtools.ctf.parser; |
866e5b51 FC |
9 | } |
10 | ||
11 | /* | |
e8143d31 | 12 | * Lexer tokens |
866e5b51 | 13 | */ |
91fd06f5 | 14 | |
866e5b51 FC |
15 | /* |
16 | * Keywords | |
17 | */ | |
18 | ALIGNTOK : 'align' ; | |
19 | CONSTTOK : 'const' ; | |
20 | CHARTOK : 'char' ; | |
21 | DOUBLETOK : 'double' ; | |
22 | ENUMTOK : 'enum' ; | |
23 | EVENTTOK : 'event' ; | |
24 | FLOATINGPOINTTOK : 'floating_point' ; | |
25 | FLOATTOK : 'float' ; | |
26 | INTEGERTOK : 'integer' ; | |
27 | INTTOK : 'int' ; | |
28 | LONGTOK : 'long' ; | |
29 | SHORTTOK : 'short' ; | |
30 | SIGNEDTOK : 'signed' ; | |
31 | STREAMTOK : 'stream' ; | |
32 | STRINGTOK : 'string' ; | |
33 | STRUCTTOK : 'struct' ; | |
34 | TRACETOK : 'trace' ; | |
35 | TYPEALIASTOK : 'typealias' ; | |
36 | TYPEDEFTOK : 'typedef' ; | |
37 | UNSIGNEDTOK : 'unsigned' ; | |
38 | VARIANTTOK : 'variant' ; | |
39 | VOIDTOK : 'void' ; | |
40 | BOOLTOK : '_Bool' ; | |
41 | COMPLEXTOK : '_Complex' ; | |
42 | IMAGINARYTOK : '_Imaginary' ; | |
43 | ENVTOK : 'env' ; | |
44 | CLOCKTOK : 'clock' ; | |
4c9d2941 | 45 | /* |
e8143d31 | 46 | * Callsite tokens (CTF v1.9) |
4c9d2941 MK |
47 | */ |
48 | CALLSITETOK : 'callsite' ; | |
49 | ||
866e5b51 FC |
50 | |
51 | /* | |
e8143d31 EB |
52 | * These tokens are not part of the CTF standard. |
53 | * There are planned to be in CTF v1.9 | |
866e5b51 FC |
54 | */ |
55 | NANNUMBERTOK : 'NaN' ; | |
56 | INFINITYTOK : '+inf' ; | |
57 | NINFINITYTOK : '-inf' ; | |
58 | ||
59 | /* | |
60 | * Symbols | |
61 | */ | |
62 | SEPARATOR : ',' ; | |
63 | COLON : ':' ; | |
64 | ELIPSES : '...' ; | |
65 | ASSIGNMENT : '=' ; | |
66 | TYPE_ASSIGNMENT : ':=' ; | |
67 | LT : '<' ; | |
68 | GT : '>' ; | |
69 | OPENBRAC : '[' ; | |
70 | CLOSEBRAC : ']' ; | |
71 | LPAREN : '(' ; | |
72 | RPAREN : ')' ; | |
73 | LCURL : '{' ; | |
74 | RCURL : '}' ; | |
75 | TERM : ';' ; | |
76 | POINTER : '*' ; | |
77 | SIGN : '+' | '-' ; | |
78 | ARROW : '->' ; | |
79 | DOT : '.' ; | |
80 | fragment BACKSLASH : '\\' ; | |
81 | ||
e8143d31 EB |
82 | /* Helpers for integer literals */ |
83 | fragment DIGIT : '0'..'9' ; | |
84 | fragment OCT_DIGIT : '0'..'7' ; | |
85 | fragment OCT_PREFIX : '0' ; | |
86 | fragment NONZERO_DIGIT : '1'..'9' ; | |
87 | fragment HEX_DIGIT : DIGIT | ('a'..'f') | ('A'..'F') ; | |
88 | fragment HEX_PREFIX : '0' ('x' | 'X') ; | |
866e5b51 FC |
89 | |
90 | /* | |
91 | * Integer literals | |
92 | */ | |
e8143d31 | 93 | OCTAL_LITERAL : OCT_PREFIX (OCT_DIGIT)+ INTEGER_TYPES_SUFFIX? ; |
866e5b51 | 94 | DECIMAL_LITERAL : DIGIT+ INTEGER_TYPES_SUFFIX? ; |
866e5b51 | 95 | HEX_LITERAL : HEX_PREFIX HEX_DIGIT+ INTEGER_TYPES_SUFFIX? ; |
866e5b51 FC |
96 | |
97 | /** | |
98 | * Integer suffix for long, long long and unsigned. | |
99 | * | |
100 | * Matches all possible combination of L, LL and U. | |
91fd06f5 | 101 | */ |
e8143d31 EB |
102 | fragment INTEGER_TYPES_SUFFIX |
103 | : ('l' ('l')? | 'L' ('L')?) // l, ll | |
91fd06f5 EB |
104 | | ('u' | 'U') // u |
105 | | ('u' | 'U') ('l' ('l')? | 'L' ('L')?) // ul, ull | |
106 | | ('l' ('l')? | 'L' ('L')?) ('u'| 'U') // lu, llu | |
107 | ; | |
866e5b51 FC |
108 | |
109 | /** | |
110 | * Escape sequences | |
111 | */ | |
e8143d31 EB |
112 | fragment ESCAPE_SEQUENCE |
113 | : BACKSLASH ('\'' | '"' | '?' | BACKSLASH | 'a' | 'b' | 'f' | 'n' | 'r' | 't' | 'v' ) | |
91fd06f5 EB |
114 | | OCTAL_ESCAPE |
115 | | UNICODE_ESCAPE | |
116 | | HEXADECIMAL_ESCAPE | |
32e3cfd4 | 117 | ; |
866e5b51 FC |
118 | |
119 | /** | |
120 | * Octal escape sequence | |
121 | */ | |
e8143d31 EB |
122 | fragment OCTAL_ESCAPE |
123 | : BACKSLASH ('0'..'3') ('0'..'7') ('0'..'7') | |
866e5b51 FC |
124 | | BACKSLASH ('0'..'7') ('0'..'7') |
125 | | BACKSLASH ('0'..'7') | |
126 | ; | |
127 | ||
128 | /** | |
129 | * Hexadecimal escape sequence | |
130 | */ | |
131 | fragment HEXADECIMAL_ESCAPE : BACKSLASH 'x' HEX_DIGIT+ ; | |
132 | ||
133 | /** | |
134 | * Unicode escape sequence | |
135 | */ | |
e8143d31 EB |
136 | fragment UNICODE_ESCAPE |
137 | : BACKSLASH 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT | |
866e5b51 FC |
138 | | BACKSLASH 'U' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT |
139 | ; | |
140 | ||
141 | ||
142 | /* Used in both character and string literal */ | |
143 | fragment STRINGPREFIX : 'L'; | |
144 | ||
145 | /* | |
146 | * Character literal | |
147 | */ | |
148 | CHARACTER_LITERAL : STRINGPREFIX? SINGLEQUOTE CHAR_CONTENT+ SINGLEQUOTE ; | |
149 | fragment CHAR_CONTENT : (ESCAPE_SEQUENCE | ~(BACKSLASH | SINGLEQUOTE)) ; | |
150 | fragment SINGLEQUOTE : '\''; | |
151 | ||
152 | /* | |
153 | * String literal | |
154 | */ | |
155 | STRING_LITERAL : STRINGPREFIX? DOUBLEQUOTE STRING_CONTENT* DOUBLEQUOTE ; | |
156 | fragment STRING_CONTENT : (ESCAPE_SEQUENCE | ~(BACKSLASH | DOUBLEQUOTE)) ; | |
157 | fragment DOUBLEQUOTE : '"' ; | |
158 | ||
159 | /** | |
160 | * Whitespaces | |
161 | */ | |
e8143d31 | 162 | WS : (' ' | '\r' | '\t' | '\u000C' | '\n') { $channel = HIDDEN; } ; |
866e5b51 FC |
163 | |
164 | /** | |
165 | * Multiline comment | |
91fd06f5 | 166 | */ |
866e5b51 | 167 | // About the greedy option: see page 100-101 of The Definitive ANTLR reference |
e8143d31 | 168 | // COMMENT : '/*' ( options { greedy = false; } : . )* '*/' { $channel = HIDDEN; } ; |
866e5b51 FC |
169 | COMMENT : COMMENT_OPEN .* COMMENT_CLOSE { $channel = HIDDEN; } ; |
170 | fragment COMMENT_OPEN : '/*'; | |
171 | fragment COMMENT_CLOSE : '*/'; | |
172 | ||
173 | /** | |
174 | * Single line comment | |
175 | */ | |
e8143d31 | 176 | LINE_COMMENT : '//' ~('\n')* '\n' { $channel = HIDDEN; } ; |
866e5b51 FC |
177 | |
178 | /** | |
179 | * Identifiers | |
180 | */ | |
181 | IDENTIFIER : NONDIGIT (NONDIGIT | DIGIT)* ; | |
182 | fragment NONDIGIT : ('_') | ('A'..'Z') | ('a'..'z') ; |