full precedence

This commit is contained in:
Aleksey Kladov 2018-08-07 14:24:03 +03:00
parent 498098a5d9
commit 8908e51aea
18 changed files with 358 additions and 346 deletions

View file

@ -43,6 +43,10 @@ Grammar(
["-=", "MINUSEQ"],
["&&", "AMPAMP"],
["||", "PIPEPIPE"],
["<<", "SHL"],
[">>", "SHR"],
["<<=", "SHLEQ"],
[">>=", "SHREQ"],
],
keywords: [
"use",
@ -168,6 +172,7 @@ Grammar(
"REF_EXPR",
"DEREF_EXPR",
"NOT_EXPR",
"NEG_EXPR",
"RANGE_EXPR", // just weird
"BIN_EXPR",

View file

@ -3,7 +3,7 @@ mod atom;
use super::*;
pub(super) use self::atom::literal;
const EXPR_FIRST: TokenSet = UNARY_EXPR_FIRST;
const EXPR_FIRST: TokenSet = LHS_FIRST;
pub(super) fn expr(p: &mut Parser) {
let r = Restrictions { forbid_structs: false };
@ -38,26 +38,6 @@ enum Op {
Composite(SyntaxKind, u8),
}
// test expr_binding_power
// fn foo() {
// 1 + 2 * 3 == 1 * 2 + 3;
// *x = 1 + 1;
// }
// test range_binding_power
// fn foo() {
// .. 1 + 1;
// .. z = 2;
// x = false .. 1 == 1;
// }
// test compound_ops
// fn foo() {
// x += 1;
// 1 + 1 <= 2 * 3;
// z -= 3 >= 0;
// true || true && false;
// }
fn current_op(p: &Parser) -> (u8, Op) {
if p.at_compound2(PLUS, EQ) {
return (1, Op::Composite(PLUSEQ, 2));
@ -65,6 +45,12 @@ fn current_op(p: &Parser) -> (u8, Op) {
if p.at_compound2(MINUS, EQ) {
return (1, Op::Composite(MINUSEQ, 2));
}
if p.at_compound3(L_ANGLE, L_ANGLE, EQ) {
return (1, Op::Composite(SHLEQ, 3));
}
if p.at_compound3(R_ANGLE, R_ANGLE, EQ) {
return (1, Op::Composite(SHREQ, 3));
}
if p.at_compound2(PIPE, PIPE) {
return (3, Op::Composite(PIPEPIPE, 2));
}
@ -77,13 +63,22 @@ fn current_op(p: &Parser) -> (u8, Op) {
if p.at_compound2(R_ANGLE, EQ) {
return (5, Op::Composite(GTEQ, 2));
}
if p.at_compound2(L_ANGLE, L_ANGLE) {
return (9, Op::Composite(SHL, 2));
}
if p.at_compound2(R_ANGLE, R_ANGLE) {
return (9, Op::Composite(SHR, 2));
}
let bp = match p.current() {
EQ => 1,
DOTDOT => 2,
EQEQ | NEQ => 5,
MINUS | PLUS => 6,
STAR | SLASH => 7,
PIPE => 6,
CARET => 7,
AMP => 8,
MINUS | PLUS => 10,
STAR | SLASH | PERCENT => 11,
_ => 0,
};
(bp, Op::Simple)
@ -107,13 +102,13 @@ fn expr_bp(p: &mut Parser, r: Restrictions, bp: u8) {
p.bump_compound(kind, n);
}
}
lhs = bin_expr(p, r, lhs, op_bp);
lhs = bin_expr(p, r, lhs, op_bp + 1);
}
}
const UNARY_EXPR_FIRST: TokenSet =
const LHS_FIRST: TokenSet =
token_set_union![
token_set![AMP, STAR, EXCL],
token_set![AMP, STAR, EXCL, DOTDOT, MINUS],
atom::ATOM_EXPR_FIRST,
];
@ -149,6 +144,15 @@ fn lhs(p: &mut Parser, r: Restrictions) -> Option<CompletedMarker> {
p.bump();
NOT_EXPR
}
// test neg_expr
// fn foo() {
// --1;
// }
MINUS => {
m = p.start();
p.bump();
NEG_EXPR
}
DOTDOT => {
m = p.start();
p.bump();

View file

@ -62,6 +62,10 @@ impl<'t> Parser<'t> {
self.0.at_compound2(c1, c2)
}
pub(crate) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool {
self.0.at_compound3(c1, c2, c3)
}
/// Checks if the current token is contextual keyword with text `t`.
pub(crate) fn at_contextual_kw(&self, t: &str) -> bool {
self.0.at_kw(t)

View file

@ -70,6 +70,12 @@ impl<'t> ParserImpl<'t> {
&& self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos)
}
pub(super) fn at_compound3(&self, c1: SyntaxKind, c2: SyntaxKind, c3: SyntaxKind) -> bool {
self.inp.kind(self.pos) == c1 && self.inp.kind(self.pos + 1) == c2 && self.inp.kind(self.pos + 2) == c3
&& self.inp.start(self.pos + 1) == self.inp.start(self.pos) + self.inp.len(self.pos)
&& self.inp.start(self.pos + 2) == self.inp.start(self.pos + 1) + self.inp.len(self.pos + 1)
}
pub(super) fn nth(&self, n: u32) -> SyntaxKind {
self.inp.kind(self.pos + n)
}

View file

@ -46,6 +46,10 @@ pub enum SyntaxKind {
MINUSEQ,
AMPAMP,
PIPEPIPE,
SHL,
SHR,
SHLEQ,
SHREQ,
USE_KW,
FN_KW,
STRUCT_KW,
@ -154,6 +158,7 @@ pub enum SyntaxKind {
REF_EXPR,
DEREF_EXPR,
NOT_EXPR,
NEG_EXPR,
RANGE_EXPR,
BIN_EXPR,
EXTERN_BLOCK_EXPR,
@ -280,6 +285,10 @@ impl SyntaxKind {
MINUSEQ => &SyntaxInfo { name: "MINUSEQ" },
AMPAMP => &SyntaxInfo { name: "AMPAMP" },
PIPEPIPE => &SyntaxInfo { name: "PIPEPIPE" },
SHL => &SyntaxInfo { name: "SHL" },
SHR => &SyntaxInfo { name: "SHR" },
SHLEQ => &SyntaxInfo { name: "SHLEQ" },
SHREQ => &SyntaxInfo { name: "SHREQ" },
USE_KW => &SyntaxInfo { name: "USE_KW" },
FN_KW => &SyntaxInfo { name: "FN_KW" },
STRUCT_KW => &SyntaxInfo { name: "STRUCT_KW" },
@ -388,6 +397,7 @@ impl SyntaxKind {
REF_EXPR => &SyntaxInfo { name: "REF_EXPR" },
DEREF_EXPR => &SyntaxInfo { name: "DEREF_EXPR" },
NOT_EXPR => &SyntaxInfo { name: "NOT_EXPR" },
NEG_EXPR => &SyntaxInfo { name: "NEG_EXPR" },
RANGE_EXPR => &SyntaxInfo { name: "RANGE_EXPR" },
BIN_EXPR => &SyntaxInfo { name: "BIN_EXPR" },
EXTERN_BLOCK_EXPR => &SyntaxInfo { name: "EXTERN_BLOCK_EXPR" },
@ -534,6 +544,10 @@ impl SyntaxKind {
MINUSEQ => "-=",
AMPAMP => "&&",
PIPEPIPE => "||",
SHL => "<<",
SHR => ">>",
SHLEQ => "<<=",
SHREQ => ">>=",
USE_KW => "use",
FN_KW => "fn",

View file

@ -1,4 +0,0 @@
fn foo() {
1 + 2 * 3 == 1 * 2 + 3;
*x = 1 + 1;
}

View file

@ -1,72 +0,0 @@
FILE@[0; 57)
FN_ITEM@[0; 56)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 56)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 38)
BIN_EXPR@[15; 37)
BIN_EXPR@[15; 24)
LITERAL@[15; 16)
INT_NUMBER@[15; 16) "1"
WHITESPACE@[16; 17)
PLUS@[17; 18)
WHITESPACE@[18; 19)
BIN_EXPR@[19; 24)
LITERAL@[19; 20)
INT_NUMBER@[19; 20) "2"
WHITESPACE@[20; 21)
STAR@[21; 22)
WHITESPACE@[22; 23)
LITERAL@[23; 24)
INT_NUMBER@[23; 24) "3"
WHITESPACE@[24; 25)
EQEQ@[25; 27)
WHITESPACE@[27; 28)
BIN_EXPR@[28; 37)
BIN_EXPR@[28; 33)
LITERAL@[28; 29)
INT_NUMBER@[28; 29) "1"
WHITESPACE@[29; 30)
STAR@[30; 31)
WHITESPACE@[31; 32)
LITERAL@[32; 33)
INT_NUMBER@[32; 33) "2"
WHITESPACE@[33; 34)
PLUS@[34; 35)
WHITESPACE@[35; 36)
LITERAL@[36; 37)
INT_NUMBER@[36; 37) "3"
SEMI@[37; 38)
WHITESPACE@[38; 43)
EXPR_STMT@[43; 54)
BIN_EXPR@[43; 53)
DEREF_EXPR@[43; 45)
STAR@[43; 44)
PATH_EXPR@[44; 45)
PATH@[44; 45)
PATH_SEGMENT@[44; 45)
NAME_REF@[44; 45)
IDENT@[44; 45) "x"
WHITESPACE@[45; 46)
EQ@[46; 47)
WHITESPACE@[47; 48)
BIN_EXPR@[48; 53)
LITERAL@[48; 49)
INT_NUMBER@[48; 49) "1"
WHITESPACE@[49; 50)
PLUS@[50; 51)
WHITESPACE@[51; 52)
LITERAL@[52; 53)
INT_NUMBER@[52; 53) "1"
SEMI@[53; 54)
WHITESPACE@[54; 55)
R_CURLY@[55; 56)
WHITESPACE@[56; 57)

View file

@ -1,72 +0,0 @@
FILE@[0; 62)
FN_ITEM@[0; 62)
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_EXPR@[9; 62)
L_CURLY@[9; 10)
EXPR_STMT@[10; 27)
BIN_EXPR@[10; 21)
PATH_EXPR@[10; 17)
PATH@[10; 17)
PATH_SEGMENT@[10; 17)
NAME_REF@[10; 17)
WHITESPACE@[10; 15)
IDENT@[15; 16) "x"
WHITESPACE@[16; 17)
PLUSEQ@[17; 19)
LITERAL@[19; 21)
WHITESPACE@[19; 20)
INT_NUMBER@[20; 21) "1"
SEMI@[21; 22)
WHITESPACE@[22; 27)
EXPR_STMT@[27; 47)
BIN_EXPR@[27; 41)
BIN_EXPR@[27; 33)
LITERAL@[27; 29)
INT_NUMBER@[27; 28) "1"
WHITESPACE@[28; 29)
PLUS@[29; 30)
LITERAL@[30; 33)
WHITESPACE@[30; 31)
INT_NUMBER@[31; 32) "1"
WHITESPACE@[32; 33)
LTEQ@[33; 35)
BIN_EXPR@[35; 41)
LITERAL@[35; 38)
WHITESPACE@[35; 36)
INT_NUMBER@[36; 37) "2"
WHITESPACE@[37; 38)
STAR@[38; 39)
LITERAL@[39; 41)
WHITESPACE@[39; 40)
INT_NUMBER@[40; 41) "3"
SEMI@[41; 42)
WHITESPACE@[42; 47)
EXPR_STMT@[47; 60)
BIN_EXPR@[47; 58)
PATH_EXPR@[47; 49)
PATH@[47; 49)
PATH_SEGMENT@[47; 49)
NAME_REF@[47; 49)
IDENT@[47; 48) "z"
WHITESPACE@[48; 49)
MINUSEQ@[49; 51)
BIN_EXPR@[51; 58)
LITERAL@[51; 54)
WHITESPACE@[51; 52)
INT_NUMBER@[52; 53) "3"
WHITESPACE@[53; 54)
GTEQ@[54; 56)
LITERAL@[56; 58)
WHITESPACE@[56; 57)
INT_NUMBER@[57; 58) "0"
SEMI@[58; 59)
WHITESPACE@[59; 60)
R_CURLY@[60; 61)
WHITESPACE@[61; 62)

View file

@ -1,5 +0,0 @@
fn foo() {
.. 1 + 1;
.. z = 2;
x = false .. 1 == 1;
}

View file

@ -1,72 +0,0 @@
FILE@[0; 66)
FN_ITEM@[0; 65)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 65)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 24)
RANGE_EXPR@[15; 23)
DOTDOT@[15; 17)
WHITESPACE@[17; 18)
BIN_EXPR@[18; 23)
LITERAL@[18; 19)
INT_NUMBER@[18; 19) "1"
WHITESPACE@[19; 20)
PLUS@[20; 21)
WHITESPACE@[21; 22)
LITERAL@[22; 23)
INT_NUMBER@[22; 23) "1"
SEMI@[23; 24)
WHITESPACE@[24; 29)
EXPR_STMT@[29; 38)
BIN_EXPR@[29; 37)
RANGE_EXPR@[29; 33)
DOTDOT@[29; 31)
WHITESPACE@[31; 32)
PATH_EXPR@[32; 33)
PATH@[32; 33)
PATH_SEGMENT@[32; 33)
NAME_REF@[32; 33)
IDENT@[32; 33) "z"
WHITESPACE@[33; 34)
EQ@[34; 35)
WHITESPACE@[35; 36)
LITERAL@[36; 37)
INT_NUMBER@[36; 37) "2"
SEMI@[37; 38)
WHITESPACE@[38; 43)
EXPR_STMT@[43; 63)
BIN_EXPR@[43; 62)
PATH_EXPR@[43; 44)
PATH@[43; 44)
PATH_SEGMENT@[43; 44)
NAME_REF@[43; 44)
IDENT@[43; 44) "x"
WHITESPACE@[44; 45)
EQ@[45; 46)
WHITESPACE@[46; 47)
BIN_EXPR@[47; 62)
LITERAL@[47; 52)
FALSE_KW@[47; 52)
WHITESPACE@[52; 53)
DOTDOT@[53; 55)
WHITESPACE@[55; 56)
BIN_EXPR@[56; 62)
LITERAL@[56; 57)
INT_NUMBER@[56; 57) "1"
WHITESPACE@[57; 58)
EQEQ@[58; 60)
WHITESPACE@[60; 61)
LITERAL@[61; 62)
INT_NUMBER@[61; 62) "1"
SEMI@[62; 63)
WHITESPACE@[63; 64)
R_CURLY@[64; 65)
WHITESPACE@[65; 66)

View file

@ -1,6 +0,0 @@
fn foo() {
x += 1;
1 + 1 <= 2 * 3;
z -= 3 >= 0;
true || true && false;
}

View file

@ -1,89 +0,0 @@
FILE@[0; 89)
FN_ITEM@[0; 88)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 88)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 22)
BIN_EXPR@[15; 21)
PATH_EXPR@[15; 16)
PATH@[15; 16)
PATH_SEGMENT@[15; 16)
NAME_REF@[15; 16)
IDENT@[15; 16) "x"
WHITESPACE@[16; 17)
PLUSEQ@[17; 19)
WHITESPACE@[19; 20)
LITERAL@[20; 21)
INT_NUMBER@[20; 21) "1"
SEMI@[21; 22)
WHITESPACE@[22; 27)
EXPR_STMT@[27; 42)
BIN_EXPR@[27; 41)
BIN_EXPR@[27; 32)
LITERAL@[27; 28)
INT_NUMBER@[27; 28) "1"
WHITESPACE@[28; 29)
PLUS@[29; 30)
WHITESPACE@[30; 31)
LITERAL@[31; 32)
INT_NUMBER@[31; 32) "1"
WHITESPACE@[32; 33)
LTEQ@[33; 35)
WHITESPACE@[35; 36)
BIN_EXPR@[36; 41)
LITERAL@[36; 37)
INT_NUMBER@[36; 37) "2"
WHITESPACE@[37; 38)
STAR@[38; 39)
WHITESPACE@[39; 40)
LITERAL@[40; 41)
INT_NUMBER@[40; 41) "3"
SEMI@[41; 42)
WHITESPACE@[42; 47)
EXPR_STMT@[47; 59)
BIN_EXPR@[47; 58)
PATH_EXPR@[47; 48)
PATH@[47; 48)
PATH_SEGMENT@[47; 48)
NAME_REF@[47; 48)
IDENT@[47; 48) "z"
WHITESPACE@[48; 49)
MINUSEQ@[49; 51)
WHITESPACE@[51; 52)
BIN_EXPR@[52; 58)
LITERAL@[52; 53)
INT_NUMBER@[52; 53) "3"
WHITESPACE@[53; 54)
GTEQ@[54; 56)
WHITESPACE@[56; 57)
LITERAL@[57; 58)
INT_NUMBER@[57; 58) "0"
SEMI@[58; 59)
WHITESPACE@[59; 64)
EXPR_STMT@[64; 86)
BIN_EXPR@[64; 85)
LITERAL@[64; 68)
TRUE_KW@[64; 68)
WHITESPACE@[68; 69)
PIPEPIPE@[69; 71)
WHITESPACE@[71; 72)
BIN_EXPR@[72; 85)
LITERAL@[72; 76)
TRUE_KW@[72; 76)
WHITESPACE@[76; 77)
AMPAMP@[77; 79)
WHITESPACE@[79; 80)
LITERAL@[80; 85)
FALSE_KW@[80; 85)
SEMI@[85; 86)
WHITESPACE@[86; 87)
R_CURLY@[87; 88)
WHITESPACE@[88; 89)

View file

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

View file

@ -0,0 +1,24 @@
FILE@[0; 22)
FN_ITEM@[0; 21)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 21)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 19)
NEG_EXPR@[15; 18)
MINUS@[15; 16)
NEG_EXPR@[16; 18)
MINUS@[16; 17)
LITERAL@[17; 18)
INT_NUMBER@[17; 18) "1"
SEMI@[18; 19)
WHITESPACE@[19; 20)
R_CURLY@[20; 21)
WHITESPACE@[21; 22)

View file

@ -0,0 +1,14 @@
fn binding_power() {
let x = 1 + 2 * 3 % 4 - 5 / 6;
1 + 2 * 3;
1 << 2 + 3;
1 & 2 >> 3;
1 ^ 2 & 3;
1 | 2 ^ 3;
1 == 2 | 3;
1 && 2 == 3;
//1 || 2 && 2;
//1 .. 2 || 3;
//1 = 2 .. 3;
//---&*1 - --2 * 9;
}

View file

@ -0,0 +1,185 @@
FILE@[0; 248)
FN_ITEM@[0; 247)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 16)
IDENT@[3; 16) "binding_power"
PARAM_LIST@[16; 18)
L_PAREN@[16; 17)
R_PAREN@[17; 18)
WHITESPACE@[18; 19)
BLOCK_EXPR@[19; 247)
L_CURLY@[19; 20)
WHITESPACE@[20; 25)
LET_STMT@[25; 55)
LET_KW@[25; 28)
WHITESPACE@[28; 29)
BIND_PAT@[29; 30)
NAME@[29; 30)
IDENT@[29; 30) "x"
WHITESPACE@[30; 31)
EQ@[31; 32)
WHITESPACE@[32; 33)
BIN_EXPR@[33; 54)
BIN_EXPR@[33; 46)
LITERAL@[33; 34)
INT_NUMBER@[33; 34) "1"
WHITESPACE@[34; 35)
PLUS@[35; 36)
WHITESPACE@[36; 37)
BIN_EXPR@[37; 46)
BIN_EXPR@[37; 42)
LITERAL@[37; 38)
INT_NUMBER@[37; 38) "2"
WHITESPACE@[38; 39)
STAR@[39; 40)
WHITESPACE@[40; 41)
LITERAL@[41; 42)
INT_NUMBER@[41; 42) "3"
WHITESPACE@[42; 43)
PERCENT@[43; 44)
WHITESPACE@[44; 45)
LITERAL@[45; 46)
INT_NUMBER@[45; 46) "4"
WHITESPACE@[46; 47)
MINUS@[47; 48)
WHITESPACE@[48; 49)
BIN_EXPR@[49; 54)
LITERAL@[49; 50)
INT_NUMBER@[49; 50) "5"
WHITESPACE@[50; 51)
SLASH@[51; 52)
WHITESPACE@[52; 53)
LITERAL@[53; 54)
INT_NUMBER@[53; 54) "6"
SEMI@[54; 55)
WHITESPACE@[55; 60)
EXPR_STMT@[60; 70)
BIN_EXPR@[60; 69)
LITERAL@[60; 61)
INT_NUMBER@[60; 61) "1"
WHITESPACE@[61; 62)
PLUS@[62; 63)
WHITESPACE@[63; 64)
BIN_EXPR@[64; 69)
LITERAL@[64; 65)
INT_NUMBER@[64; 65) "2"
WHITESPACE@[65; 66)
STAR@[66; 67)
WHITESPACE@[67; 68)
LITERAL@[68; 69)
INT_NUMBER@[68; 69) "3"
SEMI@[69; 70)
WHITESPACE@[70; 75)
EXPR_STMT@[75; 86)
BIN_EXPR@[75; 85)
LITERAL@[75; 76)
INT_NUMBER@[75; 76) "1"
WHITESPACE@[76; 77)
SHL@[77; 79)
WHITESPACE@[79; 80)
BIN_EXPR@[80; 85)
LITERAL@[80; 81)
INT_NUMBER@[80; 81) "2"
WHITESPACE@[81; 82)
PLUS@[82; 83)
WHITESPACE@[83; 84)
LITERAL@[84; 85)
INT_NUMBER@[84; 85) "3"
SEMI@[85; 86)
WHITESPACE@[86; 91)
EXPR_STMT@[91; 102)
BIN_EXPR@[91; 101)
LITERAL@[91; 92)
INT_NUMBER@[91; 92) "1"
WHITESPACE@[92; 93)
AMP@[93; 94)
WHITESPACE@[94; 95)
BIN_EXPR@[95; 101)
LITERAL@[95; 96)
INT_NUMBER@[95; 96) "2"
WHITESPACE@[96; 97)
SHR@[97; 99)
WHITESPACE@[99; 100)
LITERAL@[100; 101)
INT_NUMBER@[100; 101) "3"
SEMI@[101; 102)
WHITESPACE@[102; 107)
EXPR_STMT@[107; 117)
BIN_EXPR@[107; 116)
LITERAL@[107; 108)
INT_NUMBER@[107; 108) "1"
WHITESPACE@[108; 109)
CARET@[109; 110)
WHITESPACE@[110; 111)
BIN_EXPR@[111; 116)
LITERAL@[111; 112)
INT_NUMBER@[111; 112) "2"
WHITESPACE@[112; 113)
AMP@[113; 114)
WHITESPACE@[114; 115)
LITERAL@[115; 116)
INT_NUMBER@[115; 116) "3"
SEMI@[116; 117)
WHITESPACE@[117; 122)
EXPR_STMT@[122; 132)
BIN_EXPR@[122; 131)
LITERAL@[122; 123)
INT_NUMBER@[122; 123) "1"
WHITESPACE@[123; 124)
PIPE@[124; 125)
WHITESPACE@[125; 126)
BIN_EXPR@[126; 131)
LITERAL@[126; 127)
INT_NUMBER@[126; 127) "2"
WHITESPACE@[127; 128)
CARET@[128; 129)
WHITESPACE@[129; 130)
LITERAL@[130; 131)
INT_NUMBER@[130; 131) "3"
SEMI@[131; 132)
WHITESPACE@[132; 137)
EXPR_STMT@[137; 148)
BIN_EXPR@[137; 147)
LITERAL@[137; 138)
INT_NUMBER@[137; 138) "1"
WHITESPACE@[138; 139)
EQEQ@[139; 141)
WHITESPACE@[141; 142)
BIN_EXPR@[142; 147)
LITERAL@[142; 143)
INT_NUMBER@[142; 143) "2"
WHITESPACE@[143; 144)
PIPE@[144; 145)
WHITESPACE@[145; 146)
LITERAL@[146; 147)
INT_NUMBER@[146; 147) "3"
SEMI@[147; 148)
WHITESPACE@[148; 153)
EXPR_STMT@[153; 165)
BIN_EXPR@[153; 164)
LITERAL@[153; 154)
INT_NUMBER@[153; 154) "1"
WHITESPACE@[154; 155)
AMPAMP@[155; 157)
WHITESPACE@[157; 158)
BIN_EXPR@[158; 164)
LITERAL@[158; 159)
INT_NUMBER@[158; 159) "2"
WHITESPACE@[159; 160)
EQEQ@[160; 162)
WHITESPACE@[162; 163)
LITERAL@[163; 164)
INT_NUMBER@[163; 164) "3"
SEMI@[164; 165)
WHITESPACE@[165; 170)
COMMENT@[170; 184)
WHITESPACE@[184; 189)
COMMENT@[189; 203)
WHITESPACE@[203; 208)
COMMENT@[208; 221)
WHITESPACE@[221; 226)
COMMENT@[226; 245)
WHITESPACE@[245; 246)
R_CURLY@[246; 247)
WHITESPACE@[247; 248)

View file

@ -0,0 +1,5 @@
fn foo() {
..1 + 1;
..z = 2;
x = false..1 == 1;
}

View file

@ -0,0 +1,68 @@
FILE@[0; 62)
FN_ITEM@[0; 61)
FN_KW@[0; 2)
WHITESPACE@[2; 3)
NAME@[3; 6)
IDENT@[3; 6) "foo"
PARAM_LIST@[6; 8)
L_PAREN@[6; 7)
R_PAREN@[7; 8)
WHITESPACE@[8; 9)
BLOCK_EXPR@[9; 61)
L_CURLY@[9; 10)
WHITESPACE@[10; 15)
EXPR_STMT@[15; 23)
RANGE_EXPR@[15; 22)
DOTDOT@[15; 17)
BIN_EXPR@[17; 22)
LITERAL@[17; 18)
INT_NUMBER@[17; 18) "1"
WHITESPACE@[18; 19)
PLUS@[19; 20)
WHITESPACE@[20; 21)
LITERAL@[21; 22)
INT_NUMBER@[21; 22) "1"
SEMI@[22; 23)
WHITESPACE@[23; 28)
EXPR_STMT@[28; 36)
BIN_EXPR@[28; 35)
RANGE_EXPR@[28; 31)
DOTDOT@[28; 30)
PATH_EXPR@[30; 31)
PATH@[30; 31)
PATH_SEGMENT@[30; 31)
NAME_REF@[30; 31)
IDENT@[30; 31) "z"
WHITESPACE@[31; 32)
EQ@[32; 33)
WHITESPACE@[33; 34)
LITERAL@[34; 35)
INT_NUMBER@[34; 35) "2"
SEMI@[35; 36)
WHITESPACE@[36; 41)
EXPR_STMT@[41; 59)
BIN_EXPR@[41; 58)
PATH_EXPR@[41; 42)
PATH@[41; 42)
PATH_SEGMENT@[41; 42)
NAME_REF@[41; 42)
IDENT@[41; 42) "x"
WHITESPACE@[42; 43)
EQ@[43; 44)
WHITESPACE@[44; 45)
BIN_EXPR@[45; 58)
LITERAL@[45; 50)
FALSE_KW@[45; 50)
DOTDOT@[50; 52)
BIN_EXPR@[52; 58)
LITERAL@[52; 53)
INT_NUMBER@[52; 53) "1"
WHITESPACE@[53; 54)
EQEQ@[54; 56)
WHITESPACE@[56; 57)
LITERAL@[57; 58)
INT_NUMBER@[57; 58) "1"
SEMI@[58; 59)
WHITESPACE@[59; 60)
R_CURLY@[60; 61)
WHITESPACE@[61; 62)