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)
我在 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)