一、目的
1.掌握使用高级程序语言实现一个一遍完成的、简单语言的编译器的方法。
2.掌握简单的词法分析器、语法分析器、符号表管理、中间代码生成以及目标代码生成的实现方法。
3.掌握将生成代码写入文件的技术
二、要求
使用高级程序语言实现一个类C语言的编译器,可以提供词法分析、语法分析、符号表管理、中间代码生成以及目标代码生成等功能。具体要求如下:
(1)使用高级程序语言作为实现语言,实现一个类C语言的编译器。编码实现编译器的组成部分。
(2)要求的类C编译器是个一遍的编译程序,词法分析程序作为子程序,需要的时候被语法分析程序调用。
(3)使用语法制导的翻译技术,在语法分析的同时生成中间代码,并保存到文件中。
(4)要求输入类C语言源程序,输出中间代码表示的程序;
(5)要求输入类C语言源程序,输出目标代码(可汇编执行)的程序。
(6)实现过程、函数调用的代码编译
其中(1)、(2)(3)(4)是必做内容,(5)(6)是选作内容。
三、C语言语法规则
【词法规则】
关键字:int | void | if | else | while | return
标识符: 字母(字母|数字)* (注:不与关键字相同)
数值:数字(数字)*
赋值号: =
算符: + | - | * | / | = | == | > | >= | < | <= | !=
界符: ;
分隔符: ,
注释号: /* / | //
左括号: (
右括号: )
左大括号: {
右大括号: }
字母:| a |…| z | A |…| Z |
数字:0| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
结束符:#
【文法1_包含过程调用】
Program ::= <声明串>
<声明串> ::=<声明>{<声明>}
<声明> ::=int <声明类型> | void <函数声明>
<声明类型>::=<变量声明> | <函数声明>
<变量声明> ::= ;
<函数声明> ::=’ (‘<形参>’) ‘<语句块>
<形参>::= <参数列表> | void
<参数列表> ::= <参数> {, <参数>}
<参数> ::= int
<语句块> ::= ‘{‘<内部声明> ; <语句串>’}’
<内部声明> ::= 空 | <内部变量声明>{; <内部变量声明>}
<内部变量声明>::=int
<语句串> ::= <语句>{ <语句> }
<语句> ::= <if语句> |< while语句> | <return语句> | <赋值语句>
<赋值语句> ::= =<表达式>;
<return语句> ::= return [ <表达式> ] (注:[ ]中的项表示可选)
<while语句> ::= while ‘( ‘<表达式> ‘)’ <语句块>
<if语句> ::= if ‘(‘<表达式>’)’ <语句块> [ else <语句块> ](注:[ ]中的项表示可选)
<表达式>::=<加法表达式>{ relop <加法表达式> } (注:relop-> <|<=|>|>=|==|!=)
<加法表达式> ::= <项> {+ <项> | -<项>}
<项> ::= <因子> { <因子> | /<因子>}
<因子> ::=num | ‘(‘<表达式>’)’ | FTYPE
FTYPE ::= | 空
::=’(’<实参列表> ’) ’
<实参> ::=<实参列表> | 空
<实参列表> ::= <表达式>{, <表达式>}
::=字母(字母|d数字)*
【程序实例】
int a;
int b;
int program(int a,int b,int c)
{
int i;
int j;
i=0;
if(a>(b+c))
{
j=a+(bc+1);
}
else
{
j=a;
}
while(i<=100)
{
i=j2;
}
return i;
}
int demo(int a)
{
a=a+2;
return a*2;
}
void main(void)
{
int a;
int b;
int c;
a=3;
b=4;
c=2;
a=program(a,b,demo©)
return;
}
【文法2_不包含过程调用】
(注: { }中的项表示可重复若干次)
Program ::= <类型> < ID>’(‘ ‘)’<语句块>
<类型>::=int | void
::=字母(字母|d数字)*
<语句块> ::= ‘{‘<内部声明> <语句串>’}’
<内部声明> ::= 空 | <内部变量声明>{; <内部变量声明>}
<内部变量声明>::=int
<语句串> ::= <语句> { <语句> }
<语句> ::= <if语句> |< while语句> | <return语句> | <赋值语句>
<赋值语句> ::= =<表达式>;
<return语句> ::= return [ <表达式> ] (注:[ ]中的项表示可选)
<while语句> ::= while ‘( ‘<表达式> ‘)’ <语句块>
<if语句> ::= if ‘(‘<表达式>’)’ <语句块> [ else <语句块> ](注:[ ]中的项表示可选)
<表达式>::=<加法表达式>{ relop <加法表达式> } (注:relop-> <|<=|>|>=|==|!=)
<加法表达式> ::= <项> {+ <项> | -<项>}
<项> ::= <因子> {* <因子> | /<因子>}
<因子> ::=num | ‘(‘<表达式>’)’ | FTYPE
FTYPE ::= | 空
::=’(’<实参列表> ’) ’
<实参> ::=<实参列表> | 空
<实参列表> ::= <表达式>{, <表达式>}
【程序实例】
int program(int a,int b,int c)
{
int i;
int j;
i=0;
if(a>(b+c))
{
j=a+(bc+1);
}
else
{
j=a;
}
while(i<=100)
{
i=j2;
}
return i;
}
内容展示
【源码获取】
我们分享了非常多的课程设计资料,以便让大家更好的学习,扫码关注下方公众号 大学生知识分享地 或直接搜索公众号名称并发送 0312即可获取所有内容!内容包含源码、实践报告。