![](/img/trans.png)
[英]ANTLR4 grammar: evaluation by listener/visitor or better with recursions?
[英]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.