2

私はIronyを使用してDSLを解析しています。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と(BとCまたはD)」という表現があります。「Aと(Bと(CまたはD))」として解析されますが、「Aと((BとC)またはD)」である必要があります。

andキーワードをorキーワードよりも優先度の高い演算子として登録すると、そうなると思いました。私は何が欠けていますか?

4

1 に答える 1

1

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;
于 2012-09-19T10:58:31.200 に答える