문제

나를 구현하기 위해 노력하고 표현 취급 문법(다루는 중첩된 괄호하고 물건).나는 다음과 같은 지금까지,하지만 그들은 다룰 수 없습니다 어떤 경우(성공/실패사례 나타나 후에 다음의 코드 블록).사람은 무엇일까요?

참고:이 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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top