ANTLR:忽略解析器中的语句

ANTLR: ignore statements in parser

我在 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。我问的原因是:

我想 return 最后一条语句的结果作为结果 - 但是如果最后有一个额外的 NEWLINE 或 STATEMENT_TERMINATOR,我就没有有意义的 return 值.

-> skip

也不起作用:"Reference to undefined rule 'skip'"。

我也可以让 ANTLR 在解析器级别忽略语句吗?

您只能对词法分析器规则使用 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 (or Listener) 您可以通过以下方式访问最后一条语句:context.stat(context.stat.Length - 1)