2014-10-05 3 views
0

나는이 문법이 작동 :ANTLR은 오류가 발생하지만, 문법

라인 :

grammar Flow; 

@header { import java.util.HashMap; } 

@members { HashMap<String, String> vars = new HashMap<>(); } 

WS:   (' '|'\n'|'\r'|'\t') -> skip; 

flow:  (print|var)+ EOF; 

print:  'print' (toPrint=PRINTABLE { System.out.println($toPrint.text); })|(id=ID { 
    if (vars.containsKey($id.text)) { 
     System.out.println(vars.get($id.text)); 
    } else { 
     System.err.println("This variable is not assigned!"); 
    } 
}); 

var:  'var' id=ID '=' val=PRINTABLE { vars.put($id.text, $val.text); }; 

PRINTABLE: STRING|NUMBER|LETTER|DIGIT; 

STRING:  '"' (.)*? '"'; 

fragment LETTER: ('a'..'z'|'A'..'Z'); 
fragment DIGIT: ('0'..'9'); 

NUMBER:  DIGIT+ ('.' DIGIT+)?; 

ID:   LETTER (LETTER|DIGIT)*; 

내가 시작 규칙 '흐름'을 호출하고 일부 유효한 변수를 입력하고 인쇄를 시도, TestRig이 오류가 발생을 2 : 6 누락 된 '출력'에서 PRINTABLE

하지만 모두 잘 작동합니다. 이 성가신 오류를 차단하는 방법은 무엇입니까?

의견에 감사드립니다.

+0

당신이 당신의 샘플 입력을 게시 할 수 있습니까? – Onur

+1

Btw. 나는'PRINTABLE'을 파서 (parser) 규칙, 즉'printable '로 만들 것입니다. 그렇지 않으면'STRING','NUMBER' 등의 토큰이 없기 때문에 모두'PRINTABLE' 토큰이됩니다. 또한 단일 문자 식별자는'PRINTABLE'이 먼저 오기 때문에 식별자가 아닌'PRINTABLE'이 될 것입니다. – Onur

답변

0

하지 문제에 대한 해결책하지만, 내 댓글에 언급 된 문제를 해결 문법의 약간 개선 된 버전 :

grammar Flow; 

@header { import java.util.HashMap; } 

@members { HashMap<String, String> vars = new HashMap<>(); } 

WS:   (' '|'\n'|'\r'|'\t') -> skip; 

flow:  (print|var)+ EOF; 

print:  'print' (toPrint=printable { System.out.println($toPrint.text); }) 
      | (id=ID { 
         if (vars.containsKey($id.text)) { 
         System.out.println(vars.get($id.text)); 
         } else { 
          System.err.println("This variable is not assigned!"); 
         } 
        } 
      ) 
      ; 

var:  'var' id=ID '=' val=printable { vars.put($id.text, $val.text); }; 

printable: STRING|NUMBER|ID|NUMBER; 

STRING:  '"' (.)*? '"'; 

NUMBER:  DIGIT+ ('.' DIGIT+)?; 

ID:   LETTER (LETTER|DIGIT)*; 

fragment LETTER: ('a'..'z'|'A'..'Z'); 
fragment DIGIT: ('0'..'9'); 
관련 문제