2012-09-18 2 views
2
내가 AND 연산 및 관찰 보고서와 결합 될 수있다 표현이있는 DSL, 구문 분석하는 아이러니를 사용하고

: 나는 다음과 같은 표현이아이러니 .NET : 표현 연산자 우선 순위

/* 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"가되어야합니다.

키워드를 키워드보다 우선 순위가 높은 연산자로 등록하는 것이 좋습니다. 내가 뭘 놓치고 있니?

답변

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;