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,16 +1,19 @@
<html> <html>
<head>
<title>#(page.Title)</title> <head>
</head> <title>#(page.Title)</title>
<body> </head>
#for(i, user in users):
<div> <body>
<h2>#(toLower(user.Name))</h2> #for(i, user in users):
<p>User ID: #(i)</p> <div>
#if(user.LoggedIn): <p>This user is logged in</p> #!if <h2>#(toLower(user.Name))</h2>
#if(user.IsAdmin): <p>This user is an admin!</p> #!if <p>User ID: #(i)</p>
<p>Registered: #(user.RegisteredTime.Format("01-02-2006"))</p> #if(user.LoggedIn): <p>This user is logged in</p> #!if
</div> #if(user.IsAdmin): <p>This user is an admin!</p> #!if
#!for <p>Registered: #(user.RegisteredTime.Format("01-02-2006"))</p>
</body> </div>
#!for
</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),