【发布时间】:2020-10-16 17:59:48
【问题描述】:
我正在玩 Antlr,设计一种玩具语言,我认为这是大多数人开始的地方! - 我有一个关于如何最好地考虑打开令牌类型的问题。
考虑语言中的“函数调用”,其中函数可以使用字符串、数字或变量 - 例如如下所示(project() 是函数调用)
project("ABC") vs project(123) vs project($SOME_VARIABLE)
我的语法中有更改运算符,所以语法解析正确的东西,但是在访问者代码中,最好能区分上述三个版本之间的区别。
@Override
public ASTRoot visitCreateproj(projectmgmtParser.CreateprojContext ctx) {
try {
s1 = ctx.STRING_LITERAL().getText();
}catch(Exception e){}
try{
s2 = ctx.NUM().getText();
}catch(Exception e){}
System.out.println("Created Project via => " + ctx.getChild(1).toString());
}
上面的代码有效,取决于 s1 或 s2 是否为空,我可以推断我是如何被调用的(使用文字或数字,我没有显示上面的变量大小写),但我如果有更好或更优雅的方式,我很感兴趣 - 例如在访问者代码中切换令牌类型以实际处理语言。
上面的语法是
createproj: 'project('WS?(STRING_LITERAL|NUM)')';
当我使用 intellij antlr 插件时,它似乎知道 project() 函数的参数的令牌类型 - 但我似乎无法从我的代码中得到它。
【问题讨论】: