2014-12-16 10 views
1

찾을 수 없습니다 :ANTLR 심볼을 기본적으로 내가이 간단한 문법을 ​​구현해야합니다 ANTLR 프로젝트에서 일하고 있어요

WS : ' ' 
    ; 


MINUS : '-' ; 



DIGIT : '0'..'9' 
    ; 

int4  
@init{ 
int n = 0; 
} 
:  (({n<4}?=> WS {n++;})* (MINUS{n++;})?({n<4}?=> DIGIT{n++;})*){n==4}?  ; 



numbers 
    : (int4)*; 

INT4 포트란의 형식 I4를 따라

(폭 넷과의 정수를 의미) 이 코드는 다음 오류를 제공합니다.

[10:17:20] C:\Users\guille\Documents\output\testParser.java:277: cannot find symbol 
[10:17:20] symbol : variable n 
[10:17:20] location: class testParser 
[10:17:20]      if ((evalPredicate(n==4,"n==4"))) { 
[10:17:20]          ^
[10:17:20] C:\Users\guille\Documents\output\testParser.java:283: cannot find symbol 
[10:17:20] symbol : variable n 
[10:17:20] location: class testParser 
[10:17:20]     else if ((LA4_0==WS) && (evalPredicate(n<4,"n<4"))) { 
[10:17:20]              ^
[10:17:20] C:\Users\guille\Documents\output\testParser.java:289: cannot find symbol 
[10:17:20] symbol : variable n 
[10:17:20] location: class testParser 
[10:17:20]     else if ((LA4_0==DIGIT) && (evalPredicate(n<4,"n<4"))) { 
[10:17:20]               ^
[10:17:20] 3 errors 

아이디어가 있습니까?

+0

@BartKiers 기본적으로 이것은 헤더에'문법 테스트; '를 추가하는 문법입니다. 나는 옵션 {...}을 사용하지 않았다. 필자는 ANTLRWorks 만 테스트했기 때문에 드라이버 클래스를 사용하지 않았습니다. 이 오류는 ANTLRWorks 도구에 의해 던졌습니다. – Cyberguille

+0

@BartKiers 문법이 성공적으로 생성되었습니다. 문제는 내가 컴파일러를 디버깅 할 때 실패하고 질문에 나타나는 오류를 던집니다. – Cyberguille

+0

아, 오해. 나는 문법을 생성 할 때 생각했다. 이제 나는 그들이 정말로 컴파일러 오류라고 봅니다. v3 (3.5.2)의 최신 버전을 사용해보십시오. 문제가 계속되는 경우 http://www.antlr3.org/pipermail/antlr-interest/2007-August/023111.html –

답변

1

로컬 변수 n은 조건자를 평가할 위치로 전달되지 않습니다. 생성 된 소스를 보면, 더 나은 이해를 위해

:

int4 
scope { int n; } 
@init { $int4::n = 0; } 
: ({$int4::n < 4}?=> WS {$int4::n++;})* 
    (MINUS {$int4::n++;})? 
    ({$int4::n < 4}?=> DIGIT{$int4::n++;})* 
    {$int4::n == 4}? 
; 

관련 : 당신은 술어 내에서 사용할 수있는 범위를 정의 할 필요가 문법의 코드 및 생성 된 문법 코드를 사용합니다.

+0

답장을 보내 주셔서 감사합니다. 내 질문에 대답. 내가 또 다른 문제를 발견하고 또 다른 [질문] (http://stackoverflow.com/questions/27605243/semantic-predicates-antlr-dont-recognize-chain-of-integers-of-width-4)과 같은 문법 – Cyberguille