C# 如何实现if和else语句?在编写语言编译器时
我正在使用JoelPobar编写的这个示例项目。我是从以下方面得到的: 好的,要实现一个简单的打印命令,我需要: 首先在Ast.cs中声明类:C# 如何实现if和else语句?在编写语言编译器时,c#,interpreter,C#,Interpreter,我正在使用JoelPobar编写的这个示例项目。我是从以下方面得到的: 好的,要实现一个简单的打印命令,我需要: 首先在Ast.cs中声明类: // print <expr> public class Print : Stmt { public Expr Expr; } // <stmt> := print <expr> // <expr> := <string> // | <in
// print <expr>
public class Print : Stmt
{
public Expr Expr;
}
// <stmt> := print <expr>
// <expr> := <string>
// | <int>
// | <arith_expr>
// | <ident>
if (this.tokens[this.index].Equals("Printl"))
{
this.index++;
Print print = new Print();
print.Expr = this.ParseExpr();
result = print;
}
else if (stmt is Print)
{
// the "print" statement is an alias for System.Console.WriteLine.
// it uses the string case
this.GenExpr(((Print)stmt).Expr, typeof(string));
this.il.Emit(Emit.OpCodes.Call, typeof(System.Console).GetMethod("WriteLine", new System.Type[] { typeof(string) }));
}
现在,这允许我创建一个解释器并编译一个与语法匹配的文件。此解释器支持变量、循环以及基本打印文本和变量值。然而,我对如何实现if和else语句有点困惑。MSIL有条件分支指令。您必须将条件表达式的结果安排在值堆栈的顶部,然后跳转到else内容(跳过then内容)或不跳转到else内容。then类的末尾将无条件地分支到else类 当然,您需要为else的开头和结尾定义和标记标签。上面的链接包括标签创建 以下是条件分支指令,可在中找到: 请注意,其中许多将比较与条件分支相结合。比如说, 如果value1小于或等于value2,则
ble
指令将控制权转移到指定的目标指令。其效果与执行cgt
指令(cgt.un
用于浮点数)然后执行brfalse
分支到特定目标指令相同
有一个完整的条件示例,实现:
IF A < 100 AND B < 100
RETURN A + B
ELSE
RETURN -1
如果A<100且B<100
返回A+B
其他的
返回-1
我已编辑了您的标题。请看,“,其中的共识是“不,他们不应该”。你说你有循环工作if-else
非常类似于循环控制表达式。您认为可以共享一些用于实现“if”和“else”语句的代码吗?@user2874682:我刚刚添加了一个指向DefineLabel()
文档的链接,这些文档正好有这样一个示例。ILGenerator.DefineLabel()文档让我感到困惑。我不知道应该将什么代码放入哪个文件/类中
IF A < 100 AND B < 100
RETURN A + B
ELSE
RETURN -1