fixed logical operator priority
This commit is contained in:
parent
6b2e509aea
commit
c1f269e9a4
|
@ -135,32 +135,33 @@ describe("Peggy parse", () => {
|
|||
describe("logical", () => {
|
||||
testParse("true || false", "{(::or true false)}")
|
||||
testParse("true && false", "{(::and true false)}")
|
||||
testParse("a && b || c", "{(::and :a (::or :b :c))}")
|
||||
testParse("a && b || c && d", "{(::and (::and :a (::or :b :c)) :d)}")
|
||||
testParse("a && !b || c", "{(::and :a (::or (::not :b) :c))}")
|
||||
testParse("a && b==c || d", "{(::and :a (::or (::equal :b :c) :d))}")
|
||||
testParse("a && b!=c || d", "{(::and :a (::or (::unequal :b :c) :d))}")
|
||||
testParse("a && !(b==c) || d", "{(::and :a (::or (::not (::equal :b :c)) :d))}")
|
||||
testParse("a && b>=c || d", "{(::and :a (::or (::largerEq :b :c) :d))}")
|
||||
testParse("a && !(b>=c) || d", "{(::and :a (::or (::not (::largerEq :b :c)) :d))}")
|
||||
testParse("a && b<=c || d", "{(::and :a (::or (::smallerEq :b :c) :d))}")
|
||||
testParse("a && b>c || d", "{(::and :a (::or (::larger :b :c) :d))}")
|
||||
testParse("a && b<c || d", "{(::and :a (::or (::smaller :b :c) :d))}")
|
||||
testParse("a && b<c[i] || d", "{(::and :a (::or (::smaller :b (::$atIndex :c :i)) :d))}")
|
||||
testParse("a && b<c.i || d", "{(::and :a (::or (::smaller :b (::$atIndex :c 'i')) :d))}")
|
||||
testParse("a && b<c(i) || d", "{(::and :a (::or (::smaller :b (::c :i)) :d))}")
|
||||
testParse("a && b<1+2 || d", "{(::and :a (::or (::smaller :b (::add 1 2)) :d))}")
|
||||
testParse("a * b + c", "{(::add (::multiply :a :b) :c)}") // for comparison
|
||||
testParse("a && b || c", "{(::or (::and :a :b) :c)}")
|
||||
testParse("a && b || c && d", "{(::or (::and :a :b) (::and :c :d))}")
|
||||
testParse("a && !b || c", "{(::or (::and :a (::not :b)) :c)}")
|
||||
testParse("a && b==c || d", "{(::or (::and :a (::equal :b :c)) :d)}")
|
||||
testParse("a && b!=c || d", "{(::or (::and :a (::unequal :b :c)) :d)}")
|
||||
testParse("a && !(b==c) || d", "{(::or (::and :a (::not (::equal :b :c))) :d)}")
|
||||
testParse("a && b>=c || d", "{(::or (::and :a (::largerEq :b :c)) :d)}")
|
||||
testParse("a && !(b>=c) || d", "{(::or (::and :a (::not (::largerEq :b :c))) :d)}")
|
||||
testParse("a && b<=c || d", "{(::or (::and :a (::smallerEq :b :c)) :d)}")
|
||||
testParse("a && b>c || d", "{(::or (::and :a (::larger :b :c)) :d)}")
|
||||
testParse("a && b<c || d", "{(::or (::and :a (::smaller :b :c)) :d)}")
|
||||
testParse("a && b<c[i] || d", "{(::or (::and :a (::smaller :b (::$atIndex :c :i))) :d)}")
|
||||
testParse("a && b<c.i || d", "{(::or (::and :a (::smaller :b (::$atIndex :c 'i'))) :d)}")
|
||||
testParse("a && b<c(i) || d", "{(::or (::and :a (::smaller :b (::c :i))) :d)}")
|
||||
testParse("a && b<1+2 || d", "{(::or (::and :a (::smaller :b (::add 1 2))) :d)}")
|
||||
testParse(
|
||||
"a && b<1+2*3 || d",
|
||||
"{(::and :a (::or (::smaller :b (::add 1 (::multiply 2 3))) :d))}",
|
||||
"{(::or (::and :a (::smaller :b (::add 1 (::multiply 2 3)))) :d)}",
|
||||
)
|
||||
testParse(
|
||||
"a && b<1+2*-3+4 || d",
|
||||
"{(::and :a (::or (::smaller :b (::add (::add 1 (::multiply 2 (::unaryMinus 3))) 4)) :d))}",
|
||||
"{(::or (::and :a (::smaller :b (::add (::add 1 (::multiply 2 (::unaryMinus 3))) 4))) :d)}",
|
||||
)
|
||||
testParse(
|
||||
"a && b<1+2*3 || d ? true : false",
|
||||
"{(::$$ternary (::and :a (::or (::smaller :b (::add 1 (::multiply 2 3))) :d)) true false)}",
|
||||
"{(::$$ternary (::or (::and :a (::smaller :b (::add 1 (::multiply 2 3)))) :d) true false)}",
|
||||
)
|
||||
})
|
||||
|
||||
|
|
|
@ -245,8 +245,8 @@ function peg$parse(input, options) {
|
|||
var peg$c8 = "else";
|
||||
var peg$c9 = "?";
|
||||
var peg$c10 = ":";
|
||||
var peg$c11 = "&&";
|
||||
var peg$c12 = "||";
|
||||
var peg$c11 = "||";
|
||||
var peg$c12 = "&&";
|
||||
var peg$c13 = "==";
|
||||
var peg$c14 = "!=";
|
||||
var peg$c15 = "<=";
|
||||
|
@ -303,8 +303,8 @@ function peg$parse(input, options) {
|
|||
var peg$e8 = peg$literalExpectation("else", false);
|
||||
var peg$e9 = peg$literalExpectation("?", false);
|
||||
var peg$e10 = peg$literalExpectation(":", false);
|
||||
var peg$e11 = peg$literalExpectation("&&", false);
|
||||
var peg$e12 = peg$literalExpectation("||", false);
|
||||
var peg$e11 = peg$literalExpectation("||", false);
|
||||
var peg$e12 = peg$literalExpectation("&&", false);
|
||||
var peg$e13 = peg$literalExpectation("==", false);
|
||||
var peg$e14 = peg$literalExpectation("!=", false);
|
||||
var peg$e15 = peg$literalExpectation("<=", false);
|
||||
|
|
|
@ -124,14 +124,14 @@ ternary
|
|||
{ return nodeTernary(condition, trueExpression, falseExpression) }
|
||||
|
||||
logicalAdditive
|
||||
= head:logicalMultiplicative tail:(_ operator:'&&' _nl arg:logicalMultiplicative {return {operator: operator, right: arg}})*
|
||||
= head:logicalMultiplicative tail:(_ operator:'||' _nl arg:logicalMultiplicative {return {operator: operator, right: arg}})*
|
||||
{ return tail.reduce(function(result, element) {
|
||||
return makeFunctionCall(toFunction[element.operator], [result, element.right])
|
||||
}, head)}
|
||||
|
||||
// start binary operators
|
||||
logicalMultiplicative
|
||||
= head:equality tail:(_ operator:'||' _nl arg:equality {return {operator: operator, right: arg}})*
|
||||
= head:equality tail:(_ operator:'&&' _nl arg:equality {return {operator: operator, right: arg}})*
|
||||
{ return tail.reduce(function(result, element) {
|
||||
return makeFunctionCall(toFunction[element.operator], [result, element.right])
|
||||
}, head)}
|
||||
|
|
Loading…
Reference in New Issue
Block a user