Improve ternary expression parsing definition
This commit is contained in:
parent
bb9b6c8128
commit
167f448ae1
@ -1,8 +1,10 @@
|
|||||||
<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>
|
||||||
<h2>#(toLower(user.Name))</h2>
|
<h2>#(toLower(user.Name))</h2>
|
||||||
@ -12,5 +14,6 @@
|
|||||||
<p>Registered: #(user.RegisteredTime.Format("01-02-2006"))</p>
|
<p>Registered: #(user.RegisteredTime.Format("01-02-2006"))</p>
|
||||||
</div>
|
</div>
|
||||||
#!for
|
#!for
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
888
parser/parser.go
888
parser/parser.go
File diff suppressed because it is too large
Load Diff
@ -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),
|
||||||
|
Loading…
Reference in New Issue
Block a user