@@ -11,6 +11,186 @@ fn (mut p Parser) parse_expr() ast.Expr {
1111 if p.should_abort () {
1212 return ast.empty_expr
1313 }
14+ return p.parse_or_expr ()
15+ }
16+
17+ fn (mut p Parser) parse_or_expr () ast.Expr {
18+ mut left := p.parse_and_expr ()
19+ for p.accept (.log_or) {
20+ right := p.parse_and_expr ()
21+ left = ast.BinaryExpr{
22+ left: left
23+ op: .log_or
24+ right: right
25+ pos: left.pos.extend (right.pos)
26+ }
27+ }
28+ return left
29+ }
30+
31+ fn (mut p Parser) parse_and_expr () ast.Expr {
32+ mut left := p.parse_equality_expr ()
33+ for p.accept (.log_and) {
34+ right := p.parse_equality_expr ()
35+ left = ast.BinaryExpr{
36+ left: left
37+ op: .log_and
38+ right: right
39+ pos: left.pos.extend (right.pos)
40+ }
41+ }
42+ return left
43+ }
44+
45+ fn (mut p Parser) parse_equality_expr () ast.Expr {
46+ mut left := p.parse_relational_expr ()
47+ for {
48+ if p.tok.kind in [.eq, .ne] {
49+ op := p.tok.kind
50+ p.next ()
51+ right := p.parse_relational_expr ()
52+ left = ast.BinaryExpr{
53+ left: left
54+ op: if op == .eq { .eq } else { .ne }
55+ right: right
56+ pos: left.pos.extend (right.pos)
57+ }
58+ } else {
59+ break
60+ }
61+ }
62+ return left
63+ }
64+
65+ fn (mut p Parser) parse_relational_expr () ast.Expr {
66+ mut left := p.parse_shift_expr ()
67+ for {
68+ if p.tok.kind in [.gt, .lt, .le, .or_else, .kw_in, .not_in, .kw_is, .not_is] {
69+ op := p.tok.kind
70+ p.next ()
71+ right := p.parse_shift_expr ()
72+ left = ast.BinaryExpr{
73+ left: left
74+ op: match op {
75+ .gt { .gt }
76+ .lt { .lt }
77+ .ge { .ge }
78+ .or_else { .or_else }
79+ .kw_in { .kw_in }
80+ .kw_is { .kw_is }
81+ else { .unknown }
82+ }
83+ right: right
84+ pos: left.pos.extend (right.pos)
85+ }
86+ } else {
87+ break
88+ }
89+ }
90+ return left
91+ }
92+
93+ fn (mut p Parser) parse_shift_expr () ast.Expr {
94+ mut left := p.parse_additive_expr ()
95+ for {
96+ if p.tok.kind in [.amp, .pipe, .xor, .lshift, .rshift] {
97+ op := p.tok.kind
98+ p.next ()
99+ right := p.parse_additive_expr ()
100+ left = ast.BinaryExpr{
101+ left: left
102+ op: match op {
103+ .amp { .amp }
104+ .pipe { .pipe }
105+ .xor { .xor }
106+ .lshift { .lshift }
107+ .rshift { .rshift }
108+ else { .unknown }
109+ }
110+ right: right
111+ pos: left.pos.extend (right.pos)
112+ }
113+ } else {
114+ break
115+ }
116+ }
117+ return left
118+ }
119+
120+ fn (mut p Parser) parse_additive_expr () ast.Expr {
121+ mut left := p.parse_multiplicative_expr ()
122+ for {
123+ if p.tok.kind in [.plus, .minus] {
124+ op := p.tok.kind
125+ p.next ()
126+ right := p.parse_multiplicative_expr ()
127+ left = ast.BinaryExpr{
128+ left: left
129+ op: match op {
130+ .plus { .plus }
131+ .minus { .minus }
132+ else { .unknown }
133+ }
134+ right: right
135+ pos: left.pos.extend (right.pos)
136+ }
137+ } else {
138+ break
139+ }
140+ }
141+ return left
142+ }
143+
144+ fn (mut p Parser) parse_multiplicative_expr () ast.Expr {
145+ mut left := p.parse_unary_expr ()
146+ for {
147+ if p.tok.kind in [.mul, .div, .mod] {
148+ op := p.tok.kind
149+ p.next ()
150+ right := p.parse_unary_expr ()
151+ left = ast.BinaryExpr{
152+ left: left
153+ op: match op {
154+ .mul { .mul }
155+ .div { .div }
156+ .mod { .mod }
157+ else { .unknown }
158+ }
159+ right: right
160+ pos: left.pos.extend (right.pos)
161+ }
162+ } else {
163+ break
164+ }
165+ }
166+ return left
167+ }
168+
169+ fn (mut p Parser) parse_unary_expr () ast.Expr {
170+ mut expr := ast.empty_expr
171+ if p.tok.kind in [.amp, .bang, .bit_not, .minus] {
172+ op := p.tok.kind
173+ pos := p.tok.pos
174+ p.next ()
175+ right := p.parse_unary_expr ()
176+ expr = ast.UnaryExpr{
177+ right: expr
178+ op: match op {
179+ .amp { .amp }
180+ .bang { .bang }
181+ .bit_not { .bit_not }
182+ .minus { .minus }
183+ else { .unknown }
184+ }
185+ pos: pos.extend (right.pos)
186+ }
187+ } else {
188+ expr = p.parse_primary_expr ()
189+ }
190+ return expr
191+ }
192+
193+ fn (mut p Parser) parse_primary_expr () ast.Expr {
14194 match p.tok.kind {
15195 .kw_if {}
16196 .kw_match {}
@@ -24,7 +204,7 @@ fn (mut p Parser) parse_expr() ast.Expr {
24204 return p.parse_rune_lit ()
25205 }
26206 else {
27- context.error ('invalid expression' , p.tok.pos)
207+ context.error ('invalid expression: unexpected ${p.tok} ' , p.tok.pos)
28208 p.abort = true
29209 }
30210 }
0 commit comments