《编译技术》课程设
计文 档
2015 年 1 月 9 日
一.需求说明.............................................................................................................................3
1.文法说明.......................................................................................................................3
a)..........................................................................................................................................3
b)文法解读:......................................................................................................................4
2.目标代码说明...............................................................................................................6
操作码集:.........................................................................................................................6
操作码解释:.....................................................................................................................6
二.详细设计.............................................................................................................................7
1.程序结构.......................................................................................................................7
2.方法功能.......................................................................................................................8
3.调用依赖关系...............................................................................................................9
4.符号表管理方案.........................................................................................................10
a)符号表的数据结构:....................................................................................................10
b)符号表管理...................................................................................................................10
5.存储分配方案与解释执行程序................................................................................10
1)存储分配方案概述.....................................................................................................10
2)具体生成代码的解释.................................................................................................11
6. 出错处理.......................................................................................................................12
四.测试报告...........................................................................................................................13
1.测试程序及测试结果.................................................................................................13
程序 1:scanf.txt..............................................................................................................13
程序 2:return.txt.............................................................................................................13
程序 3:return2.txt (计算阶乘).......................................................................................14
程序 4:for.txt..................................................................................................................14
程序 5:shuzu.txt.............................................................................................................14
程序 6:dowhile.txt..........................................................................................................15
程序 7:void.txt................................................................................................................15
程序 8:error1.txt.............................................................................................................15
程序 9:error2.txt.............................................................................................................16
程序 10:twofunc.txt........................................................................................................16
一.需求说明
1.文法说明
a)
获取的文法:
<加法运算符> ::= +|-
<乘法运算符> ::= *|/
<关系运算符> ::= <|<=|>|>=|!=|==
<字母> ::= _|a|...|z|A|...|Z
<数字> ::= 0|<非零数字>
<非零数字> ::= 1|...|9
<字符> ::= '<加法运算符>'|'<乘法运算符>'|'<字母>'|'<数字>'
<字符串> ::= "{十进制编码为 32,33,35-126 的 ASCII 字符}"
<程序> ::= [<常量说明部分>][<变量说明部分>]{<有返回值函数定义部
分>|<无返回值函数定义部分>}<主函数>
<常量说明部分> ::= const<常量定义>;{ const<常量定义>;}
<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| float<标识符>=<实数>{,<标识符>=<实数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
<无符号整数> ::= <非零数字>{<数字>}
<整数> ::= [+|-]<无符号整数>|0
<小数部分> ::= <数字>{<数字>}|<空>
<实数> ::= [+|-]<整数>[.<小数部分>]
<标识符> ::= <字母>{<字母>|<数字>}
<声明头部> ::= int<标识符> |float <标识符>|char<标识符>
<变量说明部分> ::= <变量定义>;{<变量定义>;}
<变量定义> ::= <类型标识符>(<标识符>|<标识符>‘[’<无符号整数>‘]’){,<标
识符>|<标识符>‘[’<无符号整数>‘]’ }
<类型标识符> ::= int | float | char
<有返回值函数定义部分> ::= <声明头部>‘(’<参数>‘)’ ‘{’<复合语句>‘}’
<无返回值函数定义部分> ::= void<标识符>‘(’<参数>‘)’‘{’<复合语句>‘}’
<复合语句> ::= [<常量说明部分>][<变量说明部分>]<语句列>
<参数> ::= <参数表>
<参数表> ::= <类型标识符><标识符>{,<类型标识符><标识符>}| <空>
<主函数> ::= void main‘(’‘)’ ‘{’<复合语句>‘}’
<表达式> ::= [+|-]<项>{<加法运算符><项>}
<项> ::= <因子>{<乘法运算符><因子>}
<因子> ::= <标识符>|<标识符>‘[’<表达式>‘]’|<整数>|<实数>|<字符
>|<有返回值函数调用语句>|‘(’<表达式>‘)’
<语句> ::= <条件语句>|<循环语句>|‘{’<语句列>‘}’|<有返回值函数调用
语句>;
|<无返回值函数调用语句>;|<赋值语句>;|<读语句>;|<写语句
>;|<空>;|<返回语句>;
<赋值语句> ::= <标识符>=<表达式>|<标识符>‘[’<表达式>‘]’=<表达式>
<条件语句> ::= if ‘(’<条件>‘)’<语句>[else<语句>]
<条件> ::= <表达式><关系运算符><表达式>|<表达式> //表达式为 0 条件
为假,否则为真
<循环语句> ::= do<语句>while ‘(’<条件>‘)’ |for‘(’<标识符>=<表达式>;<
条件>;<标识符>=<标识符>(+|-)<步长>‘)’<语句>
<步长>::= <非零数字>{<数字>}
<有返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<无返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<值参数表> ::= <表达式>{,<表达式>}|<空>
<语句列> ::= <语句>{<语句>}
<读语句> ::= scanf ‘(’<标识符>{,<标识符>}‘)’
<写语句> ::= printf‘(’<字符串>,<表达式>‘)’|printf ‘(’<字符串>‘)’|printf ‘(’<表
达式>‘)’
<返回语句> ::= return[‘(’<表达式>‘)’]
b)文法解读:
<程序> ::= [<常量说明部分>][<变量说明部分>]{<有返回值函数定义部分>|
<无返回值函数定义部分>}<主函数>
<常量说明部分> ::= const<常量定义>;{ const<常量定义>;}
<常量定义> ::= int<标识符>=<整数>{,<标识符>=<整数>}
| float<标识符>=<实数>{,<标识符>=<实数>}
| char<标识符>=<字符>{,<标识符>=<字符>}
<变量说明部分> ::= <变量定义>;{<变量定义>;}
<变量定义> ::= <类型标识符>(<标识符>|<标识符>‘[’<无符号整数>‘]’){,<标识符
>|<标识符>‘[’<无符号整数>‘]’}
<有返回值函数定义部分> ::= <声明头部>‘(’<参数>‘)’ ‘{’<复合语句>‘}’
<无返回值函数定义部分> ::= void<标识符>‘(’<参数>‘)’‘{’ <复合语句>‘}’
<复合语句> ::= [<常量说明部分>][<变量说明部分>]<语句列>
<主函数> ::= void main‘(’‘)’ ‘{’<复合语句>‘}’
句子示例:const int a=6,b=2,c=7.5;
const oat d= 3.3;
const char e= ‘a’; //常量说明部分
int f,g[10];
oat h,i[10];
char j,k[10]; //变量说明部分
int func1(int argu)
{
//略
} //有返回值函数定义部分
void func2(int argu2)
{
//略
} //无返回值函数定义部分
void main ()
{
//略
} //主函数
分析 1:根据分程序的文法可知,分程序各个组成成分的声明顺序已经被限定好了,不能
随便更改声明顺序。必须是先常量后变量。
分析 2:分程序中常量说明部分和变量说明部分可有可无,但是语句列是必须的。
<语句列> ::= <语句>{<语句>}
<语句> ::= <条件语句>|<循环语句>|‘{’<语句列>‘}’|<有返回值函数调用语句
>; |<无返回值函数调用语句>;|<赋值语句>;|<读语句>;|<写语句>;|<空
>;|<返回语句>;
<条件语句> ::= if ‘(’<条件>‘)’<语句>[else<语句>]
<循环语句> ::= do<语句>while ‘(’ <条件>‘)’ |for‘(’<标识符>=<表达式>;<条件
>;<标识符>=<标识符>(+|-)<步长>‘)’<语句>
<步长>::= <非零数字>{<数字>}
<有返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<无返回值函数调用语句> ::= <标识符>‘(’<值参数表>‘)’
<赋值语句> ::= <标识符>=<表达式>|<标识符>‘[’<表达式>‘]’=<表达式>
<读语句> ::= scanf ‘(’<标识符>{,<标识符>}‘)’
<写语句> ::= printf‘(’<字符串>,<表达式>‘)’|printf ‘(’<字符串>‘)’|printf ‘(’<表达式
>‘)’
<返回语句> ::= return[‘(’<表达式>‘)’]
示例:if(a>3)
{
;
} //条件语句
for(i=0;i<3;i=i+1)
b=3; //循环语句
d=func1(3);//赋值语句加有返回值函数调用语句