C%语言设计规格说明书-胡奔-ZY2006310-蒋孟贤ZY2006311

VIP免费
2025-01-13 1 0 2.02MB 91 页 5.9玖币
侵权投诉
C%语言设计规格说明书
所在学院:
计算机学院
课程名称:
程序设计语言原理
组员 1:
胡奔 ZY2006310
组员 2:
蒋孟贤 ZY2006311
任课教师:
2
目录
1. 语言设计的背景及泛型 ............................................ 3
1.1 背景与动机 ......................................................... 3
1.2 环境搭建 ........................................................... 4
2. 语言的语法、语义规格说明 ........................................ 6
2.1 词法元素 ........................................................... 6
2.2 EBNF 语法 .......................................................... 7
2.3 指称语义 ........................................................... 9
2.3.1 抽象语法 ............................................................. 10
2.3.2 语义域 ............................................................... 10
2.3.3 语义函数 ............................................................. 12
2.3.4 辅助函数 ............................................................. 16
3. 语言编译器实现 ................................................. 20
3.1 词法分析 .......................................................... 20
3.2 语法分析 .......................................................... 24
3.2.1 语言文法描述 ......................................................... 24
3.2.2 抽象语法树 ........................................................... 26
3.2.3 语言分析器设计 ....................................................... 35
3.3 语义分析 .......................................................... 43
3.3.1 属性文法 ............................................................. 44
3.3.2 符号表 ............................................................... 45
3.3.3 语义程序架构 ......................................................... 47
3.3.4 语义分析实现 ......................................................... 49
3.4 中间代码生成 ...................................................... 62
3.4.1 中间代码格式定义 ..................................................... 63
3.4.2 中间代码生成过程 ..................................................... 65
3.5 目标代码生成 ...................................................... 68
3.5.1 指令集选择 ........................................................... 69
3.5.2 寄存器分配 ........................................................... 70
3.5.3 栈管理 ............................................................... 70
3.5.4 目标代码生成 ......................................................... 71
4. 验证与测试 ..................................................... 78
3
1.
语言设计的背景及泛型
1.1
背景与动机
空指针/空引用异常NullPointerException是导致程序崩溃率最高的异常类
型,被图灵奖得主托尼·霍尔(Tony Hoare)称为《十亿美元的错误》。其根源在
于空指针异常是一种不受编译器检查的运行时异常,只能由程序员通过主动逻辑
来判断避免,但即使是最出色的程序员,也极难将所有潜在的空指针异常都考虑
周全。
因此,为了尽可能避免空指针错误,我们设计并引入了
编译时可空类型判断
系统
的概念。即在程序编译阶段,一个变量必须声明是否可空,对于非可空变量,
在访问其成员时必须做空处理,否则无法通过编译。例如,对于 C 语言来说
以下代码可以通过编译,但是运行结果会有问题:
#include <stdio.h>
int plusplus(int *a){
return *a + 1;
}
int main(){
int *a = NULL; // a为空引用
printf("%d\n", plusplus(a)); // 函数传入空引用值,结果出错
return 0;
}
而如果采用编译时可控类型判断系统,则上述代码非空a赋值
NULL 就无法通过编译。考虑某些情况下确实需要赋值为 NULL我们也保留了
可空指针变量,后面加“?”表示,即:
int *a = NULL; // a 为非空指针变量,无法通过编译
int *a? = NULL; // a 为可空指针变量,可以通过编译
为了验证设计方案的可行性,我们设计了 C%(读作:C-Percent语言,
是一门类 C的语言,引入编译时可空类型判断系统,在很大程度上可以杜绝空指
针异常所引起的错误。目前我们实现了 C%语言的绝大部分常用功能(运算、
支、循环、数组、结构体、函数、指针等)编译器完成了词法分语法分
语义分代码代码5个阶段的测试,程序可常运行和定
位报错。
4
C%语言中的多层意思C语言的子集或超集oo 表示 2人共同
完成(也表示来可能会加入的面特征除号/表示 C 语言的
上加入可空类型判断系统一些语法糖同删去一些我们太好
C%语言的 github 地址为:https://github.com/huris/C-Percent
目前开发超 150 时,其亮点总结如下:
1形式化结构表格形式直观地打印C%语言编译所用
的语法分析树语义分阶段的符号表、代码成结果及错误定位信息
打印的分结果,可以清晰地观察各作用域之间系。
2采用 make 编译,个环节进行了封装和整合简化了编译过程。
数的方式提供各个阶段数结构的访问接口可以指是否需要在目
码中Debug 信息,方便程序员试及了C%语言的模式
3实现了编译时可空类型判断系统,时也加入了一些“if/for/while
删去小括号包含单return 的函数可以直接在后面用等完成、“
符号用“@”代*”以区别乘号”等性。
1.2
环境搭建
C% 语言 Windows 境开发主要以 C语言实现编码,需要安装 GCC
编译器(安装位置C:\MinGW由于开发工作量运行率方面的考虑,C%
语言编译阶段的词法分析基Flex 完成安装位置C:\gnuwin32语法分析基
Bison 完成(安装位置C:\gnuwin32安装后需要将 C:\gnuwin32\lib
libfl.a liby.a 复制到 C:\MinGW\lib 中,并配置变量。另外,需要安装
QtSpim 行对最后成的 MIPS 编代码的验证与测试。
所有工具提供tools 文件夹中。
l mingw-get-setup.exe
l flex-2.5.4a-1.exe
l bison-2.4.1-setup.exe
l QtSpim_9.1.21_Windows.msi
安装后, C-Percent 文件夹直接执 make 即可运行,其中 C%
代码test.txt 中,makefile 文件内容如下:
5
all: clean C_Percent
C_Percent: lex.l parser.y
# 示中
chcp 65001
# bison, -d 表示将编译结果.tab.c .tab.h , -v 表示产生.output
, -t 模式
bison -d -v parser.y
# 词法分
flex lex.l
# 编译
gcc -o a.exe lex.yy.c parser.tab.c def.c objectCode.c -lfl -ly
# 析输入语, .s 编程序
a.exe test.cp
# 通过 QtSpim 运行编程序
..\tools\QtSpim\QtSpim.exe object.s
clean:
# 删除间生文件
del lex.yy.c
del parser.tab.c
del parser.tab.h
del lex.output
del a.exe
del objects.s
6
2.
语言的语法、语义规格说明
2.1
词法元素
C%语言中词是独立意义的最小单位,可分为 5大类:关键字(语言
特殊意义的标识符运算(有预定义的特殊字符或特殊字符
隔符(用于分程序的不词法元特殊符号、常量(用于做运算的
体值)和标识符文字形式的词法对
1关键字为保留包括基本类型关键字 intfloatchar string
分支与循环语句涉及的 ifelseforwhilebreak,结构体关键字 struct
返回 return
2运算符包括基本运算(加+-*/比较运算(大于>
<等于==不等于!=逻辑运算(与&&||、非 !)、 取地址运算&
复合运算(加等于+=等于-=等于*=等于/=大于等于>=于等
<=括号小括号()、中括号[])。
3隔符包括;逗号(,点号.括号{}这里需要
注意的是,体的设计时,小括号和括号作为运算而非分隔符因为它们
在函数用、数组访问时都有特殊意义,不能简单地当单纯的分隔符看待
4常量包括型常量、浮点常量、字符常量、字符串常量,指针常
量。型常量为十进制0-9的序,例如“12345”浮点型常量可以用一
般小形式表示,例如“1234.5”,在 C%语言中,“.1”“1. 都算
字符常量是被一对号括起来的字符例如a’; 字符串常量是被一对
包围字符,例如“abc 指针常量是指针所指固定地址,例如
&a
5标识符是以字母或划线开头字母、数字和划线,其对大
敏感的,例如 if 是一个关键字,但是 IF 则被为是一个标识符hello
Hello 个不标识符时,为考虑后程序设计及错误示的需要,
需加入注释白符以及错误的标识符注释包括单注释和多注释
注释是以//开头直到该行的结注释是用“/*”“*/”包含的所有字符
自身除外白符包括空格、符和换符;错误的标识符字母和
7
划线开始的数字母和划线字符字符
C%语言的述,以下各单符号及说明:
ID → 标识符
INT → 整型常量
FLOAT → 浮点型常量
POINTER → 指针变量
AR → 取地址符号
CHAR → ‘’
STRING → “”
TYPE → int | float | char | string
RETURN → return
IF → if
ELSE → else
WHILE → while
FOR → for
BREAK → break
STRUCT → struct
DF → #include
LIBRARY → [<][a-zA-Z]+\.[h][>]
SEMI →
COMMA
RELOP → > | >= | < | <= | == | !=
PLUSPLUS → ++ | --
FUHE → += | -= | *= | /=
ASSIGNOP → =
PLUS → +
MINUS → -
STAR → *
DIV → /
AND → &&
OR → ||
NOT → !
LP
RP
LB → [
RB ]
LC → {
RC → }
DOT → [\.]
DQ [\”]
SQ [\’]
2.2 EBNF
语法
扩展巴科斯-范式Extended Backus–Naur FormEBNF)是表作为
述计算编程语言和形式语法的规方的上下关文法的元语法符号表示
法。
C%语言的 EBNF 表示如下:
blank = {(" " | "\t“ | "\n")};
upperletter = "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";
lowerletter = "a" | "b" | "c" | "d" | "e" | "f"
| "g" | "h" | "i" | "j" | "k" | "l"
| "m" | "n" | "o" | "p" | "q" | "r"
| "s" | "t" | "u" | "v" | "w" | "x"
8
| "y" | "z";
digit_nozero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9";
digit = ("0" | digit_nozero);
letter = (upperletter | lowerletter);
word = (letter),{letter};
INTEGER = (0 | digit_nozero),{digit};
FLOAT = INTEGER,[".",{digit}],["f"];
ID = (letter),{(letter | digit)};
program = ExtDefList;
ExtDefList = ExtDef, blank, ExtDefList;
ExtDef = (Specifier, blank, ExtDecList, blank, ";" | StructSpecifier, blank, ";" |
Specifier, blank, FuncDec, blank, CompSt |
Specifier, blank, FuncDec, blank, ASSIGNOP, blank, AssReturn | Includes);
AssReturn = Exp, blank, SEMI;
Includes = DF, blank, LIBRARY;
ExtDecList = (VarDec | VarDec, blank, COMMA, blank, ExtDecList);
Specifier = (TYPE | STRUCT, blank, ID);
StructSpecifier = STRUCT, blank, ID, blank, “{”, blank, DefList, blank, “}”;
VarDec = (ID | VarDec, blank, “[”, blank, Array, blank, “]”);
VarList = (ParamDec | ParamDec, blank, COMMA, blank, VarList);
ParamDec = Specifier, blank, VarDec;
CompSt = “{”, blank, DefList, blank, StmList, blank, “}”;
Stmt = (Exp, blank, ";" | CompSt | RETURN, blank, Exp, blank, ";" |
IF, blank, Exp, blank, “{”, blank, Stmt, blank, “}”, blank, %prec
9
LOWER_THEN_ELSE |
IF, blank, Exp, blank, “{”, blank, Stmt, blank, “}”, blank, ELSE, blank, “{”,
blank, Stmt, blank, “}” |
WHILE, blank, Exp, blank, “{”, blank, Stmt, blank, “}” |
FOR, blank, ForExp, blank, “{”, blank, Stmt, blank, “}” |
BREAK, blank, ";" |
error, blank, ";");
StmList = (Stmt, blank, StmList);
ForExp = (ForNull, blank, ";", blank, ForNull, blank, ";", blank, ForNull |
Def, blank, ForNull, blank, ";", blank, ForNull);
ForNull = Exp;
DefList = Def, blank, DefList;
Def = Specifier, blank, DecList, blank, ";";
DecList = (Dec | Dec, blank, COMMA, blank, DecList);
Dec = (VarDec | VarDec, blank, ASSIGNOP, blank, Exp | VarDec, blank, FUHE,
blank, Exp);
Exp = (Exp, blank, ASSIGNOP, blank, Exp | Exp, blank, AND, blank, Exp |
Exp, blank, OR, blank, Exp | Exp, blank, RELOP, blank, Exp |
Exp, blank, PLUS, blank, Exp | Exp, blank, MINUS, blank, Exp |
Exp, blank, STAR, blank, Exp | Exp, blank, DIV, blank, Exp |
Exp, blank, FUHE, blank, Exp | “(”, blank, Exp, blank, “)” |
MINUS, blank, Exp, blank, %prec UMINUS | NOT, Exp |
PLUSPLUS, Exp | Exp, PLUSPLUS |
ListDec, blank, “[”, blank, Exp, blank, “]” | ADDRESS, blank, ID |
ID, blank, “(”, blank, Args, blank, “)” | ID, blank, “(”, blank, “)” |
ID, blank, DOT, blank, ListDec | ID | INTEGER | letter | word);
Args = (Exp, blank, COMMA, blank, Args | Exp);
2.3
指称语义
指称语义由 Christopher Strachey Dana Scott 出,其优点是不需要在计
上实运行程序,就能测程序的行为,程序设计语言的全部义。
时可以对程序理。
10
2.3.1
抽象语法
C%语言的主要抽象语法如下:
command ::= Exp
Specifier ::= TYPE ID |
STRUCT ID |
TYPE ID[INTEGER | ID]
Variable ::= ID | ID[INTEGER | ID]
Exp ::= Operate ID
| Exp Operate Exp
| ID = Exp
| ID(Actual_Parameter_Sequence)
| command; command
| if Exp then command else command
| while Exp do command
| for Exp then command
Formal_Parameter_Sequence ::= Formal_Parameter
| Formal_Parameter, Formal_Parameter_Sequence
Formal_Parameter ::= TYPE ID
| ID(Formal_Parameter_Sequence){Exp}
| ID(Formal_Parameter_Sequence)
Actual_Parameter_Sequence ::= Actual_Parameter
| Actual_Parameter, Actual_Parameter_Sequence
Actual_Parameter ::= Exp
| ID
| ID(Actual_Parameter)
TYPE ::= blank | char | string | integer | float | struct | array | pointer
2.3.2
语义域
C%语言的主要语义如下:
白符
U = {empty-value}
字符
C
字符串
S = C*
I
浮点
F
函数
Func
指针
P = I
结构体
Str = C*×S*×I*×F*×P*
摘要:

程序设计语言原理C%语言设计规格说明书所在学院:计算机学院课程名称:程序设计语言原理组员1:胡奔ZY2006310组员2:蒋孟贤ZY2006311任课教师:2目录1.语言设计的背景及泛型............................................31.1背景与动机.........................................................31.2环境搭建...........................................................42.语言的语法、语义规格说明..................

展开>> 收起<<
C%语言设计规格说明书-胡奔-ZY2006310-蒋孟贤ZY2006311.pdf

共91页,预览19页

还剩页未读, 继续阅读

声明:本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。玖贝云文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知玖贝云文库,我们立即给予删除!
分类:计算机 价格:5.9玖币 属性:91 页 大小:2.02MB 格式:PDF 时间:2025-01-13

开通VIP享超值会员特权

  • 多端同步记录
  • 高速下载文档
  • 免费文档工具
  • 分享文档赚钱
  • 每日登录抽奖
  • 优质衍生服务
/ 91
客服
关注