最近園子里面大家對編譯的熱情好像都調度上來了,呵呵,好事,
我的這個代碼是玩具,首次學習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