pl0语法分析.docx
- 文档编号:398305
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:30
- 大小:23.37KB
pl0语法分析.docx
《pl0语法分析.docx》由会员分享,可在线阅读,更多相关《pl0语法分析.docx(30页珍藏版)》请在冰豆网上搜索。
pl0语法分析
#include
/********************************************************************
/PLO的编译程序C++版
/
/词法分析语法分析符号表
/
/词法分析过程中
/遇到.号就立即结束,无论后面是否有内容都忽略
/遇到非法字符,中断分析并给出错误报告
/遇到超过14个字母的单词,截断成14个字母的,如果他不是数字再截断成10个字母的并给出错误报告
/遇到数字开头的标识符中断分析并给出错误报告
/
/语法分析过程中
/利用词法分析的结果进行分析
/严格按照PL0程序定义来编写
/
/<程序>:
:
=<程序首部><分程序>.
/<程序首部>:
:
=PROGRAM<标识符>;
/<分程序>:
:
=[<常量说明部分>][<变量说明部分>][<过程说明部分>]<语句部分>/<常量说明部分>:
:
=CONST<常量定义>{,<常量定义>};
/<常量定义>:
:
=<标识符>=<无符号整数>
/<变量说明部分>:
:
=VAR<标识符>{,<标识符>};
/<过程说明部分>:
:
=<过程首部>;<分程序>【;原课件中没有最后的分号,经分析应该有分号】/<过程首部>:
:
=PROCEDURE标<识符>
/<语句部分>:
:
=<语句>|<复合语句>
/<复合语句>:
:
=BEGIN<语句>{;<语句>}END【符合语句应该注意的是,END前距离END最近
的那条语句一定没有分号,其他语句必须有分号】
/<语句>:
:
=<赋值语句>|<条件语句>|<当型循环语句>|<过程调用语句>|<读语句>|<写语句>|<复合语句>
/<赋值语句>:
:
=<标识符>:
=<表达式>
/<读语句>:
:
=READ(标识符>{,<标识符>})
/<写语句>:
:
=WRITE(^达式>{,<表达式>})
/<过程调用语句>:
:
=CALL<标识符>【原课件中有分号,实际不应该有】
/<条件语句>:
:
=IF<条件>THEN<语句>
/<当型循环语句>:
:
=WHILE<条件>DO<语句>
/<因子>:
:
=<标识符>|<常量>|(<表达式>)
/<项>:
:
=<因子>{<乘法运算符><因子>}
/<乘法运算符>:
:
=*|/
/<表达式>:
:
=[+|-]<项>{<加法运算符><项>}
/<加法运算符>:
:
=+|-
/<条件>:
:
=<表达式><关系运算符><表达式>|ODD<表达式>
/<关系运算符>:
:
=#|=|>|>=|<|<=
/
/如果上述的任意一个步骤出了问题都会有错误提示,并指出是在源文件中的第几行,是哪一个定义出了问题
/当一个<语句>【复合语句除外】判断成功之后,在词法分析的结果找到这个语句的开始和结束,并输出这个语句是什么语句
/语法分析的实际操作类似一个走迷宫的搜索问题,找到一个可行的方向就前进,直到走到把所有单词都分析完,或者走不通了,一层层回溯返回FALSE合出错误信息
/
/符号表
/符号表的建立是在语法分析的深度优先搜索的基础上完成的
/基于深度优先搜索的特点当一个过程分析完,直接就能得到它的层级
/变量的LEVEL等于定义该变量的过程的LEVEL+1
/每个过程的变量的ADR都重新从3开始递增
/常量没有LEVEL没有ADR,
/变量和常量都没有SIZE
/当程序的变量分析完就得到了符号表中最近插入的过程的SIZE!
SIZE等于该过程的最后
个变量的ADR+1,若该过程没有变量则等于3】
/
*******************************************************************/typedefstructt{
stringname,kind;intval,lev,adr,size;
}Table;
boolisChengXu(intlev);
boolisFenChengXu(intlev);
boolisChengXuShouBu();
boolisChangLiangShuoMing();
boolisBianLiangShuoMing();
boolisGuoChengShuoMing(intlev);boolisYuJuBuFen();
boolisChangLiangDingYi();
boolisGuoChengShouBu(intlev);
boolisYuJu();
boolisFuHeYuJu();
boolisFuZhiYuJu();
boolisWhileDoYuJu();
boolisIfYuJu();
boolisCallYuJu();
boolisWriteYuJu();
boolisReadYuJu();
boolisTiaoJian();
boolisYinZi();
boolisXiang();
boolisBiaoDaShi();
voidprintYuFa(intx,inty,stringstatement);//输出语法分析的结果
voidaddtotable(stringname,stringkind,intval,intlev,intadr,intsize);//把记录加入符号表
intstoi(strings);//字符串转化成数字stringitos(intn);//数字转化成字符串
interror(inte,inteline);//指出在eline行有错误eboolisNumber(strings);//判断一个字符串是不是一个数字stringstrtoupper(strings);//把字符串转换为大写stringstrtolower(strings);//把字符串转换为小写
intlvkongge(stringmSourse,int&i);//虑空格,遇到文件末尾结束,返回-1stringgetnext(stringmSourse,int&i);//从源文件中识别一个单词并返回boolcifafenxi(stringmSourse);//词法分析的主函数,执行虑空格操作,然后用getnext函数获取下一个单词进行分析,依次循环知道lvkongge函数返回-1voidinitmp();//初始化保留字界符的查找表,
boolnexteql(strings);//从词法分析的结果顶部取出一个单词,判断s是否与之相等,不相等返回FALSE相等返回TRUE并且顶部指针指向词法分析结果的下一个单词
voidprintYuFa(intx,inty,stringstatement);//输出语句,在词法分析的结果数组中下标号从x到y是一个statement语句,遍历输出这个语句
voidprinttable();//输出符号表
voidprintErrors();//输出错误报告
map
stringwQueue[200][2];//词法分析的最终结果,模拟成一个队列【wQueue[i][0]是第i个位置的单词,wQueue[i][1]是第i个单词的类别】
intwhead=0,wtail=0;//队列的头,尾指针
intwline[200]={0},line=1;//单词的行号,与wQueue对应
stringname;//每一次调用nexteqls函数都会改变,具体看nexteqls函数
stringerrors[100];//存储的错误信息
intetop=0;
Tabletable[100];
inttabletop=0,padr=1,pradr=3,plev=-1,ltx=0;
voidaddtotable(stringname,stringkind,intval,intlev,intadr,intsize){//添加一条信息到符号表table[tabletop].name=name;
table[tabletop].kind=kind;table[tabletop].val=val;table[tabletop].lev=lev;table[tabletop].adr=adr;
table[tabletop++].size=size;if(kind=="PROCEDURE"){plev=lev,pradr=3;if(tabletop>0){table[ltx].size=table[tabletop-2].adr==-1?
3:
(1+table[tabletop-2].adr);
}ltx=tabletop-1;
}
}
stringfind(strings){
inti=0;while(i } i++; } return"@_@"; } intstoi(strings){//把字符串转换成整数 inti=-1; intr=0;while(s[++i]){r*=10;r+=s[i]-'0'; }returnr; } stringitos(intn){//把整数n转换成string型strings; charc[10]=""; intl=8; c[9]=0;while(n>=10){c[l--]=n%10+'0';n/=10; c[l--]=n+'0';s=c+(++l);returns; } interror(inte,inteline){//错误处理switch(e){ case0: {errors[etop++]=itos(e)+": "+itos(eline)+"行有非法字符";break; } case1: {errors[etop++]=itos(e)+": "+itos(eline)+"行有超过14个字母的单词";break; } case2: {errors[etop++]=itos(e)+": "+itos(eline)+"行有数字开头的标识符";break; } case3: {errors[etop++]=itos(e)+": "+itos(eline)+"行有超过10个字母的标识符";break; } case4: {errors[etop++]=itos(e)+": "+itos(eline)+"行程序结尾没有.";break; } case5: {errors[etop++]=itos(e)+": "+itos(eline)+"行程序首部标识符后面没有;";break; } case6: { errors[etop++
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pl0 语法分析