1
- function kw ( keyword ) {
2
- return alias ( caseInsensitiveRe ( keyword ) , keyword ) ;
1
+ function kw ( keyword , name ) {
2
+ return alias ( caseInsensitiveRe ( keyword ) , name || keyword ) ;
3
3
}
4
4
5
5
function kws ( keywords ) {
6
- return choice ( ...keywords . split ( " " ) . map ( kw ) ) ;
6
+ return choice ( ...keywords . split ( " " ) . map ( ( w ) => kw ( w ) ) ) ;
7
7
}
8
8
9
9
function caseInsensitiveRe ( word ) {
@@ -24,34 +24,51 @@ function caseInsensitiveRe(word) {
24
24
}
25
25
26
26
function controlCommentWithArg ( keyword , arg ) {
27
- return seq ( "(" , kw ( keyword ) , "," , field ( "arg" , alias ( / [ ^ ) ] * / , arg ) ) , ")" ) ;
27
+ return seq (
28
+ "(" ,
29
+ field ( "control" , kw ( keyword ) ) ,
30
+ "," ,
31
+ field ( "arg" , alias ( / [ ^ ) ] * / , arg ) ) ,
32
+ ")"
33
+ ) ;
28
34
}
29
35
30
36
function controlComment ( keyword ) {
31
- return seq ( "(" , kw ( keyword ) , ")" ) ;
37
+ return seq (
38
+ "(" ,
39
+ field ( "control" , kw ( keyword ) ) ,
40
+ ")"
41
+ ) ;
32
42
}
33
43
34
44
function controlCommentWithMessage ( $ , keyword ) {
35
- return seq ( "(" , kw ( keyword ) , "," , optional ( $ . _comment_parameters ) , ")" ) ;
45
+ return seq (
46
+ "(" ,
47
+ field ( "control" , kw ( keyword ) ) ,
48
+ "," ,
49
+ optional ( $ . _comment_parameters ) ,
50
+ ")"
51
+ ) ;
36
52
}
37
53
38
- const DECIMAL_RE = / [ - + ] ? ( \d + ( [ . ] \d + ) ? | [ . ] \d + ) / ;
54
+ const NONNEGATIVE_DECIMAL_RE = / ( [ . ] \d + | \d + ( [ . ] \d + ) ? ) / ;
39
55
40
56
function valueWords ( $ , letters ) {
41
57
return choice (
42
58
...letters . split ( "" ) . map ( letter =>
43
59
alias (
44
- seq ( kw ( letter ) , $ . _value ) ,
45
- $ [ letter . toLowerCase ( ) ]
60
+ // "E" seems to have some special meaning to treesitter, so avoid using it
61
+ seq ( field ( "word" , kw ( letter , `letter_${ letter } ` ) ) , $ . _value ) ,
62
+ $ . value_word
46
63
)
47
64
)
48
65
) ;
49
66
}
50
67
51
68
function valueWord ( $ , tok , name ) {
52
69
return alias (
53
- seq ( alias ( tok , tok ) , $ . _value ) ,
54
- $ [ name ]
70
+ seq ( field ( "word" , alias ( tok , tok ) ) , $ . _value ) ,
71
+ $ . value_word
55
72
)
56
73
}
57
74
@@ -106,7 +123,7 @@ module.exports = grammar({
106
123
) ,
107
124
108
125
_wordish : $ => choice (
109
- valueWords ( $ , "ABCDEFHIJKULPQRSTVWXYZ " ) ,
126
+ valueWords ( $ , "ABCDEFHIJKLPQRSTUVWXYZ " ) ,
110
127
valueWord ( $ , "$" , "spindle" ) ,
111
128
$ . polar_distance ,
112
129
$ . polar_angle ,
@@ -119,7 +136,11 @@ module.exports = grammar({
119
136
120
137
polar_distance : $ => seq ( "@" , $ . _value ) ,
121
138
polar_angle : $ => seq ( "^" , $ . _value ) ,
122
- assignment : $ => seq ( $ . _parameter , "=" , $ . _value ) ,
139
+ assignment : $ => seq (
140
+ field ( "left" , $ . _parameter ) ,
141
+ "=" ,
142
+ field ( "right" , $ . _value )
143
+ ) ,
123
144
124
145
g : $ => choice (
125
146
kws ( "G0 G1 G2 G3 G4 G5 G5.1 G5.2 G5.3 G7 G8 G10 G17 G17.1 G18 G18.1 G19 G19.1 G20 G21" ) ,
@@ -221,49 +242,54 @@ module.exports = grammar({
221
242
"continue" : $ => oLine ( $ , kw ( "continue" ) ) ,
222
243
223
244
_value : $ => choice (
224
- $ . literal ,
225
- $ . _parameter ,
226
- $ . expression
245
+ prec ( 8 , $ . _sign ) ,
246
+ prec ( 8 , $ . expression ) ,
247
+ prec ( 7 , $ . literal ) ,
248
+ prec ( 7 , $ . _parameter ) ,
227
249
// LinuxCNC docs claim a bare function can be used here but that seems a tad too spooky,
228
250
// so skip on it for now
229
251
) ,
230
252
231
253
expression : $ => seq ( "[" , $ . _expr , "]" ) ,
232
254
233
255
_expr : $ => choice (
234
- prec ( 7 , $ . _parameter ) ,
235
- prec ( 7 , $ . literal ) ,
256
+ $ . _value ,
236
257
$ . atan_call_expr ,
237
258
$ . func_call_expr ,
238
259
$ . binary_expr ,
239
260
) ,
240
261
241
- _parameter : $ => choice (
242
- seq ( "#<" , choice (
243
- alias ( / _ [ ^ > ] + / , $ . named_global_parameter ) ,
244
- alias ( / [ ^ _ > ] [ ^ > ] * / , $ . named_local_parameter ) ,
245
- ) , ">" ) ,
246
- alias ( / # \d + / , $ . numbered_parameter ) ,
262
+ _parameter : $ => seq (
263
+ "#" ,
264
+ choice (
265
+ seq ( "<" , choice (
266
+ alias ( / _ [ ^ > ] + / , $ . named_global_parameter ) ,
267
+ alias ( / [ ^ _ > ] [ ^ > ] * / , $ . named_local_parameter ) ,
268
+ ) , ">" ) ,
269
+ alias ( / \d + / , $ . numbered_parameter )
270
+ )
247
271
) ,
248
272
249
- literal : $ => DECIMAL_RE ,
273
+ _sign : $ => seq ( alias ( / [ + - ] / , "sign" ) , $ . _value ) ,
274
+
275
+ literal : $ => NONNEGATIVE_DECIMAL_RE ,
250
276
251
277
binary_expr : $ => {
252
278
function kwop ( keyword ) {
253
- return alias ( caseInsensitiveRe ( keyword ) , $ [ keyword ] ) ;
279
+ return alias ( caseInsensitiveRe ( keyword ) , keyword ) ;
254
280
}
255
281
256
282
function kwops ( keywords , prec ) {
257
283
return keywords . split ( " " ) . map ( ( s ) => [ kwop ( s ) , prec ] ) ;
258
284
}
259
285
260
286
const table = [
261
- [ alias ( "**" , $ . pow ) , 6 ] ,
262
- [ alias ( "*" , $ . mul ) , 5 ] ,
263
- [ alias ( "/" , $ . div ) , 5 ] ,
287
+ [ alias ( "**" , "**" ) , 6 ] ,
288
+ [ alias ( "*" , "*" ) , 5 ] ,
289
+ [ alias ( "/" , "/" ) , 5 ] ,
264
290
[ kwop ( "mod" ) , 5 ] ,
265
- [ alias ( "+" , $ . add ) , 4 ] ,
266
- [ alias ( "-" , $ . sub ) , 4 ] ,
291
+ [ alias ( "+" , "+" ) , 4 ] ,
292
+ [ alias ( "-" , "-" ) , 4 ] ,
267
293
...kwops ( "eq ne gt ge lt le" , 3 ) ,
268
294
...kwops ( "and or xor" , 2 )
269
295
] ;
@@ -290,27 +316,31 @@ module.exports = grammar({
290
316
) ,
291
317
292
318
_comment : $ => choice (
293
- $ . msg ,
294
- $ . probeopen ,
295
- $ . probeclose ,
296
- $ . logopen ,
297
- $ . logappend ,
298
- $ . logclose ,
299
- $ . log ,
300
- $ . debug ,
301
- $ . print ,
319
+ $ . control_comment ,
302
320
prec ( - 1 , $ . comment ) ,
303
321
) ,
304
322
305
- probeopen : $ => controlCommentWithArg ( "probeopen" , $ . filename ) ,
306
- probeclose : $ => controlComment ( "probeclose" ) ,
307
- logopen : $ => controlCommentWithArg ( "logopen" , $ . filename ) ,
308
- logappend : $ => controlCommentWithArg ( "logappend" , $ . filename ) ,
309
- logclose : $ => controlComment ( "logclose" ) ,
310
- msg : $ => controlCommentWithMessage ( $ , "msg" ) ,
311
- log : $ => controlCommentWithMessage ( $ , "log" ) ,
312
- debug : $ => controlCommentWithMessage ( $ , "debug" ) ,
313
- print : $ => controlCommentWithMessage ( $ , "print" ) ,
323
+ control_comment : $ => choice (
324
+ $ . _msg ,
325
+ $ . _probeopen ,
326
+ $ . _probeclose ,
327
+ $ . _logopen ,
328
+ $ . _logappend ,
329
+ $ . _logclose ,
330
+ $ . _log ,
331
+ $ . _debug ,
332
+ $ . _print ,
333
+ ) ,
334
+
335
+ _probeopen : $ => controlCommentWithArg ( "probeopen" , $ . filename ) ,
336
+ _probeclose : $ => controlComment ( "probeclose" ) ,
337
+ _logopen : $ => controlCommentWithArg ( "logopen" , $ . filename ) ,
338
+ _logappend : $ => controlCommentWithArg ( "logappend" , $ . filename ) ,
339
+ _logclose : $ => controlComment ( "logclose" ) ,
340
+ _msg : $ => controlCommentWithMessage ( $ , "msg" ) ,
341
+ _log : $ => controlCommentWithMessage ( $ , "log" ) ,
342
+ _debug : $ => controlCommentWithMessage ( $ , "debug" ) ,
343
+ _print : $ => controlCommentWithMessage ( $ , "print" ) ,
314
344
315
345
comment : $ => choice (
316
346
seq ( "(" , token ( prec ( - 1 , / [ ^ ) ] * / ) ) , ")" ) ,
@@ -320,7 +350,7 @@ module.exports = grammar({
320
350
_comment_parameters : $ => repeat1 (
321
351
choice (
322
352
$ . _parameter ,
323
- / [ ^ ) # ] + / ,
353
+ alias ( / [ ^ ) # ] + / , "text" ) ,
324
354
) ,
325
355
) ,
326
356
}
0 commit comments