在函数名称和索引标识符以相同的方式编写的意义上,语言的语法是模棱两可的:
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,因为符号表尚未构建)
不知何故,我觉得必须有一种简单、干净的方法来处理上述问题......