Parse enums

This commit is contained in:
Aleksey Kladov 2018-01-28 22:59:18 +03:00
parent ab81e4c7b4
commit b7c141e0b5
7 changed files with 194 additions and 1 deletions

View file

@ -74,6 +74,8 @@ Grammar(
nodes: [ nodes: [
"FILE", "FILE",
"STRUCT_ITEM", "STRUCT_ITEM",
"ENUM_ITEM",
"ENUM_VARIANT",
"NAMED_FIELD", "NAMED_FIELD",
"POS_FIELD", "POS_FIELD",
"FN_ITEM", "FN_ITEM",

View file

@ -12,3 +12,9 @@ pub(super) fn literal(p: &mut Parser) -> bool {
_ => false, _ => false,
} }
} }
pub(super) fn expr(p: &mut Parser) {
if !literal(p) {
p.error().message("expected expression").emit();
}
}

View file

@ -10,7 +10,7 @@ pub(super) fn mod_contents(p: &mut Parser, stop_on_r_curly: bool) {
} }
pub(super) const ITEM_FIRST: TokenSet = pub(super) const ITEM_FIRST: TokenSet =
token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, FN_KW, PUB_KW, POUND,]; token_set![EXTERN_KW, MOD_KW, USE_KW, STRUCT_KW, ENUM_KW, FN_KW, PUB_KW, POUND];
fn item(p: &mut Parser) { fn item(p: &mut Parser) {
let item = p.start(); let item = p.start();
@ -34,6 +34,10 @@ fn item(p: &mut Parser) {
structs::struct_item(p); structs::struct_item(p);
STRUCT_ITEM STRUCT_ITEM
} }
ENUM_KW => {
structs::enum_item(p);
ENUM_ITEM
}
FN_KW => { FN_KW => {
fn_item(p); fn_item(p);
FN_ITEM FN_ITEM

View file

@ -40,6 +40,40 @@ pub(super) fn struct_item(p: &mut Parser) {
} }
} }
pub(super) fn enum_item(p: &mut Parser) {
assert!(p.at(ENUM_KW));
p.bump();
p.expect(IDENT);
type_param_list(p);
where_clause(p);
if p.expect(L_CURLY) {
while !p.at(EOF) && !p.at(R_CURLY) {
let var = p.start();
attributes::outer_attributes(p);
if p.at(IDENT) {
p.bump();
match p.current() {
L_CURLY => named_fields(p),
L_PAREN => pos_fields(p),
EQ => {
p.bump();
expressions::expr(p);
}
_ => ()
}
var.complete(p, ENUM_VARIANT);
} else {
var.abandon(p);
p.err_and_bump("expected enum variant");
}
if !p.at(R_CURLY) {
p.expect(COMMA);
}
}
p.expect(R_CURLY);
}
}
fn named_fields(p: &mut Parser) { fn named_fields(p: &mut Parser) {
assert!(p.at(L_CURLY)); assert!(p.at(L_CURLY));
p.bump(); p.bump();

View file

@ -76,6 +76,8 @@ pub enum SyntaxKind {
SHEBANG, SHEBANG,
FILE, FILE,
STRUCT_ITEM, STRUCT_ITEM,
ENUM_ITEM,
ENUM_VARIANT,
NAMED_FIELD, NAMED_FIELD,
POS_FIELD, POS_FIELD,
FN_ITEM, FN_ITEM,
@ -176,6 +178,8 @@ impl SyntaxKind {
SHEBANG => &SyntaxInfo { name: "SHEBANG" }, SHEBANG => &SyntaxInfo { name: "SHEBANG" },
FILE => &SyntaxInfo { name: "FILE" }, FILE => &SyntaxInfo { name: "FILE" },
STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" }, STRUCT_ITEM => &SyntaxInfo { name: "STRUCT_ITEM" },
ENUM_ITEM => &SyntaxInfo { name: "ENUM_ITEM" },
ENUM_VARIANT => &SyntaxInfo { name: "ENUM_VARIANT" },
NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" }, NAMED_FIELD => &SyntaxInfo { name: "NAMED_FIELD" },
POS_FIELD => &SyntaxInfo { name: "POS_FIELD" }, POS_FIELD => &SyntaxInfo { name: "POS_FIELD" },
FN_ITEM => &SyntaxInfo { name: "FN_ITEM" }, FN_ITEM => &SyntaxInfo { name: "FN_ITEM" },

View file

@ -0,0 +1,25 @@
enum E1 {
}
enum E2<T> {
}
enum E3 {
X
}
enum E4 {
X,
}
enum E5 {
A,
B = 92,
C {
a: u32,
pub b: f64,
},
F {},
D(u32,),
E(),
}

View file

@ -0,0 +1,118 @@
FILE@[0; 182)
ENUM_ITEM@[0; 13)
ENUM_KW@[0; 4)
WHITESPACE@[4; 5)
IDENT@[5; 7)
WHITESPACE@[7; 8)
L_CURLY@[8; 9)
WHITESPACE@[9; 10)
R_CURLY@[10; 11)
WHITESPACE@[11; 13)
ENUM_ITEM@[13; 29)
ENUM_KW@[13; 17)
WHITESPACE@[17; 18)
IDENT@[18; 20)
TYPE_PARAM_LIST@[20; 24)
L_ANGLE@[20; 21)
TYPE_PARAM@[21; 22)
IDENT@[21; 22)
R_ANGLE@[22; 23)
WHITESPACE@[23; 24)
L_CURLY@[24; 25)
WHITESPACE@[25; 26)
R_CURLY@[26; 27)
WHITESPACE@[27; 29)
ENUM_ITEM@[29; 48)
ENUM_KW@[29; 33)
WHITESPACE@[33; 34)
IDENT@[34; 36)
WHITESPACE@[36; 37)
L_CURLY@[37; 38)
ENUM_VARIANT@[38; 45)
WHITESPACE@[38; 43)
IDENT@[43; 44)
WHITESPACE@[44; 45)
R_CURLY@[45; 46)
WHITESPACE@[46; 48)
ENUM_ITEM@[48; 68)
ENUM_KW@[48; 52)
WHITESPACE@[52; 53)
IDENT@[53; 55)
WHITESPACE@[55; 56)
L_CURLY@[56; 57)
ENUM_VARIANT@[57; 63)
WHITESPACE@[57; 62)
IDENT@[62; 63)
COMMA@[63; 64)
WHITESPACE@[64; 65)
R_CURLY@[65; 66)
WHITESPACE@[66; 68)
ENUM_ITEM@[68; 182)
ENUM_KW@[68; 72)
WHITESPACE@[72; 73)
IDENT@[73; 75)
WHITESPACE@[75; 76)
L_CURLY@[76; 77)
ENUM_VARIANT@[77; 83)
WHITESPACE@[77; 82)
IDENT@[82; 83)
COMMA@[83; 84)
ENUM_VARIANT@[84; 95)
WHITESPACE@[84; 89)
IDENT@[89; 90)
WHITESPACE@[90; 91)
EQ@[91; 92)
LITERAL@[92; 95)
WHITESPACE@[92; 93)
INT_NUMBER@[93; 95)
COMMA@[95; 96)
ENUM_VARIANT@[96; 146)
WHITESPACE@[96; 101)
IDENT@[101; 102)
WHITESPACE@[102; 103)
L_CURLY@[103; 104)
NAMED_FIELD@[104; 119)
WHITESPACE@[104; 113)
IDENT@[113; 114)
COLON@[114; 115)
WHITESPACE@[115; 116)
IDENT@[116; 119)
COMMA@[119; 120)
NAMED_FIELD@[120; 139)
VISIBILITY@[120; 133)
WHITESPACE@[120; 129)
PUB_KW@[129; 132)
WHITESPACE@[132; 133)
IDENT@[133; 134)
COLON@[134; 135)
WHITESPACE@[135; 136)
IDENT@[136; 139)
COMMA@[139; 140)
WHITESPACE@[140; 145)
R_CURLY@[145; 146)
COMMA@[146; 147)
ENUM_VARIANT@[147; 156)
WHITESPACE@[147; 152)
IDENT@[152; 153)
WHITESPACE@[153; 154)
L_CURLY@[154; 155)
R_CURLY@[155; 156)
COMMA@[156; 157)
ENUM_VARIANT@[157; 169)
WHITESPACE@[157; 162)
IDENT@[162; 163)
L_PAREN@[163; 164)
POS_FIELD@[164; 167)
IDENT@[164; 167)
COMMA@[167; 168)
R_PAREN@[168; 169)
COMMA@[169; 170)
ENUM_VARIANT@[170; 178)
WHITESPACE@[170; 175)
IDENT@[175; 176)
L_PAREN@[176; 177)
R_PAREN@[177; 178)
COMMA@[178; 179)
WHITESPACE@[179; 180)
R_CURLY@[180; 181)
WHITESPACE@[181; 182)