用于解释器的antlr4语法-在输入文件中定义入口点
我试图弄清楚如何使antlr4在输入文件中的给定点而不是顶部执行。我听取了SO用户的建议,并开始使用Antlr4访问者解决方案 我的输入文件声明了类似“BASIC”的子例程,并且在底部有一个Main。输入文件示例:用于解释器的antlr4语法-在输入文件中定义入口点,antlr4,Antlr4,我试图弄清楚如何使antlr4在输入文件中的给定点而不是顶部执行。我听取了SO用户的建议,并开始使用Antlr4访问者解决方案 我的输入文件声明了类似“BASIC”的子例程,并且在底部有一个Main。输入文件示例: #Program hello; Sub mysub1() print "please dont call me but I know you will"; End Sub Sub mysub2() #code End Sub
#Program hello;
Sub mysub1()
print "please dont call me but I know you will";
End Sub
Sub mysub2()
#code
End Sub
Main() #execute code from here
call mysub2;
EndMain
毫不奇怪,它在Sub中执行任何代码,因为它不知道从顶部开始有什么不同
我的语法文件包括
prog
: stat* 'Main' stat* 'EndMain' EOF
;
stat
: call_sub
| assignment
| if_stat
| while_stat
...
因此,第一个stat*执行-这就是我的观点,我如何从Main开始执行。e、 g.如何发现/获取“主”令牌/规则,然后开始访问该令牌/规则,而不是访问文件/树的顶部
非常感谢
Kevin我的解决方案是在扩展的BaseVisitor类中声明一个布尔maindone=false,然后在我的
public Value visitBeginSublabel(@NotNull t5Parser.BeginSublabelContext ctx) {
if (maindone == false){
subs.put(ctx.ID().toString(),ctx); // stash the function/sub name to HashMap
//main not done. skipping activity
return null;
}
...
}
在拜访来访者时
@Override public Value visitMain(@NotNull t5Parser.MainContext ctx) {
maindone=true;
...
这似乎成功了。我还整理了语法,以便在全局级别只能声明变量和一些其他必要的项
我并不是说这是做这个练习的完美方式,但它确实奏效了。我也宣布
public Map< String,t5Parser.BeginactivitylabelContext>subs = new HashMap<String,t5Parser.BeginactivitylabelContext>();
其中我的源文件有一个
Main
call myfunction()
EndMain
我才做了一个星期,所以在寻找建议和更好的答案
Main
call myfunction()
EndMain