当然是简化版的,这是我的作业:
难度等级:较难 目标:实现编译器,生成X86汇编 文法: C0文法 优化:无 中间代码:四元式 目标码:X86汇编 最高分:89
<加法运算符> ::= +|- <乘法运算符> ::= * |/ <关系运算符> ::= <|<=|>|>=|!=|== <字符> ::= _|a|...|z|A|...|Z <数字> ::= 0|<非零数字> <非零数字> ::= 1|...|9 <字符串> ::= "{<合法字符> }" //字符串中可以出现所有合法的可打印字符集中的字符 <程序> ::= [<常量说明部分>][<变量说明部分>]{<子函数定义部分>}<主函数> <常量说明部分> ::= const<常量定义>{,<常量定义>}; <常量定义> ::= <标识符>=<整数> <整数> ::= [+|-]<非零数字>{<数字>}|0 <标识符> ::= <字符>{<字符>|<数字>} <声明头部> ::= int <标识符> <变量说明部分> ::= <声明头部>{,<标识符>}; <子函数定义部分> ::= (<声明头部>|void <标识符>)<参数><复合语句> <复合语句> ::= ‘{’[<常量说明部分>][<变量说明部分>]<语句序列>‘}’ <参数> ::= ‘(’<参数表>‘)’ <参数表> ::= int<标识符>{,int<标识符>} | <空> <主函数> ::= void main‘(’‘)’<复合语句> <表达式> ::= [+|-]<项>{<加法运算符><项>} <项> ::= <因子>{<乘法运算符><因子>} <因子> ::= <标识符>|‘(’<表达式>‘)’|<整数>|<子函数调用语句> <语句> ::= <条件语句>|<循环语句>|‘{’<语句序列>‘}’|<子函数调用语句>; |<赋值语句>; | <返回语句>;|<读语句>;|<写语句>;|; <赋值语句> ::= <标识符>=<表达式> <条件语句> ::= if‘(’<条件>‘)’<语句>[else<语句>] <条件> ::= <表达式><关系运算符><表达式>|<表达式> <循环语句> ::= while‘(’<条件>‘)’<语句> <子函数调用语句> ::= <标识符>‘(’<值参数表>‘)’ <值参数表> ::= <表达式>{,<表达式>}|<空> <语句序列> ::= <语句>{<语句>} <读语句> ::= scanf‘(’<标识符>‘)’ <写语句> ::= printf‘(’<字符串>,<表达式 >|<字符串>|<表达式 >‘)’ <返回语句> ::= return [ ‘(’<表达式>‘)’]
附加说明:(1)返回类型为void的子函数不允许出现在表达式中 (2)子函数的返回类型必须与返回语句匹配,若无返回语句,则子函数必须声明为void类型 (3)标识符不区分大小写字母 (4)写语句中字符串原样输出
还没开始写,唉~. 公司有做过c,和c++编译器, 难度和花费时间一个人不一定能坚持下来, 指普通程序工作者,呵呵
建议楼主先做个简单的, 最基础的词法分析器, 先完成 1 过滤空白字符和注释 2 识别常量 3 把字符形式的表示转化为编译器的内部标识 4 识别标识符(ID)和关键字 5 识别符号 + - * / [ ( { ; : :: 上面都做到了,再考虑语法分析,
编译程序的工作原理: [源程序]-->词法分析-->[Token序列]--->语法分析-->[符号属性表,语法树]--->生成中间代码--->[中间代码]-->代码优化--->[优化后中间代码]--->翻译成目标机器的机器代码-->[目标机器码(目标机器可执行程序)]
解释程序的工作原理: [源程序]-->词法分析-->[Token序列]--->语法分析-->[符号属性表,语法树]--->生成中间代码--->[中间代码]-->代码优化--->[优化后中间代码]--->针对目标机器解释执行中间代码
唯一区别就是编译器生成目标机器可执行码,解释器不生成目标机器可执行代码,比较而言解释程序速度慢, 比如BASIC解释程序, JAVA解释程序, 编译器生成的程序执行速度较快. 比如C语言编译程序, PASCAL编译程序
编译程序和解释程序的前端(词法分析,语法分析)都有自动生成器, 语法分析的生成器有著名的Bell实验室开发的YACC, 可以直接生成LR语法分析程序.编译程序难度最大的地方是目标代码的优化, 几乎90%的工作都花在了上面.
楼主问别人编译程序怎么写, 指点一下, 感觉有点逗, 编译程序是技术含量高,极其复杂的程序, 光指点是指点不出来的, 如果人人都能写编译程序,那么微软的开发平台就没有生意了,
偶写了一个小型的COBOL语言解释程序, 展示词法分析和语法分析,解释执行的的部分模块, 楼主可以去看看. http://www.programfan.com/blog/blog.asp?author=sgcpro
参考资料 http://topic.csdn.net/u/20090116/23/60e403ee-b140-4cae-b4be-41b4a103f042.html
http://bbs.pfan.cn/archives/151/150076.html
http://www.cnblogs.com/itech/archive/2012/03/04/2375746.html#commentform http://www.ibm.com/developerworks/cn/linux/sdk/lex/ http://dinosaur.compilertools.net/ http://www.cppblog.com/woaidongmao/archive/2012/06/15/62322.html
经过探索发现《编译原理》龙书不错,并继续探索了解析器(词法解析,状态机,正则表达式解析等)。还有发现不需要写编译器,用C#编译器动态解析就可以了 探索了编译器动态编译相关内容, 通过探索发现System.CodeDom.Compiler下能实现对,可以动态编译*.cs文件.将用户编写的公式写入*.cs文件编译dll。