dref-expr

This commit is contained in:
Aleksey Kladov 2018-07-31 20:44:54 +03:00
parent ce3462ce8f
commit 599ca1ad89
5 changed files with 45 additions and 0 deletions

View File

@ -129,6 +129,7 @@ Grammar(
"METHOD_CALL_EXPR",
"FIELD_EXPR",
"REF_EXPR",
"DEREF_EXPR",
"STRUCT_LIT",
"STRUCT_LIT_FIELD",

View File

@ -48,6 +48,7 @@ pub(super) fn expr(p: &mut Parser) {
fn prefix_expr(p: &mut Parser) -> Option<CompletedMarker> {
match p.current() {
AMPERSAND => Some(ref_expr(p)),
STAR => Some(deref_expr(p)),
_ => atom_expr(p),
}
}
@ -66,6 +67,18 @@ fn ref_expr(p: &mut Parser) -> CompletedMarker {
m.complete(p, REF_EXPR)
}
// test deref_expr
// fn foo() {
// **&1;
// }
fn deref_expr(p: &mut Parser) -> CompletedMarker {
assert!(p.at(STAR));
let m = p.start();
p.bump();
expr(p);
m.complete(p, DEREF_EXPR)
}
fn atom_expr(p: &mut Parser) -> Option<CompletedMarker> {
match literal(p) {
Some(m) => return Some(m),

View File

@ -120,6 +120,7 @@ pub enum SyntaxKind {
METHOD_CALL_EXPR,
FIELD_EXPR,
REF_EXPR,
DEREF_EXPR,
STRUCT_LIT,
STRUCT_LIT_FIELD,
EXTERN_BLOCK,
@ -279,6 +280,7 @@ impl SyntaxKind {
METHOD_CALL_EXPR => &SyntaxInfo { name: "METHOD_CALL_EXPR" },
FIELD_EXPR => &SyntaxInfo { name: "FIELD_EXPR" },
REF_EXPR => &SyntaxInfo { name: "REF_EXPR" },
DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" },
STRUCT_LIT => &SyntaxInfo { name: "STRUCT_LIT" },
STRUCT_LIT_FIELD => &SyntaxInfo { name: "STRUCT_LIT_FIELD" },
EXTERN_BLOCK => &SyntaxInfo { name: "EXTERN_BLOCK" },

View File

@ -0,0 +1,3 @@
fn foo() {
**&1;
}

View File

@ -0,0 +1,26 @@
FILE@[0; 23)
FN_ITEM@[0; 23)
FN_KW@[0; 2)
NAME@[2; 6)
WHITESPACE@[2; 3)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 9)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK@[9; 23)
L_CURLY@[9; 10)
EXPR_STMT@[10; 21)
DEREF_EXPR@[10; 19)
WHITESPACE@[10; 15)
STAR@[15; 16)
DEREF_EXPR@[16; 19)
STAR@[16; 17)
REF_EXPR@[17; 19)
AMPERSAND@[17; 18)
LITERAL@[18; 19)
INT_NUMBER@[18; 19)
SEMI@[19; 20)
WHITESPACE@[20; 21)
R_CURLY@[21; 22)
WHITESPACE@[22; 23)