C--Minus Minus设计的目点:
学习编译原理时就设想实现一个简单的编译器。这样能将编译原理上的知识进行实际的
运用加以更好的理解,同时为了更接近实际的编译器,最好能够产生实际的汇编代码。
在看了描述lcc的<<可变目标C编译器-设计与实现>>后,决定在lcc的基础上,去掉一些比较琐碎的细节,同时保留一些基本成分来设计一个C语言子集的编译器,这个C语言的子集给它取名C--。
通过C--编译器的设计主要有以下的目的:
首先,C--编译器是做为编译原理的一个实习作业而设计的。通过设计C--编译器可
以使编译原理上的理论得到实际的运用,从而加深对理论理解和运用能力。
第二,设计C--编译器过程,本身就是对C语言语法和特性的的学习。同时C--编译器本
身就是一个大型C语言项目,通过它可以提高从事大型C程序的设计和开发能力。
C-- 编译器最后生成的目标代码为nasm的汇编语言程序。现在还只能运行在linux环境,由于nasm本身是跨平台的,并且主体框架直接来源于lcc,所以将它移值于其它的系统,
特别是windows时所要做的工作不会很大。为了简化实现的难度对于代码优化,只采用了
常量合并、公共子表达式消除、等简单的优化技术。
C--的语法:
C--的语法是根据<<可变目标C编译器-设计与实现>>英文名<<A Retargetable CCompliler Design and Implementation>>)一书中C语言语法经过裁剪得到的,它是C语言的一个字集。为了与<<编译原理及实践>>中附录定义的一个C-Minus相区别,所以取名C--MinusMinus(不过并没有因为多了一个Minus符号,就意外着C--比C-简单。相反C--具有比C-更多的特性)。为了能使用最基本标准的C库函数,C--类型包括了char,以及
指针类型。但由于不支持可变参数,因此对像printf函数的使用需要在不同的使用处进行不同的声明。
C--的关键字:
break char continue else if int return void while
所有的关键字都是保留字,并且必须是小写。
C--中的专用符号:
+ - * / % < <= > >= == != = ! &
C--Minus Minus 的EBNF语法:
1. translation-unit:
external-declaration {external-declaration}
2. external-declaration:
function-definition
declaration
3. declaration:
type-specifier init-declarator {,init-declarator};
type-specifier;
4. init-declarator:
declarator
declarator = initializer
5. initializer:
assignment-expression
'{' initializer {, initializer}[,]'}'
6. type-specifier:
void | char | int
7. declarator:
pointer direct-declarator {suffix-declarator}
8. direct-declarator:
identifier
'(' declarator ')'
9. suffix-declarator:
'[' [constant-expression] ']'
'(' [parameter-list]')'
10. pointer: {*}
11. parameter-list:
parameter {,parameter-list}
12. parameter:
type-specifier [declarator]
13. function-definition:
type-specifier declarator compound-statement
14. compound-statement:
'{' {declaration} {statement} '}'
15. statement:
[expression];
if '(' expression ')' statement
if '(' expression ')' statement else statement
while '(' expression ')' statement
break;
continue;
return [expression ];
compound-statement
16. expression:
assignment-expression
binary-expression
17. assignment-expression
unary-expression assign-operator assignment-expression
18. assign-operator:
one of =
19. binary-expression:
unary-expression { binary-operator unary-expression }
20. binary-operator:
one of == != < > <= >= + - * / %
21. unary-expression:
postfix-expression
unary-operator unary-expression
'(' type-name ')' unary-expression
sizeof unary-expression
sizeof '(' type-name ')'
22. unary-operator:
one of & * + - !
23. postfix-expression:
primary-expression {postfix-operator}
24. postfix-operator:
'['expression']'
'(' [assignment-expression {,assignment-expression}]')'
25. primary-expression:
identifer
constant
string-literal
'(' expression ')'
26. identifer:
nondigit { nodigit | digit }
27. nondigit:
one of _
a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
28. constant:
integer-constant
character-constant
29. integer-constant:
decimal-constant
30. decimal-constant:
digit {digit}
31. digit:
one of 0 1 2 3 4 5 6 7 8 9
32. character-constant:
'char' | escape-sequence
33. char:
any character
34. escape-sequence:
one of \' \" \? \\ \a \b \f \n \r \t \v
35. string-literal:
"{char | escape-sequence}"
对以上每条文法规则,给出了相关语义的简短解释
1. translation-unit:
external-declaration {external-declaration}
2. external-declaration:
function-definition
declaration
3. declaration:
type-specifier init-declarator {,init-declarator};
type-specifier;
程序由声明的列表或函数定义组成。声明可以是函数或变量声明,顺序是任意的。
声明由类型说明符(type-specifier)和初始化声明符列表(init-declarator)构成。
为了简化C-- 编译器的实现,己将C语言声明说明符中类型限定符和存储说明符去掉。
由于没有extern说明符,对于全局的标示符,是不能跨文件传递的。但是为了实现引用
标准C库中一些函数实现基本输入输出,对未定义的函数,将把它做为引用外部符号处理。
4. init-declarator:
declarator
declarator = initializer
5. initializer:
assignment-expression
'{' initializer {, initializer}[,]'}'
6. type-specifier:
void | char | int
在声明中对一般变量的初始化使用在'='后跟一个赋值表达式,由于在C-- 中没有结构和联合类型,只对数组的赋值才用花括号括起来的赋值列表。同样出于简化的目的类型说明符只保留C语言中最基本类型,其中空类型void只用于函数返回类型和函数参数类型,分别表
示函数没有返回值和没有参数。char,int 的使用与C语言中相似,用于说明变量类型。
7. declarator:
pointer direct-declarator {suffix-declarator}
8. direct-declarator:
identifier
'(' declarator ')'
9. suffix-declarator:
'[' [constant-expression] ']'
'(' [parameter-list]')'
10. pointer: {*}
声明说明符(declarator)由前缀的指针说明符'*'、直接说明符、和可选的后缀说明符构成。C-- 保留了C语言中的指针,包括指向字符、整数、空类型、以及函数的指针。后缀说明符用于声明数组和函数,其中数组下标也是从0开始。
11. parameter-list:
parameter {,parameter-list}
12. parameter:
type-specifier [declarator]
13. function-definition:
type-specifier declarator compound-statement
14. compound-statement:
'{' {declaration} {statement} '}'
函数的参数声明中可选的声明说明符(declarator)表示在用于函数声明时可以省略,函数的定义由返回类型指示符、标识符以及在圆括号内有用逗号分开的参数列表组成,后面跟了一个复合语句,是函数的代码。复合语句由声明与语句序列组成。
15. statement:
[expression];
if '(' expression ')' statement
if '(' expression ')' statement else statement
while '(' expression ')' statement
break;
continue;
return [expression ];
compound-statement
C-- 中语句由表达式、选择、循环、返回、复合语句以及用于跳出循环的brea
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
一个C语言子集cmm编译器的源代码 (101个子文件)
cmm.1 1KB
calculator.asm 5KB
ssort.asm 2KB
qsort.asm 2KB
count.asm 2KB
copy.asm 2KB
sgrep.asm 2KB
init.asm 1KB
maxline.asm 1021B
word.asm 931B
power.asm 913B
expr.asm 904B
fun.asm 882B
statement.asm 752B
getline.asm 730B
hello.asm 548B
line.asm 448B
gen.c 20KB
decl.c 14KB
expr.c 9KB
lex.c 8KB
dag.c 7KB
enode.c 7KB
stmt.c 6KB
nasm.c 6KB
simp.c 6KB
sym.c 5KB
tree.c 5KB
output.c 4KB
cstring.c 4KB
main.c 4KB
type.c 4KB
init.c 4KB
calculator.c 2KB
error.c 2KB
alloc.c 1KB
list.c 1KB
input.c 1KB
ssort.c 1KB
count.c 727B
copy.c 672B
sgrep.c 663B
qsort.c 610B
maxline.c 531B
exprtest.c 515B
word.c 468B
init.c 393B
statement.c 347B
getline.c 312B
power.c 301B
line.c 215B
fun.c 214B
expr.c 192B
hello.c 121B
readlines.c 0B
calculator 6KB
cmm 153KB
copy 5KB
count 4KB
expr 4KB
fun 4KB
cmm.1.gz 932B
cmm.h 9KB
token.h 4KB
config.h 1KB
alloc.h 358B
output.h 315B
error.h 274B
list.h 268B
cstring.h 186B
hello 4KB
init 4KB
line 4KB
Make.defines.linux 344B
makefile 2KB
makefile 1KB
maxline 4KB
ssort.o 21KB
calculator.o 3KB
copy.o 2KB
count.o 1KB
sgrep.o 1KB
init.o 1KB
maxline.o 1KB
word.o 1KB
statement.o 1KB
power.o 1024B
qsort.o 992B
fun.o 944B
hello.o 928B
getline.o 912B
line.o 880B
expr.o 864B
power 4KB
README 3KB
sgrep 5KB
ssort 27KB
statement 4KB
C--MinusMinus语言编译器的设计文档.txt 38KB
grammar.txt 10KB
共 101 条
- 1
- 2
资源评论
- zhaoqikehotmail2011-10-24注释太少了,不容易看懂
- hehe_cola2015-03-30下载前请注意,是linux下的
linuxxtz
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- dbeaver-ce-24.3.1-x86-64-setup.exe
- 国际象棋桌子检测6-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- 某平台广告投入分析与销售预测
- 连接ESP32手表来做验证20241223-140953.pcapng
- 小偏差线性化模型,航空发动机线性化,非线性系统线性化,求解线性系统具体参数,最小二乘拟合 MATLAB Simulink 航空发动机,非线性,线性,非线性系统,线性系统,最小二乘,拟合,小偏差,系统辨
- 好用的Linux终端管理工具,支持自定义多行脚本命令,密码保存、断链续接,SFTP等功能
- Qt源码ModbusTCP 主机客户端通信程序 基于QT5 QWidget, 实现ModbusTCP 主机客户端通信,支持以下功能: 1、支持断线重连 2、通过INI文件配置自定义服务器I
- QGroundControl-installer.exe
- 台球检测40-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar
- 颜色拾取器 for Windows
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功