2014-10-05 98 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');