@@ -49,12 +49,11 @@ type parser struct {
49
49
current Token
50
50
pos int
51
51
err * file.Error
52
- depth int // predicate call depth
53
52
config * conf.Config
53
+ depth int // predicate call depth
54
54
nodeCount uint // tracks number of AST nodes created
55
55
}
56
56
57
- // checkNodeLimit verifies that adding a new node won't exceed configured limits
58
57
func (p * parser ) checkNodeLimit () error {
59
58
p .nodeCount ++
60
59
if p .config .MaxNodes > 0 && p .nodeCount > p .config .MaxNodes {
@@ -64,7 +63,6 @@ func (p *parser) checkNodeLimit() error {
64
63
return nil
65
64
}
66
65
67
- // createNode handles creation of regular nodes
68
66
func (p * parser ) createNode (n Node , loc file.Location ) Node {
69
67
if err := p .checkNodeLimit (); err != nil {
70
68
return nil
@@ -76,7 +74,6 @@ func (p *parser) createNode(n Node, loc file.Location) Node {
76
74
return n
77
75
}
78
76
79
- // createMemberNode handles creation of member nodes
80
77
func (p * parser ) createMemberNode (n * MemberNode , loc file.Location ) * MemberNode {
81
78
if err := p .checkNodeLimit (); err != nil {
82
79
return nil
@@ -163,6 +160,27 @@ func (p *parser) expect(kind Kind, values ...string) {
163
160
164
161
// parse functions
165
162
163
+ func (p * parser ) parseSequenceExpression () Node {
164
+ nodes := []Node {p .parseExpression (0 )}
165
+
166
+ for p .current .Is (Operator , ";" ) && p .err == nil {
167
+ p .next ()
168
+ // If a trailing semicolon is present, break out.
169
+ if p .current .Is (EOF ) {
170
+ break
171
+ }
172
+ nodes = append (nodes , p .parseExpression (0 ))
173
+ }
174
+
175
+ if len (nodes ) == 1 {
176
+ return nodes [0 ]
177
+ }
178
+
179
+ return p .createNode (& SequenceNode {
180
+ Nodes : nodes ,
181
+ }, nodes [0 ].Location ())
182
+ }
183
+
166
184
func (p * parser ) parseExpression (precedence int ) Node {
167
185
if p .err != nil {
168
186
return nil
@@ -171,6 +189,7 @@ func (p *parser) parseExpression(precedence int) Node {
171
189
if precedence == 0 && p .current .Is (Operator , "let" ) {
172
190
return p .parseVariableDeclaration ()
173
191
}
192
+
174
193
if p .current .Is (Operator , "if" ) {
175
194
return p .parseConditionalIf ()
176
195
}
@@ -283,11 +302,11 @@ func (p *parser) parseConditionalIf() Node {
283
302
p .next ()
284
303
nodeCondition := p .parseExpression (0 )
285
304
p .expect (Bracket , "{" )
286
- expr1 := p .parseExpression ( 0 )
305
+ expr1 := p .parseSequenceExpression ( )
287
306
p .expect (Bracket , "}" )
288
307
p .expect (Operator , "else" )
289
308
p .expect (Bracket , "{" )
290
- expr2 := p .parseExpression ( 0 )
309
+ expr2 := p .parseSequenceExpression ( )
291
310
p .expect (Bracket , "}" )
292
311
293
312
return & ConditionalNode {
@@ -304,13 +323,13 @@ func (p *parser) parseConditional(node Node) Node {
304
323
p .next ()
305
324
306
325
if ! p .current .Is (Operator , ":" ) {
307
- expr1 = p .parseExpression ( 0 )
326
+ expr1 = p .parseSequenceExpression ( )
308
327
p .expect (Operator , ":" )
309
- expr2 = p .parseExpression ( 0 )
328
+ expr2 = p .parseSequenceExpression ( )
310
329
} else {
311
330
p .next ()
312
331
expr1 = node
313
- expr2 = p .parseExpression ( 0 )
332
+ expr2 = p .parseSequenceExpression ( )
314
333
}
315
334
316
335
node = p .createNode (& ConditionalNode {
0 commit comments