我在ANTLR4中定义了以下内容:
prog: stat+ ;
stat:
ID '=' expr STATEMENT_TERMINATOR #Assignment
| QUESTIONMARK text=STRING? expr? STATEMENT_TERMINATOR #Print
| ID '=' QUESTIONMARK prompt=STRING? STATEMENT_TERMINATOR #Input
| NEWLINE #StatementTerminator
| STATEMENT_TERMINATOR #NewLine
;
我想知道如何让解析器在程序结束时忽略NEWLINE和STATEMENT_TERMINATORS。我问的原因是:
我想返回最后一个语句的结果作为结果 - 但如果最后有一个额外的NEWLINE或STATEMENT_TERMINATOR,我没有得到有意义的返回值。
-> skip
也不起作用:"参考未定义的规则'跳过'"。
我是否也可以在解析器级别创建ANTLR ignore语句?
答案 0 :(得分:1)
您只能将skip
命令用于词法分析器规则,而不是解析器规则。在你的情况下,我建议通过以下方式重写语法:
prog: stat+ ;
stat:
ID '=' expr STATEMENT_TERMINATOR #Assignment
| QUESTIONMARK text=STRING? expr? STATEMENT_TERMINATOR #Print
| ID '=' QUESTIONMARK prompt=STRING? STATEMENT_TERMINATOR #Input
;
NEWLINE: [\r\n] -> skip;
STATEMENT_TERMINATOR: ';' -> skip;
此外,您可以对这些终端使用channel(HIDDEN)
命令。
Onward In Visitor(或Listener)您可以通过以下方式访问最后一个语句:context.stat(context.stat.Length - 1)