2014-10-05 96 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缺少打印在'輸出'

但所有的作品都很好。 如何阻止這個惱人的錯誤?

感謝您的反饋!

+0

你能發表您的樣品輸入? – Onur 2014-10-07 08:42:10

+1

Btw。我會讓'PRINTABLE'成爲解析器規則,即'可打印'。否則,將不會有'STRING','NUMBER'等令牌,因爲它們最終都會成爲'PRINTABLE'令牌。從PRINTABLE開始,單個字符標識符將是「PRINTABLE」而不是標識符。 – Onur 2014-10-07 08:47:16

回答

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');