最近园子里面大家对编译的热情好像都调度上来了,呵呵,好事,
我的这个代码是玩具,首次学习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.cppblog.com/Files/ngaut/LqCompiler%200.2.rar