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
value
s。
(学习 grun
命令行实用程序非常有价值,因为它可以测试语法和树结构,而无需涉及您自己的任何代码)
这种情况似乎是你的问题:
if (value.type_literal() == null || value.function_call() == null)
一个或另一个将始终为 null,因此这将失败。
if (value.type_literal() == null && value.function_call() == null)
可能就是你想要的。
我的目标是生成可以处理以下代码的解析器,其中包含命名函数参数和嵌套函数调用
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
value
s。
(学习 grun
命令行实用程序非常有价值,因为它可以测试语法和树结构,而无需涉及您自己的任何代码)
这种情况似乎是你的问题:
if (value.type_literal() == null || value.function_call() == null)
一个或另一个将始终为 null,因此这将失败。
if (value.type_literal() == null && value.function_call() == null)
可能就是你想要的。