在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 保存输出文件的文件夹

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

.NET框架源码解读之MYC编译器的更多相关文章

  1. .NET框架源码解读之SSCLI编译过程简介

    前文演示了编译SSCLI最简便的方法(在Windows下): 在“Visual Studio 2005 Command Prompt”下,进入SSCLI的根目录: 运行 env.bat 脚本准备环境: ...

  2. .NET框架源码解读之启动CLR

    前面提到在SSCLI环境里运行.NET程序的时候,执行的命令类似java程序的执行过程,即通过clix程序解释执行.net程序.这个过程看起来跟在windows环境下执行.net程序表面上看起来不一样 ...

  3. .NET框架源码解读之准备CLR源码阅读环境

    微软发布了CLR 2.0的源码,这个源码是可以直接在freebsd和windows环境下编译及运行的,请在微软shared source cli(http://www.microsoft.com/en ...

  4. .NET框架源码解读之SSCLI的调试支持

    阅读源码一个比较快的手段就是在调试器里阅读,这样可以在实际运行SSCLI的过程中,通过堆栈跟踪的方式查看完整的程序执行路径. 当在SSCLI环境里执行一个托管程序的时候,堆栈上通常有托管和非托管代码同 ...

  5. jQuery框架源码解读

    1.jQuery 1.9.1 parseJSON: function( data ) { // Attempt to parse using the native JSON parser first ...

  6. Vue 源码解读(8)—— 编译器 之 解析(下)

    特殊说明 由于文章篇幅限制,所以将 Vue 源码解读(8)-- 编译器 之 解析 拆成了两篇文章,本篇是对 Vue 源码解读(8)-- 编译器 之 解析(上) 的一个补充,所以在阅读时请同时打开 Vu ...

  7. Vue 源码解读(10)—— 编译器 之 生成渲染函数

    前言 这篇文章是 Vue 编译器的最后一部分,前两部分分别是:Vue 源码解读(8)-- 编译器 之 解析.Vue 源码解读(9)-- 编译器 之 优化. 从 HTML 模版字符串开始,解析所有标签以 ...

  8. 基于Docker的TensorFlow机器学习框架搭建和实例源码解读

    概述:基于Docker的TensorFlow机器学习框架搭建和实例源码解读,TensorFlow作为最火热的机器学习框架之一,Docker是的容器,可以很好的结合起来,为机器学习或者科研人员提供便捷的 ...

  9. Restful 1 -- REST、DRF(View源码解读、APIView源码解读)及框架实现

    一.REST 1.什么是编程? 数据结构和算法的结合 2.什么是REST? - url用来唯一定位资源,http请求方式来区分用户行为 首先回顾我们曾经做过的图书管理系统,我们是这样设计url的,如下 ...

随机推荐

  1. HDU 4438 Hunters

    Hunters Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  2. canvas合成和裁剪

    canvas合成和裁剪 属性 globalCompositeOperation=type 设置覆盖类型 source-over 源覆盖在目标上 source-in 源覆盖在目标上的公共部分(只取源图形 ...

  3. 「小程序JAVA实战」小程序的分享和下载功能(69)

    转自:https://idig8.com/2018/09/25/xiaochengxujavashizhanxiaochengxudefenxianghexiazaigongneng68/ 在小程序上 ...

  4. html 1.0 鼠标放上去会亮 onmouseover onmouseout 以及this标签的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. <form> 表单提交 return 阻止内容为空事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. Jboss:The LogManager was not properly installed (you must set the "java.util.logging.manager" system prop

    可能是jboss的服务器版本选择不对 ,比如我本地的Jboss服务器版本是  jboss-as-web-7.0.2.Final,选择的服务器版本是JBOOS  V7.1  Runtime ,就会报上面 ...

  7. ajax传参里含有特殊字符的坑

    问题场景:今天在测试自己手上的页面功能时,发现一个小bug,在用ajax向后台发数据时,只要参数中出现一些特殊字符,控制台会报错http 400的问题,其实就是特殊字符服务器不能解析.好了,问题是找到 ...

  8. TIME_WAIT和CLOSE_WAIT状态区别

    [TIME_WAIT和CLOSE_WAIT状态区别] 常用的三个状态是:ESTABLISHED 表示正在通信,TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭. TCP协议规定,对 ...

  9. 01d-1: 算法分析

  10. react-native 打包 出apk

    先上步骤: 一. 生成签名文件(my-release-key.keystore文件) Android要求所有应用都有一个数字签名才会被允许安装在用户手机上 1.  在项目目录下运行如下命令: keyt ...