编译原理实验报告词法分析器语法分析器docWord文档格式.docx
《编译原理实验报告词法分析器语法分析器docWord文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告词法分析器语法分析器docWord文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
当前字符
标示符常数表中查找结束
Error
基本字用户标示符
输出二
结
3、各种单词符号对应的种别码
单词符号
种别码
助记符
内码值
while
1
-
if
2
else
3
switch
4
case
5
标识符
6
id
id在符号表中的
位置
常数
7
num
num在常数表中的
+
8
9
*
10
<
=
11
relop
LE
LT
==
EQ
12
;
13
五、实验内容:
1、实验分析
编写程序时,先定义几个全局变量a[]、token[](均为字符串数
组),c,s(char型),i,j,k(int型),a[]用来存放输入的字符串,token[]
另一个则用来帮助识别单词符号,s用来表示正在分析的字符。
字符串输入
之后,逐个分析输入字符,判断其是否‘#’,若是表示字符串输入分析完毕,
结束分析程序,若否则通过intdigit(charc)、intletter(charc)判断
其是数字,字符还是算术符,分别为用以判断数字或字符的情况,算术符的
判断可以在switch语句中进行,还要通过函数intlookup(chartoken[])
来判断标识符和保留字。
2实验词法分析器源程序:
#include<
stdio.h>
math.h>
string.h>
inti,j,k;
charc,s,a[20],token[20]={'
0'
};
intletter(chars){
if((s>
=97)&
&
(s<
=122))return
(1);
elsereturn(0);
}
intdigit(chars){
=48)&
=57))return
(1);
voidget(){
s=a[i];
i=i+1;
voidretract(){
i=i-1;
intlookup(chartoken[20]){if(strcmp(token,"
while"
)==0)return
(1);
elseif(strcmp(token,"
if"
)==0)return
(2);
else"
)==0)return(3);
switch"
)==0)return(4);
case"
)==0)return(5);
elsereturn(0);
voidmain()
{
printf("
pleaseinputstring:
\n"
);
i=0;
do{i=i+1;
scanf("
%c"
&
a[i]);
}while(a[i]!
='
#'
i=1;
j=0;
get();
while(s!
){memset(token,0,20);
switch(s)
case'
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'
while(letter(s)||digit(s))
{token[j]=s;
j=j+1;
retract();
k=lookup(token);
if(k==0)
(%d,%s)"
6,token);
elseprintf("
(%d,-)"
k);
break;
1'
2'
3'
4'
5'
6'
7'
8'
9'
while(digit(s)){
token[j]=s;
%d,%s"
7,token);
+'
('
NULL)"
-'
null)"
*'
'
if(s=='
)printf("
(relop,LE)"
else{retract();
(relop,LT)"
)
(relop,EQ)"
else{
(;
'
default:
!
}}
六:
实验结果:
实验二
一、实验名称:
语法分析器的设计
二、实验目的:
用C语言编写对一个算术表达式实现语法分析的语法分析程序,并以四元式的形式输出,以加深对语法语义分析原理的理解,掌握语法分析程序的实现方法和技术。
三、实验原理:
1、算术表达式语法分析程序的算法思想
首先通过关系图法构造出终结符间的左右优先函数f(a),g(a)。
在分析的过程中,通过左右优先函数比较当前读入终结符与前一个读入终结符间的优先关系,分析后适时的
以四元式形式输出相关的符号。
2、通过优先函数关系图构造优先函数
优先函数表
i
(
f
g
优先函数关系图
四、实验内容:
1、
实验分析
本实验所用文法是:
g*
g+
G[E]:
E->
E+E|E-E|E*E|E/E|(E)
0|1|2|3|
|9
根据此文法编写程序时,算术表达式的求解过程需要用到算术符号的优先判断,定义两个字符串数组
optr[]、opnd[]用来模拟栈,存放算术符和操作数
用a[]来存放表达式字符串,在分析时还要通过函数
int?
f(char?
c)
和int?
g(char?
,判断运算符之间的优先关系,根据不同情况作各种不同操作。
流程图如
下:
输入算数表达式,以#
初始化
用get()取一个待分析
Optr[1]和s是否
判断S是否为运存入get(
其他情况Floptrj]<
g(sFloptr[j]=g(Floptr[j]>
g(
当前字符栈optr栈顶元素出栈
结束
2,实验程序源代码:
#include<
chara[21],optr[10],op,s;
intopnd[10],i,j,k,x1,x2,x3;
intoperand(chars)
{if((s>
=57))return1;
elsereturn0;
intf(chars)
{switch(s){
return4;
return6;
return2;
)'
return0;
intg(chars)
return3;
return5;
return7;
voidget()
{s=a[i];
i++;
{printf("
请输入表达式(以‘#’结束):
do{i++;
i=j=k=1;
optr[j]='
#