如何在解析操作期间指示错误?

  • 本文关键字:指示 错误 操作 parsing sly
  • 更新时间 :
  • 英文 :


在我正在实现的脚本语言中,有效的ID可以由一系列数字组成,这意味着我有一个模棱两可的情况,"345"可以是整数,也可以是ID,直到运行时才知道。到目前为止,我一直在将每个案例都作为 ID 处理,并计划在运行时检查变量是否已以该名称声明,但是当我改进特定代码位的实现时,我发现存在整数有效的情况,但任何其他类型的 ID 都不会有效。似乎将这种特殊情况作为解析错误处理是有意义的,例如,以下激活所有具有大于 5 的咒语等级标签的选秀的代码将被视为有效:

foreach pick in hero where spell.level? > 5
pick.activate[]
nexteach

但是,以下与不会被误认为是整数常量的 ID 进行比较的内容将在解析过程中标记为错误:

foreach pick in hero where spell.level? > threshold
pick.activate[]
nexteach

我已经考虑过单独的令牌,IDID_OR_INTEGER,但这意味着必须在我目前使用ID的任何地方处理这种歧义,这是很多地方,包括变量声明、表达式、循环结构和过程调用。

有没有比打印到错误日志并设置标志更好的方法来指示解析错误?

我会有不同的想法。 如果 ID "只是一个数字"并且还需要纯数字,我会说任何数字字符串都是一个数字,在某些情况下,数字可能会指定一个 ID。

对于裸整数文字(如 345),我会让分词器返回一个 NUMBER 标记,表明它找到了一个整数。 在解析器中,无论您当前接受 ID 的哪个位置,请将其更改为 NUMBER,然后调用查找函数以验证"NUMBER"是否为有效 ID。

我可能误解了你的问题。 您首先谈论"345",但第二个示例没有整数字符串。