2014-04-23 2 views
3

나는 ANTLRv4 책에서 석회질/레이블 표현 자습서를하고있는 중이 야를 찾을 수 없습니다 내가 컴파일 할 때 나는이 얻을 :ANTLR4는 : 기호 연산

EvalVisitor.java:33: error: cannot find symbol 
     if (ctx.op.getType() == CalcParser.MUL || ctx.op.getType() == CalcParser.MIDDOT) { 
       ^
    symbol: variable op 
    location: variable ctx of type MulDivContext 

공정에서, 나는 그것을 장난을 조금 수정했습니다. 내 문법은 다음과 같습니다

expr : expr (STAR | FSLASH | DIVIDE | MIDDOT) expr  # MulDiv 

그리고 그 때문에 같은 CommonLexer 파일에 정의되어 있습니다 :

lexer grammar CommonLexerRules; 

    ID      : [a-zAZ]+ ; 
    INT      : [0-9]+ ; 
    STAR     : '*'; 

이 GRUN와 잘 작동 및 테스트 파일이 제대로 lexed된다. 그러나 *에 대한 몇 가지 대안을 정의하여 작동 방식을 변경했다고 생각합니다. 즉, 곱셈을 항상 의미하는 *을 원하지 않으며 곱셈으로서 MIDDOT '·'을 구문 분석하려고합니다.

내 문제는 생성 된 코드에 '.op'이없는 것 같습니다. 이 어떻게 생겼는지

이 같은 것입니다 :

* 
/\ 
a b 

경우 A, B, 그리고 * EXPR 있습니다. 그래서 내가 원하는 것은, 어떤 종류의 토큰으로 * 나는 CalcParser.MUL과 CalcParser.MIDDOT 등을 비교할 수있는 토큰으로 접근하는 것입니다.

어떤 도움을 주시면 감사하겠습니다.

/제이슨

답변

3

컨텍스트는 (당신은 아마 제거) op 속성이 누락. 다시 넣고 당신은 괜찮을한다 :

[a-zA-Z]+ 
:
[a-zAZ]+ 

아마도 당신이 대신이 일을 의미 :

expr : expr op=(STAR | FSLASH | DIVIDE | MIDDOT) expr  # MulDiv 
//   ^
//    | 
//    +--- this one 

, BTW 나는 또한 다음과 같이 당신이 ID를 선언 한 참조

?

+0

OMG, 나는 그것을 놓친다 고 나는 믿을 수 없다. 너 규칙. –

+0

:) 오신 것을 환영합니다. 또한 내 수정 된 답변, btw를 참조하십시오. –