在SSCLI里附带了两个示例编译器源码,用来演示CLR整个架构的弹性,一个是简化版的lisp编译器,一个是简化版的C编译器。lisp在国内用的少,因此这里我们主要看看C编译器的源码,源码位置是:\sscli20\samples\compilers\myc

为了简单起见,该编译器实现了C语言的子集,如只支持 int  和void 类型,可以声明静态和局部变量,但是局部变量只能在函数的顶部声明,只支持 if-else、while和for等语句。编译器将C程序编译成MSIL语言,再调用IL编译器产生.NET程序,完整的语法如下表:

letter ::= “A-Za-z”;

digit ::= “0-9″;

name ::= letter { letter | digit };

integer ::= digit { digit };

ident ::= name | function_call;

function_call ::= name “(” [expr {, expr}] “)”;

factor ::= (ident | integer | “(” expr “)” );

unary_factor ::= [“+”|”-“] factor;

term1 ::= [“*”|”/”] factor;

term0 ::= factor { term1 };

first_term ::= unary_factor term1;

math_expr ::= first_term { [“+”|”-“] term0 }

rel_expr ::= math_expr (“==”|”!=”|”<“|”>”|”>=”|”<=”) math_expr;

not_factor ::= [“!”] rel_expr;

term_bool ::= not_factor { (“&” | “&&”) not_factor };

bool_expr ::= term_bool { (“|” | “^”) term_bool };

expr ::= bool_expr;

assign = ident “=” expr;

assign_stmt ::= assign “;” ;

if_stmt ::= “if” “(” expr “)” stmt_block [ “else” inner_block ];

while_stmt ::= “while” “(” expr “)” inner_block;

for_stmt ::= “for” “(” assign “;” expr “;” assign “)” inner_block

break_stmt ::= “break” “;”;

cont_stmt ::= “continue” “;”;

ret_stmt ::= “return” expr “;”;

stmt ::= (

if_stmt

| while_stmt

| for_stmt

| break_stmt

| cont_stmt

| ret_stmt

| assign_stmt

);

inner_block ::= “{” { stmt } “}”;

outer_block ::= “{” { inner_decl } { stmt } “}”;

inner_decl ::= [ class ] type ident { “,” ident } “;”;

class ::= “extern” | “static” | “auto”;

type ::= “int” | “void”;

params ::= type ident { , type ident };

outer_decl ::= [ class ] type ident { “,” ident } “;”;

func_decl ::= [ class ] type ident “(” params “)” outer_block;

编译器支持的参数如下表:

参数 说明
/debug 生成程序时创建调试信息
/nodebug 不创建调试信息
/list 输出MSIL中间源文件
/dll 创建一个DLL文件
/exe 创建一个可执行的.exe文件
/outdir:path 保存输出文件的文件夹

整个编译器的架构如下图所示:

最新文章

  1. 3-PHP全部编码UTF-8
  2. TOJ3136
  3. vagrant初始登录失败的一般性解决方案
  4. XML解析之DOM详解及与SAX解析方法的比较
  5. 自罚一杯-PHP基础(一)
  6. jquery 获取选择符
  7. 使用Docker搭建consul集群+registrator实现服务自动注册。
  8. 开发成功-cpu-mem监控动态折线图--dom esayui js java
  9. I.MX6 U-boot PWM hacking
  10. java根据url获取json对象
  11. JavaScript实现简单的打印功能
  12. Windows下Vundle插件BundleSearch命令出现错误解决方案
  13. JavaScript 堆
  14. boost ASIO实例
  15. android 代码动态创建视图
  16. 201521123012 《Java程序设计》第九周学习总结
  17. Jquery+Ajax限制查询间隔
  18. hbmy周赛1--A
  19. Android studio报Error:(26, 13)-v7:27.错误的解决方法
  20. 1032. Sharing (25)

热门文章

  1. TreeSet函数
  2. 替换res\drawable中的图片
  3. 我的solr学习笔记--solr admin 页面 检索调试
  4. Electron 前端页面导入jQuery 出现错误Uncaught ReferenceError: jQuery is not defined
  5. KVC &amp; KVO 入门
  6. leetcode67
  7. XP系统下 VS2010 选中行崩溃
  8. POJ2533 最长递增子序列
  9. 5-青蛙的约会(ex_gcd)
  10. linux下的shell运算(加、减、乘、除