improve error recovery

parse the contents of error block as an expression
This commit is contained in:
Aleksey Kladov 2019-03-04 14:24:02 +03:00
parent 3000b13df2
commit 77f2381eea
4 changed files with 77 additions and 59 deletions

View file

@ -182,21 +182,11 @@ fn name_ref(p: &mut Parser) {
} }
fn error_block(p: &mut Parser, message: &str) { fn error_block(p: &mut Parser, message: &str) {
go(p, Some(message));
fn go(p: &mut Parser, message: Option<&str>) {
assert!(p.at(L_CURLY)); assert!(p.at(L_CURLY));
let m = p.start(); let m = p.start();
if let Some(message) = message {
p.error(message); p.error(message);
}
p.bump(); p.bump();
while !p.at(EOF) && !p.at(R_CURLY) { expressions::expr_block_contents(p);
match p.current() {
L_CURLY => go(p, None),
_ => p.bump(),
}
}
p.eat(R_CURLY); p.eat(R_CURLY);
m.complete(p, ERROR); m.complete(p, ERROR);
}
} }

View file

@ -28,26 +28,33 @@ SOURCE_FILE@[0; 95)
ERROR@[20; 80) ERROR@[20; 80)
L_CURLY@[20; 21) L_CURLY@[20; 21)
WHITESPACE@[21; 26) WHITESPACE@[21; 26)
IF_EXPR@[26; 78)
IF_KW@[26; 28) IF_KW@[26; 28)
WHITESPACE@[28; 29) WHITESPACE@[28; 29)
CONDITION@[29; 33)
LITERAL@[29; 33)
TRUE_KW@[29; 33) TRUE_KW@[29; 33)
WHITESPACE@[33; 34) WHITESPACE@[33; 34)
ERROR@[34; 51) BLOCK@[34; 51)
L_CURLY@[34; 35) L_CURLY@[34; 35)
WHITESPACE@[35; 44) WHITESPACE@[35; 44)
LITERAL@[44; 45)
INT_NUMBER@[44; 45) "1" INT_NUMBER@[44; 45) "1"
WHITESPACE@[45; 50) WHITESPACE@[45; 50)
R_CURLY@[50; 51) R_CURLY@[50; 51)
WHITESPACE@[51; 52) WHITESPACE@[51; 52)
ELSE_KW@[52; 56) ELSE_KW@[52; 56)
WHITESPACE@[56; 57) WHITESPACE@[56; 57)
ERROR@[57; 78) BLOCK@[57; 78)
L_CURLY@[57; 58) L_CURLY@[57; 58)
WHITESPACE@[58; 67) WHITESPACE@[58; 67)
BIN_EXPR@[67; 72)
LITERAL@[67; 68)
INT_NUMBER@[67; 68) "2" INT_NUMBER@[67; 68) "2"
WHITESPACE@[68; 69) WHITESPACE@[68; 69)
PLUS@[69; 70) PLUS@[69; 70)
WHITESPACE@[70; 71) WHITESPACE@[70; 71)
LITERAL@[71; 72)
INT_NUMBER@[71; 72) "3" INT_NUMBER@[71; 72) "3"
WHITESPACE@[72; 77) WHITESPACE@[72; 77)
R_CURLY@[77; 78) R_CURLY@[77; 78)

View file

@ -28,9 +28,23 @@ SOURCE_FILE@[0; 43)
ERROR@[17; 31) ERROR@[17; 31)
L_CURLY@[17; 18) L_CURLY@[17; 18)
WHITESPACE@[18; 23) WHITESPACE@[18; 23)
EXPR_STMT@[23; 24)
PATH_EXPR@[23; 24)
PATH@[23; 24)
PATH_SEGMENT@[23; 24)
NAME_REF@[23; 24)
IDENT@[23; 24) "f" IDENT@[23; 24) "f"
err: `expected SEMI`
err: `expected expression`
EXPR_STMT@[24; 25)
ERROR@[24; 25)
COLON@[24; 25) COLON@[24; 25)
err: `expected SEMI`
WHITESPACE@[25; 26) WHITESPACE@[25; 26)
PATH_EXPR@[26; 29)
PATH@[26; 29)
PATH_SEGMENT@[26; 29)
NAME_REF@[26; 29)
IDENT@[26; 29) "u32" IDENT@[26; 29) "u32"
WHITESPACE@[29; 30) WHITESPACE@[29; 30)
R_CURLY@[30; 31) R_CURLY@[30; 31)

View file

@ -34,13 +34,20 @@ SOURCE_FILE@[0; 349)
ERROR@[42; 93) ERROR@[42; 93)
L_CURLY@[42; 43) L_CURLY@[42; 43)
WHITESPACE@[43; 48) WHITESPACE@[43; 48)
MACRO_CALL@[48; 91)
PATH@[48; 51)
PATH_SEGMENT@[48; 51)
NAME_REF@[48; 51)
IDENT@[48; 51) "vec" IDENT@[48; 51) "vec"
EXCL@[51; 52) EXCL@[51; 52)
TOKEN_TREE@[52; 91)
L_BRACK@[52; 53) L_BRACK@[52; 53)
WHITESPACE@[53; 62) WHITESPACE@[53; 62)
DOLLAR@[62; 63) DOLLAR@[62; 63)
TOKEN_TREE@[63; 84)
L_PAREN@[63; 64) L_PAREN@[63; 64)
IDENT@[64; 78) "parse_use_tree" IDENT@[64; 78) "parse_use_tree"
TOKEN_TREE@[78; 82)
L_PAREN@[78; 79) L_PAREN@[78; 79)
DOLLAR@[79; 80) DOLLAR@[79; 80)
IDENT@[80; 81) "s" IDENT@[80; 81) "s"