Arrays 使用ANTLR4区分函数调用和索引数组
语言的语法是不明确的,因为函数名和索引标识符是以相同的方式编写的:Arrays 使用ANTLR4区分函数调用和索引数组,arrays,function,antlr4,ambiguous,predicates,Arrays,Function,Antlr4,Ambiguous,Predicates,语言的语法是不明确的,因为函数名和索引标识符是以相同的方式编写的: var = function(5) => function call where 5 is a parameter var = array(5) => element 5 of the array 为了能够做出区分,我需要进行第一次传递并创建一个符号表。之后,我想使用谓词执行以下操作: reference : {isFunction(getCurrentToken().getT
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,因为符号表尚未构造)
不知何故,我觉得必须有一种简单、干净的方法来处理上述问题…这不是您可能会直接找到的答案,但我建议在解析后在代码中完成这一切,不要对文件进行两次解析,也不要使配对依赖于符号表 这可以通过允许函数调用/数组访问出现在允许其中任何一个的位置来实现
当您稍后将规则转换为内部表示时,您可以根据符号表的知识来区分这两者。我认为简单的方法是将两者视为“某物”的调用。将这样的语言解析为AST。一旦你有了类型信息,你就可以知道什么是函数调用,什么是数组访问。但是如果没有更多关于语言的信息,我真的说不出来。