Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何实现if和else语句?在编写语言编译器时_C#_Interpreter - Fatal编程技术网

C# 如何实现if和else语句?在编写语言编译器时

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

我正在使用JoelPobar编写的这个示例项目。我是从以下方面得到的:

好的,要实现一个简单的打印命令,我需要:

首先在Ast.cs中声明类:

// 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