types - 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 正在存储浮点数。
解决方案
当您说“我的程序将始终使用第一个 ID”时,我假设您的意思是您的语法中的其他地方有这样的规则:
expr: ...
| bool
| float
;
并且这将始终进入bool
规则,因为它首先出现并且与 . 匹配相同的标记float
。通常,在一个规则中有两个备选方案都扩展为相同的标记是没有意义的。
如果 包含在相应的映射中,您可以使用谓词进行bool
匹配float
,ID
但这通常不是一个好主意。一种更常见的方法是使用单个映射,其中包含所有变量的条目,无论其类型如何。
PS:在更一般的说明中,您似乎正在尝试直接在解析器中评估表达式(至少返回值的名称表明您正在尝试计算表达式的值)。请注意,这种方法不适用于简单的计算器。一旦您引入任何类型的控制流(函数调用、if 语句、循环),您就会发现无法控制动作中的代码应该执行的时间和频率(当给定的情况下,它总是只执行一次)代码被解析)。您的解析器不应该这样做,而是应该简单地生成一个树或字节码,然后您可以在单独的步骤中执行它们。