Antlr4 在Antlr中设置已解析值的类型
我有一条规则如下:Antlr4 在Antlr中设置已解析值的类型,antlr4,Antlr4,我有一条规则如下: INTEGER : [0-9]+; myFields : uno=INTEGER COMMA dos=INTEGER 现在要访问uno,我需要编码: Integer i = Integer.parseInt(myFields.uno.getText()) Integer i = myFields.uno 如果我能告诉鹿角帮我做那个转换,那会干净得多;然后我只需要编写代码: Integer i = Integer.parseInt(myFields.uno.getText
INTEGER : [0-9]+;
myFields : uno=INTEGER COMMA dos=INTEGER
现在要访问uno,我需要编码:
Integer i = Integer.parseInt(myFields.uno.getText())
Integer i = myFields.uno
如果我能告诉鹿角帮我做那个转换,那会干净得多;然后我只需要编写代码:
Integer i = Integer.parseInt(myFields.uno.getText())
Integer i = myFields.uno
我的选择是什么?您可以将代码编写为操作,但它仍然是显式转换(最终)。解析器(和每个解析器一样)解析文本,然后由“解析事件”(由侦听器、访问者或ANTLR4中的操作实现)来创建有意义的结构/对象。
当然,您可以扩展一些生成的或内置的类,然后直接获取类型,但如前所述,在某些情况下,您始终需要将文本转换为所需的某种类型。处理令牌上的自定义操作的标准方法是将它们嵌入自定义令牌类中:
public class MyToken extends CommonToken {
....
public Integer getInt() {
return Integer.parseInt(getText()); // TODO: error handling
}
}
也创造
public class MyTokenFactory extends TokenFactory { .... }
以获取自定义标记的源代码。使用lexer#setTokenFactory()将工厂添加到lexer
在自定义标记工厂中
,重写该方法
Symbol create(int type, String text); // (typically override both factory methods)
构造并返回新的MyToken
假设签名包含目标令牌类型type
,则可以返回自定义类型特定的令牌子类,每个子类都有自己的自定义方法
不过,这有几个问题。首先,在实践中,通常不需要它:赋值变量是静态类型的,如OP示例中所示
options { TokenLabelType = "MyToken"; }
Integer i = myFields.uno.getInt(); // no cast required
如果需要整数,请使用getInt()
。如果布尔
其次,ANTLR选项允许设置
TokenLabelType
,以排除手动强制转换自定义令牌的要求。仅支持使用一种令牌标签类型。因此,要使用多个标记类型,需要手动强制转换。有没有办法强制只扩展整数标记?