杨阳《编译原理》实验报告物联网1103班0909113119Word格式.docx
- 文档编号:20386682
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:52
- 大小:241.38KB
杨阳《编译原理》实验报告物联网1103班0909113119Word格式.docx
《杨阳《编译原理》实验报告物联网1103班0909113119Word格式.docx》由会员分享,可在线阅读,更多相关《杨阳《编译原理》实验报告物联网1103班0909113119Word格式.docx(52页珍藏版)》请在冰豆网上搜索。
===!
==;
()[]{}/**/
其它标记:
idnum
ID=letterletter*
NUM=digitdigit*
letter=a|b|...|z|A|B|...|Z|
ditit=0|1|...|9
通过在C语言中定义一个枚举类型来识别这些符号:
PL/0语言的EBNF表示
<
常量定义>
:
=<
标识符>
无符号整数>
;
字母>
={<
|<
数字>
};
加法运算符>
:
=+|-
乘法运算符>
=*|/
关系运算符>
==|#|<
=|>
|>
=
=a|b|…|X|Y|Z
=0|1|2|…|8|9
五、实验结果
首先设置终止符,以#开头,#后加任意字符,设置为终止符。
输入一段字符串,程序能判断其中是否有关键字、专用字符、其他标记、数字等,并显示出来是哪些关键字、专用字符、数字、其它标记。
不同的flag值,表示不同的信息。
比如,flag=1表示含有关键字void,flag=2表示含有关键字main,flag=502表示含有‘(’,flag=200表示含有数字等。
六、源程序
#include<
iostream.h>
stdio.h>
stdlib.h>
string.h>
inti,j,k,flag,number,status;
/*statuswhichisusetojudgethestringiskeywordsornot!
*/
charch;
charwords[10]={"
"
charprogram[500];
intScan(charprogram[])
{
char*keywords[13]={"
void"
"
main"
if"
then"
break"
int"
"
char"
float"
include"
for"
while"
printf"
scanf"
number=0;
status=0;
j=0;
ch=program[i++];
/*Tohandlethelettlespaceandstab*/
/*handleletters*/
if((ch>
='
a'
)&
&
(ch<
z'
))
while((ch>
words[j++]=ch;
ch=program[i++];
}
i--;
words[j++]='
\0'
for(k=0;
k<
13;
k++)
if(strcmp(words,keywords[k])==0)
switch(k)
case0:
flag=1;
status=1;
break;
case1:
flag=2;
case2:
flag=3;
case3:
flag=4;
case4:
flag=5;
case5:
flag=6;
}
case6:
flag=7;
case7:
flag=8;
case8:
flag=9;
case9:
flag=10;
case10:
flag=11;
case11:
flag=12;
case12:
flag=13;
if(status==0)
{
flag=100;
/*handledigits*/
elseif((ch>
0'
9'
))
)&
number=number*10+(ch-'
);
ch=program[i++];
flag=200;
i--;
/*opereationandedgehandle*/
elseswitch(ch)
case'
='
if(ch=='
)
words[j++]=ch;
words[j]='
ch=program[i++];
flag=401;
else
flag=402;
case'
>
'
words[j]='
flag=403;
flag=404;
flag=405;
flag=406;
!
ch=program[i++];
flag=407;
flag=408;
+'
flag=409;
elseif(ch=='
flag=410;
flag=411;
-'
words[j++]=ch;
words[j]='
flag=412;
elseif(ch=='
flag=413;
flag=414;
*'
flag=415;
flag=416;
/'
flag=417;
flag=418;
words[j]=ch;
words[j+1]='
flag=501;
('
flag=502;
)'
flag=503;
['
flag=504;
]'
flag=505;
{'
flag=506;
}'
flag=507;
flag=508;
"
flag=509;
%'
flag=510;
flag=511;
'
flag=512;
#'
flag=513;
@'
flag=0;
default:
flag=-1;
returnflag;
main()
i=0;
printf("
pleaseinputaprogramendwith@"
do
ch=getchar();
program[i++]=ch;
}while(ch!
i=0;
do{
flag=Scan(program);
if(flag==200)
(%2d,%4d)"
flag,number);
elseif(flag==-1)
(%d,error)"
flag);
(%2d,%4s)"
flag,words);
}while(flag!
=0);
system("
pause"
实验二语法分析
给出PL/0语言文法规范,要求编写PL/0语言语言的语法分析程序。
安装好C语言或C++。
2~4学时
已给PL/0语言文法,利用递归子程序法,编制语法分析程序,要求将错误信息输出到语法错误文件中,输出语法树。
1、实验方法
读懂PL/0语言源代码,给出相关源代码的注释。
2、递归子程序法:
对于每个非终结符,编写一个子程序,由该子程序负责识别该语法单位是否正确。
表达式的文法
〈表达式〉∷=[+|-]〈项〉{(+|-)〈项〉}
〈项〉∷=〈因子〉{(*|/)〈因子〉}
〈因子〉∷=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’
〈表达式〉的递归子程序实现
procedureexpr;
begin
ifsymin[plus,minus]then
begin
getsym;
term;
end
elseterm;
whilesymin[plus,minus]do
end;
〈项〉∷=〈因子〉{(*|/)〈因子〉}
〈项〉的递归子程序实现
procedureterm;
factor;
whilesymin[times,slash]do
〈因子〉的递归子程序实现
procedurefactor;
begin
ifsym<
identthen
numberthen
ifsym=‘(‘then
expr;
ifsym=‘)’thengetsym
elseerror
elsegetsym
end;
五、程序核心代码和注释:
publicvoidanalyzer()
{
//***************************
//循环读取grammar.txt
/*此处代码略*/
//循环读取lengh.txt
/*此处代码略*/
//****************************
//读入文件,进行语法分析
//
stringstrReadFile;
strReadFile="
input.txt"
myTextRead.myStreamReader=newStreamReader(strReadFile);
stringstrBufferText;
intwid=0;
Console.WriteLine("
分析读入程序(记号ID):
\n"
do
{
strBufferText=myTextRead.myStreamReader.ReadLine();
if(strBufferText==null)
break;
foreach(StringsubStringinstrBufferText.Split())
{
if(subString!
="
{
intll;
if(subString!
=null)
{
ll=subString.Length;
//每一个长度
}
else
break;
inta=ll+1;
char[]b=newchar[a];
StringReadersr=newStringReader(subString);
sr.Read(b,0,ll);
//把substring读到char[]数组里
intsort=(int)b[0];
//word[i]和wordNum[i]对应
//先识别出一整个串,再根据开头识别是数字还是字母
Word[wid]=subString;
if(subString.Equals("
{wordNum[wid]=0;
else
if(subString.Equals("
{wordNum[wid]=1;
else
{
if(subString.Equals("
()"
{wordNum[wid]=2;
else
{
if(subString.Equals("
{"
{wordNum[wid]=3;
else
{
if(subString.Equals("
{wordNum[wid]=4;
else
{
if(subString.Equals("
{wordNum[wid]=6;
else
{
if(subString.Equals("
}"
{wordNum[wid]=22;
else
{
if(subString.Equals("
{wordNum[wid]=23;
else//识别变量和数字
{
if(sort>
47&
sort<
58)
{wordNum[wid]=7;
else
{wordNum[wid]=5;
}
}
}
}
}
}
}
Console.Write(subString+"
("
+wordNum[wid]+"
)"
+"
wid++;
}
}
Console.WriteLine("
}while(strBufferText!
=null);
wordNum[wid]=24;
myTextRead.myStreamReader.Close();
//*********************************
//读入LR分析表
//***********************************
int[]state=newint[100];
string[]symbol=newstring[100];
state[0]=0;
symbol[0]="
#"
intp1=0;
intp2=0;
\n按文法规则归约顺序如下:
//***************
//归约算法如下所显示
while(true)
{
intj,k;
j=state[p2];
k=wordNum[p1];
t=LR[j,k];
//当出现t为0的时候
if(t==0)
//错
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 杨阳 编译 原理 实验 报告 联网 1103 0909113119