最近園子里面大家對編譯的熱情好像都調度上來了,呵呵,好事,
我的這個代碼是玩具,首次學習c#,拿起來就寫了,應該有一堆的問題,
好在還是跑起來了,呵呵

簡單介紹下:

版本: 0.1

只支持全局變量
支持加減乘除等運算,同時支持運算符優先級
不支持括號,不支持用{}包起來的語句塊
可以寫類似下面的代碼:
int a;
int b;
int c;

a = 10;
b = 2 * a + 3 * 4 - 2 + 5 * 6;

基本就是一個支持變量的計算器:)

文法


/*
 * main = VarDeclaration Statement;
VarDeclaration = {Type Identifier ";"};    
Type =
 | "int"
 | Identifier  ; 
  
Statement = 
 Identifier "=" Expression ";"   ; Assign Expression
  
Expression = AddExp { AddOp MulExp }
AddExp       = MulExp { MulOp MulExp }
MulExp      = factor
factor      =
 | IntegerLiteral   
 | Identifier  
MulOp       = "*" | "/"
AddOp       = "+" | "-"
 * 
*/


最后生成棧式虛擬機代碼,指令集為:
 public enum OpCode
    {
        LdVar,      //加載變量的值到棧頂
        LdConst,    //加載常量到棧頂
        Add,        //加法
        Sub,        //減法
        Mul,        //乘法
        Div,        //除法
        Assign,     //給變量賦值stack.[top-1] = stack.[top]
    }

代碼生成和語法樹輸出采用Visitor設計模式,也是我首次使用設計模式。
有問題見代碼:
http://www.shnenglu.com/Files/ngaut/LqCompiler%200.2.rar