编译原理实验报告 下载本文

内容发布更新时间 : 2024/12/23 23:15:33星期一 下面是文章的全部内容请认真阅读。

精品文档

编译方法实验报告

实验1:扫描器的设计

一、 实验目的

熟悉并实现一个扫描器(词法分析程序)。

1欢迎下载

精品文档

二、 实验要求

(1) 设计扫描器的有限自动机(识别器);

(2) 设计翻译、生成Token的算法(翻译器); (3) 编写代码并上机调试运行通过。

·输入——源程序文件或源程序字符串; ·输出——相应的Token序列;

关键字表和界符表; 符号表和常数表;

三、 实验步骤

流程:

初始化;

打开用户源程序文件;

while (文件未结束)

{ 读入一行到w[i],i=0;

do //处理一行,每次处理一个单词

{ 滤空格,直到第一个非空的w[i]; i--;

s=1; //处理一个单词开始

while (s!=0) //拼单词并生成相应Token {

act(s); //执行qs

if (s>=11 && s<=14) //一个单词处理结束 break;

i++; //getchar() s=find(s, w[i]); }

if (s==0) 词法错误;

}while (w[i]!=换行符); }

关闭用户源程序文件; 生成Token文件; 输出关键字表; 输出Token序列; 输出符号表; 输出常数表;

有限自动机的状态转换图:

e

。 2欢迎下载

精品文档

d d d +|- -1/+/- +① d ② . ③ d ④ e ⑤ ⑥ d ⑦ 11 d - -1/+/- l/d -1/+/- -1 12 l ⑧ - -1 13 b ⑨ b ⑩ - -1 14 - -1 15 - 其中:d为数字,l为字母,b为界符,-1代表其它符号(如在状态8处遇到了非字母或数字的其它符号,会变换到状态12)。

关键字表和界符表:

Program Begin End Var While Do Repeat Until For To If Then Else

; : ( ) , := + - * / > >= == < <= 四、 主要数据结构

①状态转换矩阵:int aut[10][7]={ 2, 0, 0, 0, 8, 9, 15,

2, 3, 5,11, 0, 0, 11, 4, 0, 0, 0, 0, 0, 0, 4, 0, 5,11, 0, 0, 11, 7, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0,11, 0, 0, 11,

。 3欢迎下载

精品文档

8, 0, 0, 0, 8, 0, 12, 0, 0, 0, 0, 0, 10, 14,

0, 0, 0, 0, 0, 0, 13};

②关键字表:

char keywords[30][12]={“program”,”begin”,”end”,”var”,”while”,”do”,

”repeat”,”until”,”for”,”to”,”if”,”then”,”else”,

“;”, ”:”, ”(“, ”)”, ”,”, ”:=”, ”+”, ”-“, ”*”, ”/”, ”>”, ”>=”, ”==”, “<”, “<=”};

③符号表:char ID[50][12]; //表中存有源程序中的标识符

④常数表:float C[20]; ⑤其它变量: struct token { int code;

int value}; //Token结构 struct token tok[100]; //Token数组 int s; //当前状态

int n,p,m,e,t; //尾数值,指数值,小数位数,指数符号,类型

float num; //常数值

char w[50]; //源程序缓冲区

int i; //源程序指针,当前字符为w[i] char strTOKEN[12]; //当前已经识别出的单词

五、 实验核心代码

int main(int argc, char* argv[])

{

FILE *fp;

int s; //当前状态 *有限自动机中的状态

fp=fopen(\ while (!feof(fp)) {

fgets(w,50,fp); i=0;

//*处理一行 do {

printf(\测试 显示每个token的首字母

。 4欢迎下载

精品文档

//*处理一个token

while (w[i]==' ') //滤空格 i++;

if (w[i]>='a' && w[i]<='z') //判定单词类别 *是字母(关键字或标识符)

{

ptr=col2; num_map=2; } else if (w[i]>='0' && w[i]<='9') //*是数字(常量的开头)

{

ptr=col1; num_map=4; } else if (strchr(col3[0].str,w[i])==NULL) //*其他字符 算为非法字符

{

printf(\非法字符%c\\n\ i++;

continue; }

else //界符

{

ptr=col3; num_map=1; }

i--; //*向后退一个字符

s=1; //开始处理一个单词

while (s!=0) {

act(s);

if (s>=11 && s<=14) //*判断是否是终止状态 *是终止状态,则形成一个token

break;

i++; //getchar() *读取下一个字符

s=find(s,w[i]); //状态转换 }

if (s==0) {

strTOKEN[i_str]='\\0';

。 5欢迎下载