最近園子里面大家對(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