最近園子里面大家對(duì)編譯的熱情好像都調(diào)度上來(lái)了,呵呵,好事,
我的這個(gè)代碼是玩具,首次學(xué)習(xí)c#,拿起來(lái)就寫(xiě)了,應(yīng)該有一堆的問(wèn)題,
好在還是跑起來(lái)了,呵呵

簡(jiǎn)單介紹下:

版本: 0.1

只支持全局變量
支持加減乘除等運(yùn)算,同時(shí)支持運(yùn)算符優(yōu)先級(jí)
不支持括號(hào),不支持用{}包起來(lái)的語(yǔ)句塊
可以寫(xiě)類似下面的代碼:
int a;
int b;
int c;

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

基本就是一個(gè)支持變量的計(jì)算器:)

文法


/*
 * 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       = "+" | "-"
 * 
*/


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

代碼生成和語(yǔ)法樹(shù)輸出采用Visitor設(shè)計(jì)模式,也是我首次使用設(shè)計(jì)模式。
有問(wèn)題見(jiàn)代碼:
http://m.shnenglu.com/Files/ngaut/LqCompiler%200.2.rar