Skip to content

Commit e436eae

Browse files
committed
feat: better error recovery
1 parent 3cb6827 commit e436eae

File tree

5 files changed

+5414
-4915
lines changed

5 files changed

+5414
-4915
lines changed

corpus/main.txt

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,3 +455,51 @@ $enDIF
455455
(variable_setting
456456
(number_variable)
457457
(number_value)))))
458+
459+
================================================================================
460+
fail fast
461+
================================================================================
462+
463+
set editing-mode ema
464+
set input-meta on
465+
$If bell-style == visib
466+
$if Bash
467+
set keyseq-timeout 69
468+
$else
469+
set keyseq-timeout 129
470+
$endif
471+
$ELSE
472+
set KEYSEQ-TIMEOUT 56
473+
$enDIF
474+
475+
--------------------------------------------------------------------------------
476+
477+
(source
478+
(variable_setting
479+
(edit_mode_variable)
480+
(edit_mode_value
481+
(ERROR)))
482+
(variable_setting
483+
(bool_variable)
484+
(bool_value))
485+
(conditional_construct
486+
(test
487+
(bell_variable)
488+
(bell_value
489+
(ERROR)))
490+
(consequence
491+
(conditional_construct
492+
(test
493+
(application_name))
494+
(consequence
495+
(variable_setting
496+
(number_variable)
497+
(number_value)))
498+
(alternative
499+
(variable_setting
500+
(number_variable)
501+
(number_value)))))
502+
(alternative
503+
(variable_setting
504+
(number_variable)
505+
(number_value)))))

grammar.js

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ const NEWLINE = /\r?\n/;
22
const WHITE_SPACE = /[ \t\f\v]/;
33
const ANYTHING = /[^\r\n]+/;
44
const ANYTHING_STARTING_NON_WHITESPACE = /\S[^\r\n]*/;
5+
const ERROR_ALIAS = ($) =>
6+
alias(token(prec(-1, ANYTHING_STARTING_NON_WHITESPACE)), $.ERROR);
57

68
module.exports = grammar({
79
name: 'readline',
@@ -212,13 +214,16 @@ module.exports = grammar({
212214
),
213215
),
214216

215-
bool_value: ($) => choice('1', /on/i, /off/i),
216-
bell_value: ($) => choice(/none/i, /visible/i, /audible/i),
217+
bool_value: ($) => choice('1', /on/i, /off/i, ERROR_ALIAS($)),
218+
bell_value: ($) => choice(/none/i, /visible/i, /audible/i, ERROR_ALIAS($)),
217219
string_value: ($) => ANYTHING_STARTING_NON_WHITESPACE,
218-
number_value: ($) => /[-+]?\d+/,
219-
edit_mode_value: ($) => choice(/emacs/i, /vi/i),
220+
number_value: ($) => choice(/[-+]?\d+/, ERROR_ALIAS($)),
221+
edit_mode_value: ($) => choice(/emacs/i, /vi/i, ERROR_ALIAS($)),
220222
keymap_value: ($) =>
221-
/(emacs(-standard|-meta|-ctlx)?|vi(-move|-command|-insert)?)/i,
223+
choice(
224+
/(emacs(-standard|-meta|-ctlx)?|vi(-move|-command|-insert)?)/i,
225+
ERROR_ALIAS($),
226+
),
222227

223228
bool_variable: ($) =>
224229
choice(

src/grammar.json

Lines changed: 95 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1088,6 +1088,22 @@
10881088
"type": "PATTERN",
10891089
"value": "off",
10901090
"flags": "i"
1091+
},
1092+
{
1093+
"type": "ALIAS",
1094+
"content": {
1095+
"type": "TOKEN",
1096+
"content": {
1097+
"type": "PREC",
1098+
"value": -1,
1099+
"content": {
1100+
"type": "PATTERN",
1101+
"value": "\\S[^\\r\\n]*"
1102+
}
1103+
}
1104+
},
1105+
"named": true,
1106+
"value": "ERROR"
10911107
}
10921108
]
10931109
},
@@ -1108,6 +1124,22 @@
11081124
"type": "PATTERN",
11091125
"value": "audible",
11101126
"flags": "i"
1127+
},
1128+
{
1129+
"type": "ALIAS",
1130+
"content": {
1131+
"type": "TOKEN",
1132+
"content": {
1133+
"type": "PREC",
1134+
"value": -1,
1135+
"content": {
1136+
"type": "PATTERN",
1137+
"value": "\\S[^\\r\\n]*"
1138+
}
1139+
}
1140+
},
1141+
"named": true,
1142+
"value": "ERROR"
11111143
}
11121144
]
11131145
},
@@ -1116,8 +1148,29 @@
11161148
"value": "\\S[^\\r\\n]*"
11171149
},
11181150
"number_value": {
1119-
"type": "PATTERN",
1120-
"value": "[-+]?\\d+"
1151+
"type": "CHOICE",
1152+
"members": [
1153+
{
1154+
"type": "PATTERN",
1155+
"value": "[-+]?\\d+"
1156+
},
1157+
{
1158+
"type": "ALIAS",
1159+
"content": {
1160+
"type": "TOKEN",
1161+
"content": {
1162+
"type": "PREC",
1163+
"value": -1,
1164+
"content": {
1165+
"type": "PATTERN",
1166+
"value": "\\S[^\\r\\n]*"
1167+
}
1168+
}
1169+
},
1170+
"named": true,
1171+
"value": "ERROR"
1172+
}
1173+
]
11211174
},
11221175
"edit_mode_value": {
11231176
"type": "CHOICE",
@@ -1131,13 +1184,50 @@
11311184
"type": "PATTERN",
11321185
"value": "vi",
11331186
"flags": "i"
1187+
},
1188+
{
1189+
"type": "ALIAS",
1190+
"content": {
1191+
"type": "TOKEN",
1192+
"content": {
1193+
"type": "PREC",
1194+
"value": -1,
1195+
"content": {
1196+
"type": "PATTERN",
1197+
"value": "\\S[^\\r\\n]*"
1198+
}
1199+
}
1200+
},
1201+
"named": true,
1202+
"value": "ERROR"
11341203
}
11351204
]
11361205
},
11371206
"keymap_value": {
1138-
"type": "PATTERN",
1139-
"value": "(emacs(-standard|-meta|-ctlx)?|vi(-move|-command|-insert)?)",
1140-
"flags": "i"
1207+
"type": "CHOICE",
1208+
"members": [
1209+
{
1210+
"type": "PATTERN",
1211+
"value": "(emacs(-standard|-meta|-ctlx)?|vi(-move|-command|-insert)?)",
1212+
"flags": "i"
1213+
},
1214+
{
1215+
"type": "ALIAS",
1216+
"content": {
1217+
"type": "TOKEN",
1218+
"content": {
1219+
"type": "PREC",
1220+
"value": -1,
1221+
"content": {
1222+
"type": "PATTERN",
1223+
"value": "\\S[^\\r\\n]*"
1224+
}
1225+
}
1226+
},
1227+
"named": true,
1228+
"value": "ERROR"
1229+
}
1230+
]
11411231
},
11421232
"bool_variable": {
11431233
"type": "CHOICE",

src/node-types.json

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,12 +33,32 @@
3333
{
3434
"type": "bell_value",
3535
"named": true,
36-
"fields": {}
36+
"fields": {},
37+
"children": {
38+
"multiple": false,
39+
"required": false,
40+
"types": [
41+
{
42+
"type": "ERROR",
43+
"named": true
44+
}
45+
]
46+
}
3747
},
3848
{
3949
"type": "bool_value",
4050
"named": true,
41-
"fields": {}
51+
"fields": {},
52+
"children": {
53+
"multiple": false,
54+
"required": false,
55+
"types": [
56+
{
57+
"type": "ERROR",
58+
"named": true
59+
}
60+
]
61+
}
4262
},
4363
{
4464
"type": "bool_variable",
@@ -107,7 +127,17 @@
107127
{
108128
"type": "edit_mode_value",
109129
"named": true,
110-
"fields": {}
130+
"fields": {},
131+
"children": {
132+
"multiple": false,
133+
"required": false,
134+
"types": [
135+
{
136+
"type": "ERROR",
137+
"named": true
138+
}
139+
]
140+
}
111141
},
112142
{
113143
"type": "include_directive",
@@ -151,6 +181,21 @@
151181
]
152182
}
153183
},
184+
{
185+
"type": "keymap_value",
186+
"named": true,
187+
"fields": {},
188+
"children": {
189+
"multiple": false,
190+
"required": false,
191+
"types": [
192+
{
193+
"type": "ERROR",
194+
"named": true
195+
}
196+
]
197+
}
198+
},
154199
{
155200
"type": "keyname",
156201
"named": true,
@@ -200,6 +245,21 @@
200245
]
201246
}
202247
},
248+
{
249+
"type": "number_value",
250+
"named": true,
251+
"fields": {},
252+
"children": {
253+
"multiple": false,
254+
"required": false,
255+
"types": [
256+
{
257+
"type": "ERROR",
258+
"named": true
259+
}
260+
]
261+
}
262+
},
203263
{
204264
"type": "number_variable",
205265
"named": true,
@@ -441,6 +501,10 @@
441501
"type": ">=",
442502
"named": false
443503
},
504+
{
505+
"type": "ERROR",
506+
"named": true
507+
},
444508
{
445509
"type": "application_name",
446510
"named": true
@@ -469,10 +533,6 @@
469533
"type": "key_literal",
470534
"named": true
471535
},
472-
{
473-
"type": "keymap_value",
474-
"named": true
475-
},
476536
{
477537
"type": "keymap_variable",
478538
"named": true
@@ -481,10 +541,6 @@
481541
"type": "mode",
482542
"named": false
483543
},
484-
{
485-
"type": "number_value",
486-
"named": true
487-
},
488544
{
489545
"type": "set",
490546
"named": false

0 commit comments

Comments
 (0)