班级:_ _ 学号:_ _ 姓名_ _ 分:_ _
实验目
理解预测分析表方法实现原理
二实验容:
编写通预测法分析程序求定错误处理力出错够程序继续运行直分析程结束通文法(通数表现)进行测试
二实验容提示
1.算法数构造:
构造终结符数组:char Vt[10][5]{id+……}
构造非终结符数组:char Vn[10]{ }
构造follow集数组:char *follow[10][10]{ } (follow集预测分析表合存放)
数构造示例(预测分析表构造方法1):
*data1h简单算术表达式数*
char VN[10][5]{EE'TT'F} 非终结符表
int length_vn5 非终结符数
char VT[15][5]{id+*()#} 终结符表
int length_vt6 终结符数
char Fa[15][10]{TE'+TE'FT'*FT'(E)id}
产生式表0E>TE' 1E'>+TE' 2E'>空
3T>FT' 4T'>*FT' 5T'>空 6F>(E) 7F>id
int analysis_table[10][11]{02201100000
21222200000
31231100000
25 425 500000
71161100000}
预测分析表2表示出错属终结符follow集合1表示该行终结符follow集合错误处理正数表示产生式数组Fa中编号右部五列0表示余列
(1) 预测分析表构造方法1
文法正规式编号:存放字符数组中0开始编号正规式编号该正规式数组中应标述Fa数组表示存储产生式
构造产生式数组:char P[10][10]{E>TE’E’>+TE’……} (产生式存储右半部分E>TE’存储TE’ 正规式中符号换E’改M )
构造预测分析表:int analyze_table[10][10]{ } 数组元素值存放产生式编号12表示出错
(2)预测分析表构造方法2
三维数组
Char analyze_table[10][10][10]{ }
Char *analyze_table[10][10]{ }
2.针预测分析表构造方法1查预测分析表方法提示:
(1) 查非终结符表非终结符序号no1
(2) 查终结符表终结符序号no2
(3) 根no1no2查预测分析表应正规式序号no3analyze_table[no1][no2] 果no31 表示出错
(4) 根no3查找应正规式Fa[no3]
(5) 正规式进行处理
3.错误处理机制
紧急方式错误恢复方法(抛弃某符号继续分析)
(1)栈顶非终结符A串中前单词属FOLLOW(A)栈中弹出A(时认输入串中缺少A表示结构)继续分析 错误编号1
(2)栈顶非终结符A串中前单词属FOLLOW(A)串指针移位置(认输入串中前单词余)继续分析错误编号2
(3)栈顶终结符等串中前单词栈中弹出终结符(认输入串中缺少前单词)者串指针移位置(认串中前单词余)程序中选择述两种 观点中种进行处理错误编号3
error()函数编写方式方式处理
Error(int errornum)
{
If(errornum1)………………
Else if(errornum2)……………
Else ………………
者choose case语句处理
}
4.增加错误处理预测分析程序预测分析程序算法:
#文法开始符次压入栈中
第输入符号读入a
do{
栈顶符号弹出放入x中
if(x∈VT)
{
if(x==a) 输入符号读入a
else error(3)
}
else
if(M[xa]=x→y1y2…yk)
{
逆序次ykyk−1…y1压入栈中
输出x→y1y2…yk
}
else if aÎfollow(x)error(1) else error(2)
前述数定义中查表1表示aÎfollow(x)
}while(x#)
三.实验求
定算术表达式文法编写程序
测试数:
1.算术表达式文法
E→TE’
E’ → +TE’| TE’|ε
T→FT’
T’ →*FT’ | FT’ |FT’|ε
F→(E) |id|num
定符合该文法句子id+id*id输入二元式序列(词法分析结果预测分析程序二元式中第元值):(id0)(+)(id1)(*)(id2)运行预测分析程序出分析程步分析结果
输出形式参考图(结束符):
2. 作业310 文法
四 实验程
源程序:
#include
#include
#include
#include
using namespace std
#define MAXSIZE 100
typedef char DataType
typedef struct 定义栈
{
DataType data[MAXSIZE]
int top
}SeqStack
SeqStack *s
int sign0
int num1num2num3
char VN[10][5]{EMTNF}非终结符表
int length_vn5非终结符数
char VT[15][5]{+*()in#}终结符表
int length_vt10 终结符数
char Fa[15][5]{TM+TMTMFN*FNFNFN(E)in}产生式表 1E>TM2M>+TM3M>TM4M> 5E>FN6N> 7N>*FN8F>FN9F>FN10F>(E)11F>i12f>n
Char Pa[15][10]{E>TMM>+TMM>TMM>空T>FNN>空N>*FNF>FNF>FNF>(E)F>idF>num}
int analysis_table[10][11]{ {11111121110}
{23111141140}
{22111525510}
{66789161160}
{22222102111210}
}预测分析表
SeqStack *Init_SeqSTACK()栈初始化
{
SeqStack *s
snew SeqStack
if(s)
{
printf(空间足\n)
return NULL
}
else
{
s>top1
return s
}
}
void Push_SeqStack(SeqStack *schar x)入栈
{
if (s>topMAXSIZE1)
printf(栈满入栈)return 0
else
{
s>top++
s>data[s>top]x
return 1
}
}
char Pop_SeqStack(SeqStack *s)出栈
{
if(s>top1)
{
printf(栈空出栈) return 0
exit(0)
}
else
{
char xs>data[s>top]
s>top
return x
}
}
DataType Top_SeqStack(SeqStack *s) 取栈顶元素
{
if(s>top1)
return 0
else
return s>data [s>top ]
}
int BufVT(char s) 接收终结符保存VT[]数组中
{
int i0
while(i<15&&s'\n')
{
if(VT[i][0]s)
return 1
else
i++
}
return 0
}
int BufVN(char s) 接收非终结符保存VN[]数组中
{
int i0
while(i<10&&s'\n')
{
if(VN[i][0]s)
return 1
else
i++
}
return 0
}
int VTT(char s) 终结符匹配
{
int i0
while((VT[i][0]s))
i++
return i
}
int VNN(char s) 非终结符匹配
{
int i0
while(VN[i][0]s&&i
i++
}
if(ilength_vn)
return 1
return i
}
void Error(int errornumchar x)
{
if(errornum1)
{
printf(第种错误弹出栈顶元素\n)
Pop_SeqStack(s)
}
else if(errornum2)
printf(第二种错误跳c\nx)
else
{
if(x'#')
{
printf(第三种错误弹出栈顶元素\n)
Pop_SeqStack(s)
}
else
{
printf(第三种错误指针移弹出栈顶元素\n)
Pop_SeqStack(s)
sign++
}
}
}
void main()
{
char str1[20]str2[20]
int i0
printf(请输入分析文件名:)
scanf(sstr1)
FILE *fp
if((fpfopen(str1r))NULL)
{
printf(没文件\n)
exit(0)
}
while(feof(fp))
{
str2[i]fgetc(fp)
i++
}
str2[i]'\0'
fclose(fp)
Init_SeqSTACK()
s>top1
Push_SeqStack(s'#')
Push_SeqStack(s'E')
char x
printf(语法分析程:\n)
printf(栈顶元素\t\t前单词记号\t\t动作\n)
printf(\n)
do
{
xTop_SeqStack(s)
if(x'#')
goto loop
else
{
if(BufVT(str2[sign])&&BufVN(x))
{
printf(c\t\t\ts\t\t\tsxstr2[sign])
printf(前字符合法\n)
}
else if(BufVT(str2[sign]))
{
if(xstr2[sign])
{
printf(c\t\t\tc\t\t\txstr2[sign])
printf(匹配终结符c\nstr2[sign])
Pop_SeqStack(s)
sign++
}
else
{
BufVN(x)
num1VTT(str2[sign])
num2VNN(x)
char arr[10]
if(num21)
{
num3analysis_table[num2][num1]
if(num31)
{
printf(c\t\t\tc\t\t\txstr2[sign])
Error(1x)
}
if(num32)
{
printf(c\t\t\tc\t\t\txstr2[sign])
Error(2str2[sign])
sign++
}
else
{
printf(c\t\t\tc\t\t\txstr2[sign])
printf(展开非终结符s继续\nPa[num31])
Pop_SeqStack(s)
int j
for(j0j<5&&Fa[num31][j]'\0'j++)
{
arr[j]Fa[num31][j]
}
int k
kj1
for(k>0k)
{
Push_SeqStack(sarr[k])
}
}
}
else
{
printf(c\t\t\tc\t\t\txstr2[sign])
Error(3str2[sign])
Pop_SeqStack(s)
}
}
}
}
}while(x'#')
loop printf(c\t\t\tc\t\t\txstr2[sign])
printf(结束\n)
exit(0)
}
五. 实验结果
存入:i*(i+i)#
310文法
六. 心体会
次实验中学会预测表分析法基方法栈数结构进行复时学会预测表分析中follow集等方法创建语法分析进步掌握
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档