本文記錄從零建立一個簡易四則運算解譯器的完整過程,涵蓋詞法分析、抽象語法樹(AST)建構、優先序處理與遞迴求值。雖然功能基礎,但展示了解譯器核心架構,適合理解編譯原理入門。
"1 + 2 * 3")切分為 Token 序列(數字 Token、運算子 Token)。internal abstract class Token { }
internal sealed class NumToken : Token
{
public double Value { get; }
}
internal sealed class OpToken : Token
{
public Op Value { get; }
public Priority Priority { get; }
}
internal enum Op : int { Plus = '+', Minus = '-', Multiply = '*', Divide = '/' }
internal enum Priority { Lv0 = 0, Lv1 = 1, Lv2 = 2 } // 越大優先序越高
double 產生 NumToken;偵測重複小數點拋錯。+ - * / 產生 OpToken,攜帶優先序資訊。採用啟發式規則,依序處理 Token:
範例:1 + 2 * 3 產生的 AST 根為 -(若完整式為 1 + 2 * 3 - 4),* 在最深層優先執行。

private double Eval(SyntaxNode root)
{
if (root.Token is NumToken n) return n.Value;
if (root.Token is OpToken op)
{
double l = Eval(root.Left), r = Eval(root.Right);
return op.Value switch
{
Op.Plus => l + r,
Op.Minus => l - r,
Op.Multiply => l * r,
Op.Divide => l / r,
_ => throw new ParseFailureException("Unknown operator")
};
}
throw new ParseFailureException("Invalid node");
}
解譯器能識別:非法字元、格式錯誤的數字(如 2.3.4)、運算子連續(2 * + 3)、缺少運算元等語法錯誤,並回報錯誤位置。
let 綁定。
