1
- // https://github.com/Azganoth/tree-sitter-lua/blob/master/src/scanner.cc
2
- // https://github.com/MunifTanjim/tree-sitter-lua/
3
- // Modified version from here.
4
- // Thanks to Azganoth and then MunifTanjim
5
-
1
+ #include "parser.h"
6
2
#include <wctype.h>
7
3
#include <stdio.h>
8
- #include "parser.h"
9
4
10
5
enum TokenType {
11
6
BLOCK_COMMENT_START ,
@@ -47,32 +42,25 @@ static inline void skip_whitespaces(TSLexer *lexer) {
47
42
void * tree_sitter_lua_external_scanner_create () { return NULL ; }
48
43
void tree_sitter_lua_external_scanner_destroy (void * payload ) {}
49
44
50
- enum InsideNode { INSIDE_NONE , INSIDE_COMMENT , INSIDE_STRING };
51
-
52
- uint8_t inside_node = INSIDE_NONE ;
53
45
char ending_char = 0 ;
54
46
uint8_t level_count = 0 ;
55
47
56
48
static inline void reset_state () {
57
- inside_node = INSIDE_NONE ;
58
49
ending_char = 0 ;
59
50
level_count = 0 ;
60
51
}
61
52
62
53
unsigned tree_sitter_lua_external_scanner_serialize (void * payload , char * buffer ) {
63
- buffer [0 ] = inside_node ;
64
- buffer [1 ] = ending_char ;
65
- buffer [2 ] = level_count ;
66
- return 3 ;
54
+ buffer [0 ] = ending_char ;
55
+ buffer [1 ] = level_count ;
56
+ return 2 ;
67
57
}
68
58
69
59
void tree_sitter_lua_external_scanner_deserialize (void * payload , const char * buffer , unsigned length ) {
70
60
if (length == 0 ) return ;
71
- inside_node = buffer [0 ];
61
+ ending_char = buffer [0 ];
72
62
if (length == 1 ) return ;
73
- ending_char = buffer [1 ];
74
- if (length == 2 ) return ;
75
- level_count = buffer [2 ];
63
+ level_count = buffer [1 ];
76
64
}
77
65
78
66
static bool scan_block_start (TSLexer * lexer ) {
@@ -122,7 +110,6 @@ static bool scan_comment_start(TSLexer *lexer) {
122
110
123
111
if (scan_block_start (lexer )) {
124
112
lexer -> mark_end (lexer );
125
- inside_node = INSIDE_COMMENT ;
126
113
lexer -> result_symbol = BLOCK_COMMENT_START ;
127
114
return true;
128
115
}
@@ -156,14 +143,12 @@ static bool scan_comment_content(TSLexer *lexer) {
156
143
157
144
static bool scan_string_start (TSLexer * lexer ) {
158
145
if (lexer -> lookahead == '"' || lexer -> lookahead == '\'' ) {
159
- inside_node = INSIDE_STRING ;
160
146
ending_char = lexer -> lookahead ;
161
147
consume (lexer );
162
148
return true;
163
149
}
164
150
165
151
if (scan_block_start (lexer )) {
166
- inside_node = INSIDE_STRING ;
167
152
return true;
168
153
}
169
154
@@ -188,7 +173,12 @@ static bool scan_string_content(TSLexer *lexer) {
188
173
}
189
174
190
175
while (lexer -> lookahead != '\n' && lexer -> lookahead != 0 && lexer -> lookahead != ending_char ) {
191
- while (consume_char ('\\' , lexer ) && consume_char ('z' , lexer )) continue ;
176
+ if (consume_char ('\\' , lexer ) && consume_char ('z' , lexer )) {
177
+ while (iswspace (lexer -> lookahead )) {
178
+ consume (lexer );
179
+ }
180
+ continue ;
181
+ };
192
182
193
183
if (lexer -> lookahead == 0 ) {
194
184
return true;
@@ -201,33 +191,25 @@ static bool scan_string_content(TSLexer *lexer) {
201
191
}
202
192
203
193
bool tree_sitter_lua_external_scanner_scan (void * payload , TSLexer * lexer , const bool * valid_symbols ) {
204
- if (inside_node == INSIDE_STRING ) {
205
- if (valid_symbols [STRING_END ] && scan_string_end (lexer )) {
206
- reset_state ();
207
- lexer -> result_symbol = STRING_END ;
208
- return true;
209
- }
210
-
211
- if (valid_symbols [STRING_CONTENT ] && scan_string_content (lexer )) {
212
- lexer -> result_symbol = STRING_CONTENT ;
213
- return true;
214
- }
215
-
216
- return false;
194
+ if (valid_symbols [STRING_END ] && scan_string_end (lexer )) {
195
+ reset_state ();
196
+ lexer -> result_symbol = STRING_END ;
197
+ return true;
217
198
}
218
199
219
- if (inside_node == INSIDE_COMMENT ) {
220
- if (valid_symbols [BLOCK_COMMENT_END ] && ending_char == 0 && scan_block_end (lexer )) {
221
- reset_state ();
222
- lexer -> result_symbol = BLOCK_COMMENT_END ;
223
- return true;
224
- }
200
+ if (valid_symbols [STRING_CONTENT ] && scan_string_content (lexer )) {
201
+ lexer -> result_symbol = STRING_CONTENT ;
202
+ return true;
203
+ }
225
204
226
- if (valid_symbols [BLOCK_COMMENT_CONTENT ] && scan_comment_content (lexer )) {
227
- return true;
228
- }
205
+ if (valid_symbols [BLOCK_COMMENT_END ] && ending_char == 0 && scan_block_end (lexer )) {
206
+ reset_state ();
207
+ lexer -> result_symbol = BLOCK_COMMENT_END ;
208
+ return true;
209
+ }
229
210
230
- return false;
211
+ if (valid_symbols [BLOCK_COMMENT_CONTENT ] && scan_comment_content (lexer )) {
212
+ return true;
231
213
}
232
214
233
215
skip_whitespaces (lexer );
0 commit comments