编译原理语法分析实验报告文档格式.docx
- 文档编号:7981862
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:37
- 大小:73.53KB
编译原理语法分析实验报告文档格式.docx
《编译原理语法分析实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理语法分析实验报告文档格式.docx(37页珍藏版)》请在冰点文库上搜索。
过程说明部分后缀>
→PROCEDURE标识符<
参数部分>
→(标识符:
)|ε
语句>
赋值或调用语句>
|<
条件语句>
当型循环语句>
读语句>
写语句>
后缀>
→:
=<
表达式>
|(<
→IF<
条件>
THEN<
→WHILE<
DO<
→READ(标识符<
)
→WRITE(<
表达式后缀>
表过式>
→BEGIN<
语句后缀>
END
→;
关系运算符>
|ODD<
→+<
项>
项后缀>
|-<
加型运算符>
因子>
因子后缀>
乘型运算符>
|e
→标识符|无符号整数|(<
→+|-
乘型运算型>
→*|/
→=|<
>
=|>
|>
=
5、程序设计思想
为每个非终结符设计一个识别的子程序,寻找该非终结符也就是调用相应的子程序。
由于单词在语法分析中作为一个整体,故在语法识别中仅使用其内码。
在这里将词法分析作为语法分析的一个子程序,当语法分析需要单词时,就调用相应的词法分析程序获得一个单词。
语法分析的作用是识别输入符号串是否是文法上定义的句子,即判断输入符号串是否是满足“程序”定义的要求。
也就是当语法识别程序从正常退出表示输入符号串是正确的“程序”;
若从出错退出,则输入符号串不是正确的“程序”。
出错时,可以根据读字符的位置判断出错的位置。
表2-1为非终结符和函数名对照表。
表2-1非终符和函数名对照表
非终结符
函数名
program
proghead
block
consexpl
consdefi
varexl
conssuff
vandefi
varsuff
procdefi
typeil
procedh
procsuff
assipro
sentence
suffix
ifsent
read
whilsent
idsuff
write
compsent
exprsuff
sentsuff
conditio
termsuff
express
term
factsuff
argument
factor
addoper
muloper
respoper
表2-2为词法分析中的内码单词对照表。
表2-2内部码对照表
内码
单词
1
PROGRAM
2
CONST
3
VAR
4
INTEGER
5
LONG
6
PROCEDURE
7
IF
8
THEN
9
WHILE
10
DO
11
READ
12
WRITE
13
BEGIN
14
15
ODD
16
+
17
-
18
*
19
/
20
21
22
23
24
25
26
.
27
28
;
29
:
30
31
(
32
33
无符号整数
34
标识符
35
#
6、实验结果分析
样例1:
正确的pascal子集程序代码
PROGRAMtest;
CONSTb=3;
VARx:
INTEGER;
y:
LONG;
PROCEDUREc(d:
INTEGER);
d(5);
x:
=d+4;
=b*2+2;
END;
WHILEx<
10DOx:
=x+b;
IFx>
5THENx:
=2*x-b;
END.
运行结果1:
样例2:
错误的pascal子集程序代码
test;
=b*2+;
5x:
运行结果2:
7、总结
通过本次实验,我能够用递归子程序法设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,更加了解了语法分析的过程和作用。
附件:
LEX代码:
%{
#include<
stdio.h>
stdlib.h>
string.h>
FILE*fp;
intline=1;
%}
delim["
"
\t]
whitespace{delim}+
backspace[\n]
program[pP][rR][oO][gG][rR][aA][mM]
const[cC][oO][nN][sS][tT]
var[vV][aA][rR]
integer[iI][nN][tT][eE][gG][eE][rR]
long[lL][oO][nN][gG]
procedure[pP][rR][oO][cC][eE][dD][uU][rR][eE]
if[iI][fF]
then[tT][hH][eE][nN]
while[wW][hH][iI][lL][eE]
do[dD][oO]
read[rR][eE][aA][dD]
write[wW][rR][iI][tT][eE]
begin[bB][eE][gG][iI][nN]
end[eE][nN][dD]
odd[oO][dD][dD]
add\+
minus-
multiply\*
div\/
equal=
m21<
m22<
m23<
m24>
m25>
m27,
m26\.
m28;
m29:
m30:
m31\(
m32\)
constant([0-9])+
identfier[A-Za-z]([A-Za-z]|[0-9])*
%%
{program}{fprintf(fp,"
%d%d\n"
1,line);
}
{const}{fprintf(fp,"
2,line);
{var}{fprintf(fp,"
3,line);
{integer}{fprintf(fp,"
4,line);
{long}{fprintf(fp,"
5,line);
{procedure}{fprintf(fp,"
6,line);
{if}{fprintf(fp,"
7,line);
{then}{fprintf(fp,"
8,line);
{while}{fprintf(fp,"
9,line);
{do}{fprintf(fp,"
10,line);
{read}{fprintf(fp,"
11,line);
{write}{fprintf(fp,"
12,line);
{begin}{fprintf(fp,"
13,line);
{end}{fprintf(fp,"
14,line);
{odd}{fprintf(fp,"
15,line);
{add}{fprintf(fp,"
16,line);
{minus}{fprintf(fp,"
17,line);
{multiply}{fprintf(fp,"
18,line);
{div}{fprintf(fp,"
19,line);
{equal}{fprintf(fp,"
20,line);
{m21}{fprintf(fp,"
21,line);
{m22}{fprintf(fp,"
22,line);
{m23}{fprintf(fp,"
23,line);
{m24}{fprintf(fp,"
24,line);
{m25}{fprintf(fp,"
25,line);
{m26}{fprintf(fp,"
26,line);
{m27}{fprintf(fp,"
27,line);
{m28}{fprintf(fp,"
28,line);
{m29}{fprintf(fp,"
29,line);
{m30}{fprintf(fp,"
30,line);
{m31}{fprintf(fp,"
31,line);
{m32}{fprintf(fp,"
32,line);
{constant}{__int64maxnum=0xffffffff;
if(strlen(yytext)>
10)
printf("
line%dconstanterror:
'
%s'
\n"
line,yytext);
else
fprintf(fp,"
33,line);
{identfier}{if(strlen(yytext)>
20){
line%didentfiererror:
34,line);
{whitespace}{}
{backspace}{if(strcmp(yytext,"
)==0){line++;
}}
voidmain()
{
yyin=fopen("
example.txt"
"
r"
);
fp=fopen("
data.txt"
w"
fclose(fp);
a"
yylex();
/*starttheanalysis*/
fclose(yyin);
}
intyywrap()
{
return1;
}
主程序代码:
#include<
string>
iostream>
fstream>
#include"
lex.yy.c"
usingnamespacestd;
inttoken[2000][2]={NULL};
inth=0;
inti,j,p=0;
voidprogram();
voidblock();
voidconsdefi();
voidconssuff();
voidvarsuff();
voidtypeil();
voidprocsuff();
voidsentence();
voidifsent();
voidwhilsent();
voidwrite();
voidexprsuff();
voidconditio();
voidexpress();
voidfactsuff();
voidfactor();
voidmuloper();
voidproghead();
voidconsexpl();
voidvarexl();
voidvandefi();
voidprocdefi();
voidprocedh();
voidassipro();
voidsuffix();
voidread();
voididsuff();
voidcompsent();
voidsentsuff();
voidtermsuff();
voidterm();
voidargument();
voidaddoper();
voidrespoper();
voidprogram()
proghead();
block();
if(token[h][0]==26)
{
h++;
if(token[h][0]==0)
{
printf("
语法分析完成\n"
}
else
p=1;
printf("
第%d行缺少.\n"
token[h-1][1]);
return;
voidproghead()
if(token[h][0]==1)
if(token[h][0]==34)
h++;
if(token[h][0]==28)
{
h++;
}
else
p=1;
第%d行缺少;
token[h-1][1]);
else
p=1;
第%d行缺少标识符\n"
第%d行缺少PROGRAM\n"
token[h][1]);
voidblock()
consexpl();
varexl();
procdefi();
compsent();
voidconsexpl()
if(token[h][0]!
=6&
&
token[h][0]!
=3&
=13)
if(token[h][0]==2)
consdefi();
conssuff();
第%d行缺少CONST\n"
voidconsdefi()
if(token[h][0]==34)
if(token[h][0]==20)
if(token[h][0]==33)
第%d行缺少无符号整数\n"
第%d行缺少=\n"
voidconssuff()
if(token[h][0]==28)return;
if(token[h][0]==27)
第%d行缺少,\n"
voidvarexl()
if(token[h][0]==3)
vandefi();
varsuff();
第%d行缺少VAR\n"
voidvandefi()
idsuff();
if(token[h][0]==29)
typeil();
第%d行缺少:
voididsuff()
if(token[h][0]==4||token[h][0]==5)
return;
=32&
=29)
if(token[h][0]==34)
idsuff();
voidvarsuff()
vandefi();
varsuff();
voidtypeil()
if(token[h][0]==4||token[h][0]==5)
第%d行缺少INTEGER或LONG\n"
token
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 语法分析 实验 报告