用于解释器的antlr4语法-在输入文件中定义入口点

用于解释器的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

我试图弄清楚如何使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

   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