ANTLR类型(ID选择)

ANTLR type (ID choosing)

我正在编写JavaScript的语法,其中包括更多类型,例如float、int、boolean等。 ) as key,我的程序总是跑到第一个ID,这样会出大问题,谁知道怎么解决?

例如:

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

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

因为我使用 ID 来获取 bool 和 float 的 return,所以它总是首先转到 bool,并且 运行 bool 部分而不是 float 部分甚至 ID 存储浮点数。

当你说 "my program will always go to the first ID" 时,我假设你的意思是你的语法中的其他地方有这样的规则:

expr: ...
    | bool
    | float
    ;

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

您可以使用谓词使 boolfloat 仅在 ID 包含在相应映射中时才匹配,但这通常不是一个好主意。一种更常见的方法是使用一个映射,其中包含所有变量的条目,而不管它们的类型如何。


PS:更笼统地说,您似乎正在尝试直接在解析器中计算表达式(至少 return 值的名称表明您正在尝试来计算表达式的值)。请注意,这种方法将无法超越简单的计算器。一旦引入任何类型的控制流(函数调用、if 语句、循环),您就会发现无法控制操作中的代码何时以及多久执行一次(它总是在给定的时间执行一次)代码被解析)。与其以这种方式进行,您的解析器应该简单地生成一个树或字节码,然后您可以在单独的步骤中执行它。