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
,以排除手动强制转换自定义令牌的要求。仅支持使用一种令牌标签类型。因此,要使用多个标记类型,需要手动强制转换。

有没有办法强制只扩展整数标记?