繁体   English   中英

访问者的antlr4切换语句语法

[英]antlr4 switch statement grammar to visitor

作为编程社区中的许多人,我还尝试为Java的学校项目构建自己的编程语言。 我将intlij与antlr4一起使用,因为在编写测试代码的同时,它有助于生成树。 我创建了一个访问者类,以向代码中添加功能,到目前为止,我能够做出if / else语句和while语句。 因此,我还想创建一个switch语句并将其实现到visitor类。 我对switch语句的语法如下:

switch_rule: SWITCH LPAREN any_var RPAREN LBRACKET case_rule* RBRACKET;

case_rule:  CASE any_var PRES statement;

statement:
    expression
    | rule_ifset
    | rule_for
    | method_call
    | rule_whiledo
    | rule_dowhile
    | switch_rule
    | assign
    |var_declaration;

any_var :INT              # NumericConst
        | DOUBLE           # NumericConst
        | IDENTIFIER       # NumericVariable
        |boolean_var      # BooleanConst;

所以我假设我是这样启动方法的:

@Override
public InputValue visitSwitch_rule(AdamantParser.Switch_ruleContext ctx) {
    InputValue value = this.visit(ctx.any_var().getChild(0));
    if(!value.isInteger()){throw new RuntimeException("switch value is not an integer");}
    else{
           //code to write here
    }

    return InputValue.VOIDval;
}

我想在switch方法中编写case语句,但是我不知道如何从这里开始,也没有找到任何简单的示例...任何人都可以指向正确的方向或提供一些简单的代码吗? 提前致谢。

编辑:我想要的语法的一个简单的示例如下:

switch(aNumber){
   case 1: print("return 1");
   case 2: print("return 2");
}

从您的评论看来,您正在编写一个解释器,该解释器直接在访问者中执行代码,而无需经过任何IR或类似的操作(如果我误解了,请纠正我)。

因此,您的问题是,即使您甚至不知道会有多少个case语句,也不能只在代码内编写一个switch语句-毕竟不能将一个case放入循环中。 即使这不是问题,另一个问题是case语句需要编译时常量,但是您需要将其与从解析树中提取的值一起使用。

如果您正在生成代码,那么这都不是问题,因为您可以使用给定的值生成适当数量的案例,并且一切都会很好。 但是您不是,所以一切都是动态的,您不能使用switch

但是,因为没有人说你必须执行,这不是一个问题, switch使用switch 您可能知道,切换只是编写一系列if语句的一种更方便(而且通常更具性能)的方式。 在您的示例中(假设您的语言包含隐含的break ),则为:

if (aNumber == 1) {
    print("return 1");
} else if (aNumber == 2) {
    print("return 2");
}

这对您的解释器意味着您可以评估要打开的表达式,然后循环遍历所有个案,并针对每种个案将评估的数字与case值进行比较,并使用if 一旦条件之一匹配,就执行关联的代码并退出循环。

如果没有隐含的break ,则应该只在遇到break时才跳出循环,否则使用标志来记住是否已经遇到了真实条件,然后执行每个后续代码块,直到遇到break或到达switch的末端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM