Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用ANTLR4区分函数调用和索引数组_Arrays_Function_Antlr4_Ambiguous_Predicates - Fatal编程技术网

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。一旦你有了类型信息,你就可以知道什么是函数调用,什么是数组访问。但是如果没有更多关于语言的信息,我真的说不出来。