首页 > 解决方案 > ANTLR 类型(ID 选择)

问题描述

我正在编写包含更多类型的 JavaScript 语法,例如 float、int、boolean 等。当我键入以使用 ID(字母或单词)作为键从 Hash Map 获取信息时,我的程序将始终运行到第一个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 正在存储浮点数。

标签: typesantlr

解决方案


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

expr: ...
    | bool
    | float
    ;

并且这将始终进入bool规则,因为它首先出现并且与 . 匹配相同的标记float。通常,在一个规则中有两个备选方案都扩展为相同的标记是没有意义的。

如果 包含在相应的映射中,您可以使用谓词进行bool匹配floatID但这通常不是一个好主意。一种更常见的方法是使用单个映射,其中包含所有变量的条目,无论其类型如何。


PS:在更一般的说明中,您似乎正在尝试直接在解析器中评估表达式(至少返回值的名称表明您正在尝试计算表达式的值)。请注意,这种方法不适用于简单的计算器。一旦您引入任何类型的控制流(函数调用、if 语句、循环),您就会发现无法控制动作中的代码应该执行的时间和频率(当给定的情况下,它总是只执行一次)代码被解析)。您的解析器不应该这样做,而是应该简单地生成一个树或字节码,然后您可以在单独的步骤中执行它们。


推荐阅读