Types ANTLR类型(ID选择)

Types ANTLR类型(ID选择),types,antlr,Types,Antlr,我正在编写JavaScript语法,其中包含更多类型,如float、int、boolean等。当我使用ID(字母或单词)作为键从哈希映射中键入信息时,我的程序将始终转到第一个ID,这将导致一个大问题,有人知道我如何解决它吗 例如: bool returns [boolean value] : ID {$value = hashmap.get($ID.text);} ; float returns [float value] : ID {$value = hashmap.get($I

我正在编写JavaScript语法,其中包含更多类型,如float、int、boolean等。当我使用ID(字母或单词)作为键从哈希映射中键入信息时,我的程序将始终转到第一个ID,这将导致一个大问题,有人知道我如何解决它吗

例如:

bool returns [boolean value]
:    ID {$value = hashmap.get($ID.text);}
;

float returns [float value]
:    ID {$value = hashmap.get($ID.text);}
;
因为我使用ID来获取bool和float的返回值,所以它总是先转到bool,然后运行bool部分而不是float部分,即使ID存储了float编号。

当您说“我的程序将始终转到第一个ID”时,我假设您的意思是,在语法的其他地方,您有这样一个规则:

expr: ...
    | bool
    | float
    ;
这将始终进入
bool
规则,因为它首先出现并匹配与
float
相同的标记。一般来说,在一个规则中有两个可供选择的扩展到相同的令牌是没有意义的

如果使用谓词将
ID
包含在相应的映射中,则可以仅使
bool
float
匹配,但这通常不是一个好主意。一种更常见的方法是使用一个单独的映射,其中包含所有变量的条目,而不管其类型如何


PS:更一般地说,看起来您正试图在解析器中直接计算表达式(至少返回值的名称表明您正在尝试计算表达式的值)。请注意,除了简单的计算器之外,这种方法不会起作用。只要引入任何类型的控制流(函数调用、if语句、循环),您就会发现无法控制操作中的代码应该在何时执行以及执行的频率(解析给定代码时,它总是只执行一次)。与其这样做,解析器应该只生成一个树或字节码,然后在单独的步骤中执行