ANTLR4 - 命名函数参数

ANTLR4 - named function arguments

我的目标是生成可以处理以下代码的解析器,其中包含命名函数参数和嵌套函数调用

fnCallY(namedArgStr = "xxx", namedArgZ=fnCallZ(namedArg="www"))

G4 语言文件:


val : type_string
     | function_call
     ;

function_call : function_name=ID arguments='('argument? (',' argument)* ')';

argument : name=ID '=' value=val   ;

ID : [a-zA-Z_][a-zA-Z0-9_]*;

type_string : LITERAL;

fragment ESCAPED_QUOTE : '\"';

LITERAL : '"' ( ESCAPED_QUOTE | ~('\n'|'\r') )*? '"'
        | '\'' ( ESCAPED_QUOTE | ~('\n'|'\r') )*? '\'';


@Override
public void exitFunction_call(Test.Function_callContext ctx) {
    List<Test.ArgumentContext> argument = ctx.argument();
    for (Test.ArgumentContext arg : argument) {
         Token name = arg.name;
         Test.ValContext value = arg.value;
         if (value.type_literal() == null || value.function_call() == null) {
             throw new RuntimeException("Could not parse argument value");
         }
     }
}

arg.name 保存正确的数据,但我无法让解析器解析 = 之后的部分。

解析器正在识别 argument values。

(学习 grun 命令行实用程序非常有价值,因为它可以测试语法和树结构,而无需涉及您自己的任何代码)

这种情况似乎是你的问题:

 if (value.type_literal() == null || value.function_call() == null) 

一个或另一个将始终为 null,因此这将失败。

 if (value.type_literal() == null && value.function_call() == null) 

可能就是你想要的。