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)); assert!(p.at(L_CURLY));
fn go(p: &mut Parser, message: Option<&str>) { let m = p.start();
assert!(p.at(L_CURLY)); p.error(message);
let m = p.start(); p.bump();
if let Some(message) = message { expressions::expr_block_contents(p);
p.error(message); p.eat(R_CURLY);
} m.complete(p, ERROR);
p.bump();
while !p.at(EOF) && !p.at(R_CURLY) {
match p.current() {
L_CURLY => go(p, None),
_ => p.bump(),
}
}
p.eat(R_CURLY);
m.complete(p, ERROR);
}
} }

View file

@ -28,29 +28,36 @@ 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_KW@[26; 28) IF_EXPR@[26; 78)
WHITESPACE@[28; 29) IF_KW@[26; 28)
TRUE_KW@[29; 33) WHITESPACE@[28; 29)
WHITESPACE@[33; 34) CONDITION@[29; 33)
ERROR@[34; 51) LITERAL@[29; 33)
L_CURLY@[34; 35) TRUE_KW@[29; 33)
WHITESPACE@[35; 44) WHITESPACE@[33; 34)
INT_NUMBER@[44; 45) "1" BLOCK@[34; 51)
WHITESPACE@[45; 50) L_CURLY@[34; 35)
R_CURLY@[50; 51) WHITESPACE@[35; 44)
WHITESPACE@[51; 52) LITERAL@[44; 45)
ELSE_KW@[52; 56) INT_NUMBER@[44; 45) "1"
WHITESPACE@[56; 57) WHITESPACE@[45; 50)
ERROR@[57; 78) R_CURLY@[50; 51)
L_CURLY@[57; 58) WHITESPACE@[51; 52)
WHITESPACE@[58; 67) ELSE_KW@[52; 56)
INT_NUMBER@[67; 68) "2" WHITESPACE@[56; 57)
WHITESPACE@[68; 69) BLOCK@[57; 78)
PLUS@[69; 70) L_CURLY@[57; 58)
WHITESPACE@[70; 71) WHITESPACE@[58; 67)
INT_NUMBER@[71; 72) "3" BIN_EXPR@[67; 72)
WHITESPACE@[72; 77) LITERAL@[67; 68)
R_CURLY@[77; 78) INT_NUMBER@[67; 68) "2"
WHITESPACE@[68; 69)
PLUS@[69; 70)
WHITESPACE@[70; 71)
LITERAL@[71; 72)
INT_NUMBER@[71; 72) "3"
WHITESPACE@[72; 77)
R_CURLY@[77; 78)
WHITESPACE@[78; 79) WHITESPACE@[78; 79)
R_CURLY@[79; 80) R_CURLY@[79; 80)
WHITESPACE@[80; 82) WHITESPACE@[80; 82)

View file

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

View file

@ -34,22 +34,29 @@ SOURCE_FILE@[0; 349)
ERROR@[42; 93) ERROR@[42; 93)
L_CURLY@[42; 43) L_CURLY@[42; 43)
WHITESPACE@[43; 48) WHITESPACE@[43; 48)
IDENT@[48; 51) "vec" MACRO_CALL@[48; 91)
EXCL@[51; 52) PATH@[48; 51)
L_BRACK@[52; 53) PATH_SEGMENT@[48; 51)
WHITESPACE@[53; 62) NAME_REF@[48; 51)
DOLLAR@[62; 63) IDENT@[48; 51) "vec"
L_PAREN@[63; 64) EXCL@[51; 52)
IDENT@[64; 78) "parse_use_tree" TOKEN_TREE@[52; 91)
L_PAREN@[78; 79) L_BRACK@[52; 53)
DOLLAR@[79; 80) WHITESPACE@[53; 62)
IDENT@[80; 81) "s" DOLLAR@[62; 63)
R_PAREN@[81; 82) TOKEN_TREE@[63; 84)
COMMA@[82; 83) L_PAREN@[63; 64)
R_PAREN@[83; 84) IDENT@[64; 78) "parse_use_tree"
STAR@[84; 85) TOKEN_TREE@[78; 82)
WHITESPACE@[85; 90) L_PAREN@[78; 79)
R_BRACK@[90; 91) DOLLAR@[79; 80)
IDENT@[80; 81) "s"
R_PAREN@[81; 82)
COMMA@[82; 83)
R_PAREN@[83; 84)
STAR@[84; 85)
WHITESPACE@[85; 90)
R_BRACK@[90; 91)
WHITESPACE@[91; 92) WHITESPACE@[91; 92)
R_CURLY@[92; 93) R_CURLY@[92; 93)
WHITESPACE@[93; 95) WHITESPACE@[93; 95)