在我的语法中,我验证了类似这样的布尔表达式:
((foo == true) && (bar != false) || (qux == norf))
我通过调用getText()
从ANTLR4的上下文对象中获取字符串:
def enterBody(self, ctx):
expression = ctx.condition.getText() # condition here being shorthand for a grammar rule (`condition=expr`)
但是,字符串是整个返回的(即每个令牌之间没有空格),我无法知道每个令牌是什么:
((foo==true)&&(bar!=false)||(qux==norf))
理想情况下,我希望它以下列格式存储在列表中:
['(', '(', 'foo', '==', 'true', ')', '&&', '(', 'bar', '!=', 'false', ')', '||', '(', 'qux', '==', 'norf', ')', ')']
ANTLR4 Python文档相当稀疏,我不确定是否有一种方法可以实现这一点。
答案 0 :(得分:1)
Python运行时非常类似于Java运行时,因此您可以查看Java documentation,并且很可能是Python中存在的相同方法。或者浏览source code,这很容易阅读。
你要求获得一个单独的字符串列表。但解析器的整个想法是避免这种情况。所以我认为这很可能不是你需要的东西。请务必注意parse tree and how listeners work。基本上你应该使用树而不是平面列表。您可能正在寻找的是ParserRuleContext.getChildren()
。您可以使用它来访问所有子节点:
def enterBody(self, ctx):
print(list(ctx.getChildren()))
更有可能的是,您希望访问特定类型的子节点以执行某些操作。看一下ANTLR为您生成的解析器。您将找到一堆*Context
类,其中包含访问每种类型子节点的方法。例如ctx
方法的enterBody()
参数是BodyContext
的实例,您可以使用它的所有方法来访问特定类型的子节点。
UPD 如果您的语法只定义了一个布尔表达式,并且您只将它用于验证和标记化,那么根本不需要解析器。只需使用词法分析器获取所有令牌的列表:
input_stream = antlr4.FileStream('input.txt')
# Instantiate an run generated lexer
lexer = BooleanLexer(input_stream)
tokens = antlr4.CommonTokenStream(lexer)
# Parse all tokens until EOF
tokens.fill()
# Print tokens as text (EOF is stripped from the end)
print([token.text for token in tokens.tokens][:-1])