1
1
lexer grammar RustLexer;
2
2
3
+ @lexer::members {
4
+ public bool is_at(int pos) {
5
+ return _input.Index == pos;
6
+ }
7
+ }
8
+
9
+
3
10
tokens {
4
- EQ, LT, LE, EQEQ, NE, GE, GT, ANDAND, OROR, NOT, TILDE,
11
+ EQ, LT, LE, EQEQ, NE, GE, GT, ANDAND, OROR, NOT, TILDE, PLUS,
5
12
MINUS, STAR, SLASH, PERCENT, CARET, AND, OR, SHL, SHR, BINOP,
6
- BINOPEQ, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
13
+ BINOPEQ, LARROW, AT, DOT, DOTDOT, DOTDOTDOT, COMMA, SEMI, COLON,
7
14
MOD_SEP, RARROW, FAT_ARROW, LPAREN, RPAREN, LBRACKET, RBRACKET,
8
- LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR,
9
- LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BINARY ,
10
- LIT_BINARY_RAW , IDENT, LIFETIME, WHITESPACE, DOC_COMMENT,
11
- COMMENT, SHEBANG, DOC_BLOCK_COMMENT, BLOCK_COMMENT
15
+ LBRACE, RBRACE, POUND, DOLLAR, UNDERSCORE, LIT_CHAR, LIT_BYTE,
16
+ LIT_INTEGER, LIT_FLOAT, LIT_STR, LIT_STR_RAW, LIT_BYTE_STR ,
17
+ LIT_BYTE_STR_RAW, QUESTION , IDENT, LIFETIME, WHITESPACE, DOC_COMMENT,
18
+ COMMENT, SHEBANG, UTF8_BOM
12
19
}
13
20
14
21
import xidstart , xidcontinue;
@@ -37,6 +44,7 @@ AND : '&' ;
37
44
OR : ' |' ;
38
45
SHL : ' <<' ;
39
46
SHR : ' >>' ;
47
+ LARROW : ' <-' ;
40
48
41
49
BINOP
42
50
: PLUS
49
57
| OR
50
58
| SHL
51
59
| SHR
60
+ | LARROW
52
61
;
53
62
54
63
BINOPEQ : BINOP EQ ;
@@ -107,15 +116,15 @@ LIT_CHAR
107
116
| ~[\\' \n\t\r ]
108
117
| ' \ud800' .. ' \udbff' ' \udc00' .. ' \udfff'
109
118
)
110
- ( ' \' ' SUFFIX ? | ' \n ' | ' \r\n ' | EOF )
119
+ ' \' ' SUFFIX ?
111
120
;
112
121
113
122
LIT_BYTE
114
123
: ' b\' ' ( ' \\ ' ( [xX] HEXIT HEXIT
115
124
| [nrt\\' "0] )
116
125
| ~[\\ ' \n\t\r] ' \udc00 ' ..' \udfff ' ?
117
126
)
118
- ( ' \' ' SUFFIX ? | ' \n ' | ' \r\n ' | EOF )
127
+ ' \' ' SUFFIX ?
119
128
;
120
129
121
130
LIT_INTEGER
@@ -138,21 +147,21 @@ LIT_FLOAT
138
147
;
139
148
140
149
LIT_STR
141
- : ' "' (' \\\n ' | ' \\\r\n ' | ' \\ ' CHAR_ESCAPE | .)*? (' "' SUFFIX ? | ' \n ' | ' \r\n ' | EOF )
150
+ : ' "' (' \\\n ' | ' \\\r\n ' | ' \\ ' CHAR_ESCAPE | .)*? (' "' SUFFIX ? | EOF )
142
151
;
143
152
144
- LIT_BINARY : ' b' LIT_STR ;
145
- LIT_BINARY_RAW : ' b' LIT_STR_RAW ;
153
+ LIT_BYTE_STR : ' b' LIT_STR ;
154
+ LIT_BYTE_STR_RAW : ' b' LIT_STR_RAW ;
146
155
147
156
/* this is a bit messy */
148
157
149
158
fragment LIT_STR_RAW_INNER
150
- : ' "' .*? ' "'
159
+ : ' "' .*? ( ' "' | EOF )
151
160
| LIT_STR_RAW_INNER2
152
161
;
153
162
154
163
fragment LIT_STR_RAW_INNER2
155
- : POUND LIT_STR_RAW_INNER POUND
164
+ : POUND LIT_STR_RAW_INNER ( POUND | EOF )
156
165
;
157
166
158
167
LIT_STR_RAW
@@ -166,7 +175,7 @@ IDENT : XID_Start XID_Continue* ;
166
175
167
176
fragment QUESTION_IDENTIFIER : QUESTION ? IDENT ;
168
177
169
- LIFETIME : ' \' ' IDENT ;
178
+ LIFETIME : ' \' ' IDENT ? ;
170
179
171
180
WHITESPACE : [ \r\n\t]+ ;
172
181
@@ -176,13 +185,13 @@ OUTER_DOC_COMMENT : '//!' ~[\r\n]* -> type(DOC_COMMENT) ;
176
185
LINE_COMMENT : ' //' ( ~[/\n] ~[\n]* )? -> type(COMMENT ) ;
177
186
178
187
DOC_BLOCK_COMMENT
179
- : (' /**' ~[*] | ' /*!' ) (DOC_BLOCK_COMMENT | .)*? (' */' | ' \n ' | ' \r\n ' | EOF ) -> type(DOC_BLOCK_COMMENT )
188
+ : (' /**' ~[*] | ' /*!' ) (DOC_BLOCK_COMMENT | .)*? (' */' | EOF ) -> type(DOC_COMMENT )
180
189
;
181
190
182
- BLOCK_COMMENT : ' /*' (BLOCK_COMMENT | .)*? (' */' | ' \n ' | ' \r\n ' | EOF ) -> type(BLOCK_COMMENT ) ;
191
+ BLOCK_COMMENT : ' /*' (BLOCK_COMMENT | .)*? (' */' | EOF ) -> type(COMMENT ) ;
183
192
184
193
/* these appear at the beginning of a file */
185
194
186
- SHEBANG : ' #!' { isAt (2 ) && _input.La(1 ) != ' [' } ? ~[\r\n]* -> type(SHEBANG ) ;
195
+ SHEBANG : ' #!' { is_at (2 ) && _input.La(1 ) != ' [' } ? ~[\r\n]* -> type(SHEBANG ) ;
187
196
188
- UTF8_BOM : ' \ufeff ' { isAt (1 ) } ? -> skip ;
197
+ UTF8_BOM : ' \ufeff ' { is_at (1 ) } ? -> skip ;
0 commit comments