ANTLR:忽略解析器中的语句

时间:2016-03-14 07:50:11

标签: compiler-construction antlr antlr4 ebnf

我在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语句?

1 个答案:

答案 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)