我正在使用antlr4在python中编写解析器。
简而言之,输入行是:
concept foo bar
分析输入行上方的语法规则是:
start_rule: 'concept' identifier
identifier: ID {ID}
要获取输入行中所有ID的列号和行号,我在enteridentifier(self,ctx)函数中添加代码。
enteridentifier(self, ctx):
context = ctx.start
line_number = context.line
column_number = conext.column
上面的代码段返回第一个ID的列号,即foo。如果同一行号(属于同一规则)(即foo bar)中存在多个ID,那么如何获得两个ID的列号?
在enter
上,您将没有完整的(子)分析树可供评估。而是使用exit
变体或(最好)进行后解析阶段(通常称为语义阶段)以提取此类信息。
[拥有完整的(子)树后,如果特定规则或标记的出现不止一次,则可以在数组的ID
上下文中访问identifier
成员。对此进行迭代以获取各个子元素。