Ирония.NET: приоритет оператора выражения
Я использую Irony для анализа 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;
У меня есть следующее выражение: "А и (В и С или D)". Он анализируется как "A и (B и (C или D))", но мне нужно, чтобы он был "A и ((B и C) или D)".
Я думал, что регистрация ключевого слова and в качестве оператора с более высоким приоритетом, чем ключевое слово or, сделает это. Что мне не хватает?
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;