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