我正在用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。如果同一行号(属于同一规则)中存在多个ID,即foo-bar,那么如何获取两个ID的列号
在
enter
上,您将无法准备好整个(子)解析树进行计算。取而代之的是使用exit
变量或(更好的是)进行后解析阶段(通常称为语义阶段)来提取此类信息一旦有了一个完整的(子)树,您就可以访问
identifier
上下文中的ID
成员,这是一个数组,如果可以出现一个以上的特定规则或标记。对其进行迭代以获得单个子元素要获取
ID
的列信息,请使用for lexer标记getChild()
调用返回一个TerminalNode
实例(您必须将结果强制转换为该实例)。从那里调用getSymbol()
,它将为您提供一个Token
实例,该实例依次包含特定标记的所有信息,如文本、频道、列、行、类型等相关问题 更多 >
编程相关推荐