Improve ternary expression parsing definition

This commit is contained in:
Elara 2024-06-06 18:52:14 -07:00
parent bb9b6c8128
commit 167f448ae1
3 changed files with 479 additions and 465 deletions

View File

@ -1,7 +1,9 @@
<html> <html>
<head> <head>
<title>#(page.Title)</title> <title>#(page.Title)</title>
</head> </head>
<body> <body>
#for(i, user in users): #for(i, user in users):
<div> <div>
@ -13,4 +15,5 @@
</div> </div>
#!for #!for
</body> </body>
</html> </html>

File diff suppressed because it is too large Load Diff

View File

@ -83,8 +83,21 @@ ExprTag = '#' ignoreErr:'?'? '(' item:Expr ')' {
}, nil }, nil
} }
Expr = Ternary / Assignment / LogicalExpr Expr = Assignment / TernaryExpr
Assignable = Ternary / LogicalExpr Assignable = TernaryExpr
TernaryExpr = _ cond:LogicalExpr vals:(_ '?' _ Value _ ':' _ Value)? {
if vals == nil {
return cond, nil
} else {
s := toAnySlice(vals)
return ast.Ternary{
Condition: cond.(ast.Node),
IfTrue: s[3].(ast.Node),
Else: s[7].(ast.Node),
}, nil
}
}
LogicalExpr = _ first:ComparisonExpr rest:(_ LogicalOp _ ComparisonExpr)* _ { LogicalExpr = _ first:ComparisonExpr rest:(_ LogicalOp _ ComparisonExpr)* _ {
return toExpr(c, first, rest), nil return toExpr(c, first, rest), nil
@ -174,14 +187,6 @@ Assignment = name:Ident _ '=' _ value:Assignable {
}, nil }, nil
} }
Ternary = cond:Assignable _ '?' _ ifTrue:Value _ ':' _ elseVal:Value {
return ast.Ternary{
Condition: cond.(ast.Node),
IfTrue: ifTrue.(ast.Node),
Else: elseVal.(ast.Node),
}, nil
}
MethodCall = value:Value '.' name:Ident params:ParamList { MethodCall = value:Value '.' name:Ident params:ParamList {
return ast.MethodCall{ return ast.MethodCall{
Value: value.(ast.Node), Value: value.(ast.Node),