ANTLR 문법에 대한 표정
-
12-09-2019 - |
문제
나를 구현하기 위해 노력하고 표현 취급 문법(다루는 중첩된 괄호하고 물건).나는 다음과 같은 지금까지,하지만 그들은 다룰 수 없습니다 어떤 경우(성공/실패사례 나타나 후에 다음의 코드 블록).사람은 무엇일까요?
참고:이 varname+= 고 varname= 물건은 그냥 몇 가지 추가 AST 세대우에 XText.그들에 대해 걱정하지 마십시오니다.
...
NilExpression returns Expression:
'nil';
FalseExpression returns Expression:
'false';
TrueExpression returns Expression:
'true';
NumberExpression returns Expression:
value=Number;
StringExpression returns Expression:
value=STRING; //EllipsesExpression: '...';
//FunctionExpression: function=function; //don't allow random functions
UnaryExpression:
op=unop ('(' expr=Expression ')')|expr=Expression;
BinaryExpression:
'or'? AndOp; //or op
AndOp:
'and'? ComparisonOp;
ComparisonOp:
('>'|'<'|'>='|'<='|'=='|'~=')? ConcatOp;
ConcatOp:
'..'? AddSubOp;
AddSubOp:
('+' '-')? MultDivOp;
MultDivOp:
('*' '/')? ExpOp;
ExpOp:
'^'? (('(' expr=Expression ')')|expr=Expression);
ExprSideOne : Variable|NilExpression|FalseExpression|TrueExpression|
NumberExpression|StringExpression|UnaryExpression;
Expression:
(
'('
expression1=ExprSideOne expression2+=BinaryExpression*
')'
)
|
( expression1=ExprSideOne expression2+=BinaryExpression* )
;
...
그리고 여기에 목록을 분석/실패합니다.
c = ((b)); //fails
c = ((a not b)); //fails
c = b; //parses
d = (b); //parses
해결책
What's going on 는 당신의 표정/표정을 지원 괄호 안의 단 하지만 여러 괄호(당신이 체결).가 없 ANTLR 특정을 경험 하지만 나와 함께 일 Javacc 공유하는 많은 유사한 개념(쓴 문법을 위한 프롤로그...묻지 않음).
을 처리하는 중첩 괄호 안에,당신은 일반적으로 무언가가 있다.
ParenthesisExpression: '(' (ParenthesisExpression | Expression) ')';
이 의미는 표현은 하나 포장에 괄호 또는 그것은 단지 원시 표현이다.는 방법에 관해 AST 거래와 함께 이 ParenthesisExpression'은 표정,그래서 그것을 표현할 수 있는 서브 클래스로 나의 구현(Expression 이 인터페이스/추상 클래스의 종류).
다른 팁
사용하십시오 ^
배치 ~ 후에 토큰/규칙 이름은 표현식을 정의하는 데 매우 유용합니다.
expression : e1 (OR^ e1)* ;
e1 : e2 (AND^ e2)*;
e2 : e3 (PIPE^ e3)*;
e3 : e4 (ANDSYMB^ e4)*;
e4 : e5 ((EQUAL^|NOTEQUAL^) e5)*;
e5 : e6 ((LESS^|GREATER^) e6)*;
e6 : e7 ((PLUS^|MINUS^) e7)* ;
e7 : e8 ((STAR^|SLASH^) e8)* ;
e8 : e9 (NEW^ ID LPAREN RPAREN)*;
e9 : (NOT^)? e10;
e10 : e11 | call_def;
e11 : constant
| '(' expression ')' -> expression;
이 문법을 간단한 표현에 사용했습니다.http://fisheye2.atlassian.com/browse/~raw, R=5175/antlr-examples/c/polydiff/poly.g
또한이 프로젝트에 문법이 포함 된 문법을 사용하여보다 복잡한 표현을 사용했습니다.http://www.codeproject.com/kb/recipes/sota_expression_evaluator.aspx