编译原理实验报告词法分析器和LL1文法资料Word下载.docx
- 文档编号:14022683
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:24
- 大小:170.82KB
编译原理实验报告词法分析器和LL1文法资料Word下载.docx
《编译原理实验报告词法分析器和LL1文法资料Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告词法分析器和LL1文法资料Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
Win10,VS2010。
三、实验内容
1.正规文法
<
关键字>
->
int|for|while|do|return|break|continue
运算符和界符>
|+|-|*|/|==|<
|<
=|!
=|>
|>
=|,|;
|(|)|{|}
标识符>
letter(letter|digit)*
整型常数>
digitdigit*
2.算法思想
算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼接出相应的单词符号。
2.1主程序
否
是
输出单词二元组
图1词法分析主程序示意图
其中初始包括关键字、运算符、界限符的置初值。
2.2扫描子程序的算法思想:
在词法分析中,先以只读方式读取一个文件,自文件头开始扫描文本,滤去开头的空格、回车符、换行符等。
读取的字符送入word。
扫描第一个字符,看匹配的类型,并进行相应的类型分析,满足判断类型时,输出其种别码和值。
是是
否
字母
数字其他
运算符、符号
界符等符号
图2扫描子程序
四、实验步骤
编写程序时,先定义几个全局变量,key[]事先存放7个关键字,words[]用来存放识别出来的单词二元组,text用来存放从文件读取的内容,word用于存放识别出来的单词,length存放字符个数,k存放识别出来的单词个数。
首先,将文本内容读取到text中,文本内容最后一个字符是空白符,然后调用scan方法,逐个扫描每个字符,如果word的第一个字符是字母,则进行拼字符串,再判断是关键字还是标识符;
如果word的第一个字符是数字,则在word清空之前判断是否有识别出非数字字符,若有,则出错,若没有,则识别出来的字符串是常数;
若word第一个字符是运算符或界限符,则各自存到words[]中。
最后扫描结束后输出。
五、实验结果及分析
六、实验小结和思考
通过这次实验,我对词法分析器有了进一步的了解,而且对词法分析和语法分析在实践中的应用有了深入的掌握,让我对高级语言的学习有了更深的认识,了解得更透彻。
七、源程序清单
#include<
stdio.h>
stdlib.h>
string>
usingnamespacestd;
#defineMAX10000
structWordString
{
stringWord;
//单词
intcategory;
//类别
};
char*key[7]={"
int"
"
for"
"
while"
do"
return"
break"
continue"
};
//关键字
WordStringwords[MAX];
//创建一个单词符号串
stringtext;
//读入的文本存入text中
stringword;
//分割出的单词用word表示
intlength;
//字符个数
intk;
//总单词个数
voidscan()
inti,j;
k=0;
word="
"
;
for(i=0;
i<
=length-1;
i++)
if(word!
="
){
if(((word[0]>
='
A'
)&
&
(word[0]<
Z'
))||((word[0]>
a'
z'
)))//首字符是字母
{
if(((text[i]>
(text[i]<
))||((text[i]>
=48)&
=57)))
{
word+=text[i];
}
else
words[k].Word=word;
for(j=0;
j<
7;
j++)
{
if(words[k].Word==key[j])
{
words[k].category=1;
//表示关键字
break;
}
elseif(j==6)
words[k].category=2;
//表示标识符
}
k++;
word="
i--;
}
elseif(word[0]=='
'
||word[0]=='
'
{'
}'
('
)'
)//首字符是界限符
words[k].Word=word;
words[k].category=5;
//表示界限符
k++;
word="
i--;
+'
-'
*'
/'
>
!
)//首字符是运算符
if(text[i]=='
)
words[k].category=4;
//表示运算符
elseif(word[0]>
=48&
word[0]<
=57)//首字符是数字
if(text[i]>
text[i]<
=57)
elseif((text[i]>
)||(text[i]>
))
words[k].category=6;
//表示出错,标识符以数字开头
if(words[k].category!
=6)
words[k].category=3;
//表示常数
}
else
{
if(text[i]!
=10&
text[i]!
=32&
=9)
word+=text[i];
}
intmain()
{
FILE*fp;
//文件指针
fp=fopen("
text.txt"
r"
);
//打开文件
if(fp==NULL)
printf("
Can'
topenthisfile!
\n"
exit(0);
inti=0;
while(!
feof(fp))//判断是否到文件结尾
text+=fgetc(fp);
i++;
length=i;
//text最后一个字符是空字符
fclose(fp);
//关闭文件
scan();
k;
i++)//输出
if(words[i].category==6)
printf("
%sEorror\n"
words[i].Word.c_str());
(%d,%s)\n"
words[i].category,words[i].Word.c_str());
getchar();
return0;
}
C2102016年12月8日
语法分析——LL
(1)语法分析方法的实现
通过设计、开发一个高级语言的LL
(1)语法分析程序,实现对源程序的语法检查和结构分析,加深对相关课堂教学内容(包括自顶向下语法分析、First集、Follow集、Select集、判断LL
(1)文法的方法、文法等价变换、LL
(1)分析表的构造、对某一输入串的分析过程的理解,提高语法分析方法的实践能力。
消除直接左递归前的文法
消除直接左递归后的等价文法
G[E]:
E→E+T
G’[E]:
E→TE’
E→T
E’→+TE’|ε
T→T*F
T→FT’
T→F
T’→*FT’|ε
F→(E)|i
F→(E)|i
根据文法建立LL
(1)分析表,并对输入串i+i*i进行语法分析,判断其是否是合法的句子,给出句子的分析过程。
具体要求如下:
1、理解语法分析在编译程序中的作用;
2、理解LL
(1)语法分析方法对文法的要求(必须是LL
(1)文法);
3、理解LL
(1)分析器模型;
4、熟练掌握文法变换方法(消除直接左递归和提取左公共因子)。
5、熟练掌握Select集合的求解方法和LL
(1)分析表的构造方法;
PC机Penti
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告 词法 分析器 LL1 文法 资料