我使用讽刺来解析DSL,它具有可以与and和OR组合的表达式:
/* snip */
RegisterOperators(4, orKeyword);
RegisterOperators(5, andKeyword);
RegisterOperators(9, lessThanOperator, lessEqualOperator, equalOperator, notEqualOperator, moreThanOperator, moreEqualOperator);
infixOperator.Rule = andKeyword | orKeyword;
expression_in_parens.Rule = L_PAR + expression + R_PAR;
primaryExpression.Rule = expression_in_parens | methodCall | identifier | numberIdentifier | stringIdentifier;
unaryExpression.Rule = notKeyword + L_PAR + expression + R_PAR;
binaryExpression.Rule = expression + infixOperator + expression;
compareExpression.Rule = expression + compareOperator + expression + ReduceHere();
expression.Rule = primaryExpression | unaryExpression | compareExpression | binaryExpression;我有下面的表达式:"A and (B and C or D)“。它被解析为"A and (B and (C or D))",但我需要它是"A and ((B and C) or D)“。
我认为将and关键字注册为具有比or关键字更高优先级的运算符可以做到这一点。我遗漏了什么?
发布于 2012-09-19 18:58:31
我为AND和OR创建了单独的规则,并将它们按正确的顺序排列,从而使其正常工作:
binaryAndExpression.Rule = expression + andKeyword + expression;
binaryOrExpression.Rule = expression + orKeyword + expression;
compareExpression.Rule = expression + compareOperator + expression + ReduceHere();
expression.Rule = compareExpression | binaryAndExpression | binaryOrExpression | unaryExpression | primaryExpression;https://stackoverflow.com/questions/12474539
复制相似问题