0

在函数名称和索引标识符以相同的方式编写的意义上,语言的语法是模棱两可的:

var = function(5)    => function call where 5 is a parameter
var = array(5)       => element 5 of the array

为了能够做出区分,我需要先通过并创建一个符号表。之后,我想使用谓词来执行以下操作:

reference
    :       {isFunction(getCurrentToken().getText())}? ident (argumentList?) 
    |       {!isFunction(getCurrentToken().getText())}? ident (subscriptionList)?
    ;

但仍有几个问题:

  • 我是否必须“扩展/继承”解析器才能添加“isFunction”的代码?还是我必须将其放入 .g4 文件本身?
  • 谓词是这里最好的方法,还是有更好的方法来实现这一切?
  • 如何运行解析器两次?如何处理“第一次”运行?(在这种情况下,isFunction 将始终返回 false,因为符号表尚未构建)

不知何故,我觉得必须有一种简单、干净的方法来处理上述问题......

4

1 回答 1

0

不直接是您可能寻求的答案,但我建议在解析后在代码中完成所有操作,而不是两次解析文件或使配对依赖于符号表。

这可以通过允许函数调用/数组访问出现在其中任何一个被允许的地方来完成。

当您稍后将规则转换为内部表示时,您可以根据符号表的知识来区分这两者。

于 2015-02-17T13:02:00.673 回答