1 回答
TA贡献1884条经验 获得超4个赞
当您调用parser.print()但输入输入时:
***************
* Hello world
***************
DECLAREPROGRAM hw..
PRINT 'Hello World!'..
不起作用。因为print(),解析器需要这样的输入PRINT 'Hello World!'..。对于整个输入,您将不得不调用prog()。此外,明智的做法是使用 EOF 令牌“锚定”您的起始规则,这将强制 ANTLR 消耗整个输入:
progm : stmt+ EOF;
如果您想解析和访问整个解析树(使用prog()),但只对print节点/上下文感兴趣,那么最好使用侦听器而不是访问者。查看此页面如何使用监听器:https ://github.com/antlr/antlr4/blob/master/doc/javascript-target.md
编辑
以下是监听器的工作方式(一个 Python 演示,因为我没有正确设置 JS):
import antlr4
from playground.MygrammarLexer import MygrammarLexer
from playground.MygrammarParser import MygrammarParser
from playground.MygrammarListener import MygrammarListener
class PrintPreprocessor(MygrammarListener):
def enterPrint_(self, ctx: MygrammarParser.Print_Context):
print("Entered print: `{}`".format(ctx.getText()))
if __name__ == '__main__':
source = """
***************
* Hello world
***************
DECLAREPROGRAM hw..
PRINT 'Hello World!'..
"""
lexer = MygrammarLexer(antlr4.InputStream(source))
parser = MygrammarParser(antlr4.CommonTokenStream(lexer))
antlr4.ParseTreeWalker().walk(PrintPreprocessor(), parser.progm())
运行上述代码时,将打印以下内容:
Entered print: `PRINT'Hello World!'..`
因此,简而言之:此侦听器接受您输入的整个解析树,但仅在我们输入print解析器规则时“侦听”。
请注意,我重命名print为print_因为print在 Python 目标中受到保护。
添加回答
举报