使用 ANTLR4 区分函数调用和索引数组
Distinguish between function calls and indexed arrays using ANTLR4
在函数名称和索引标识符以相同方式书写的意义上,一种语言的语法是不明确的:
var = function(5) => function call where 5 is a parameter
var = array(5) => element 5 of the array
为了能够做出区分,我需要进行第一遍并创建一个符号 table。之后我想使用谓词来做类似的事情:
reference
: {isFunction(getCurrentToken().getText())}? ident (argumentList?)
| {!isFunction(getCurrentToken().getText())}? ident (subscriptionList)?
;
但仍有几个问题:
- 我是否必须 "extend/inherit" 解析器添加 "isFunction" 的代码?还是我必须将它放在 .g4 文件本身中?
- 这里谓词是最好的方法,还是有更好的方法来实现这一切?
- 如何运行解析器两次?如何处理"first"运行? (在这种情况下,isFunction 将始终 return false,因为符号 table 尚未构建)
不知何故我觉得必须有一种简单、干净的方法来处理上述问题...
不是您可能寻求的直接答案,但我建议在解析后在代码中全部完成,而不是两次解析文件或使配对依赖于符号 table。
这可以通过允许函数调用/数组访问出现在其中任何一个被允许的地方来实现。
后面将规则转化为内部表示时,可以根据符号的知识来区分这两者table。
在函数名称和索引标识符以相同方式书写的意义上,一种语言的语法是不明确的:
var = function(5) => function call where 5 is a parameter
var = array(5) => element 5 of the array
为了能够做出区分,我需要进行第一遍并创建一个符号 table。之后我想使用谓词来做类似的事情:
reference
: {isFunction(getCurrentToken().getText())}? ident (argumentList?)
| {!isFunction(getCurrentToken().getText())}? ident (subscriptionList)?
;
但仍有几个问题:
- 我是否必须 "extend/inherit" 解析器添加 "isFunction" 的代码?还是我必须将它放在 .g4 文件本身中?
- 这里谓词是最好的方法,还是有更好的方法来实现这一切?
- 如何运行解析器两次?如何处理"first"运行? (在这种情况下,isFunction 将始终 return false,因为符号 table 尚未构建)
不知何故我觉得必须有一种简单、干净的方法来处理上述问题...
不是您可能寻求的直接答案,但我建议在解析后在代码中全部完成,而不是两次解析文件或使配对依赖于符号 table。
这可以通过允许函数调用/数组访问出现在其中任何一个被允许的地方来实现。
后面将规则转化为内部表示时,可以根据符号的知识来区分这两者table。