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
相同的标记。通常,在一个规则中有两个扩展为相同标记的备选方案是没有意义的。
您可以使用谓词使 bool
和 float
仅在 ID
包含在相应映射中时才匹配,但这通常不是一个好主意。一种更常见的方法是使用一个映射,其中包含所有变量的条目,而不管它们的类型如何。
PS:更笼统地说,您似乎正在尝试直接在解析器中计算表达式(至少 return 值的名称表明您正在尝试来计算表达式的值)。请注意,这种方法将无法超越简单的计算器。一旦引入任何类型的控制流(函数调用、if 语句、循环),您就会发现无法控制操作中的代码何时以及多久执行一次(它总是在给定的时间执行一次)代码被解析)。与其以这种方式进行,您的解析器应该简单地生成一个树或字节码,然后您可以在单独的步骤中执行它。
我正在编写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
相同的标记。通常,在一个规则中有两个扩展为相同标记的备选方案是没有意义的。
您可以使用谓词使 bool
和 float
仅在 ID
包含在相应映射中时才匹配,但这通常不是一个好主意。一种更常见的方法是使用一个映射,其中包含所有变量的条目,而不管它们的类型如何。
PS:更笼统地说,您似乎正在尝试直接在解析器中计算表达式(至少 return 值的名称表明您正在尝试来计算表达式的值)。请注意,这种方法将无法超越简单的计算器。一旦引入任何类型的控制流(函数调用、if 语句、循环),您就会发现无法控制操作中的代码何时以及多久执行一次(它总是在给定的时间执行一次)代码被解析)。与其以这种方式进行,您的解析器应该简单地生成一个树或字节码,然后您可以在单独的步骤中执行它。