武汉理工大学《编译原理》课程设计说明书
(1)
(2)
(3)
(4)
T1:=b+c
T2:=2*d
a:=T1
if a
武汉理工大学《编译原理》课程设计说明书
6 具体实现算法描述:
6.1 建立简单优先级矩阵:
在本实验的程序中关键在于简单优先矩阵的构造,这是此次课程设计中的重中之重。因
为在语法分析中,一切字符串形成句柄并进行规约,都是根据简单优先矩阵来确定的。
所以首先建立简单优先矩阵,如下所示:(其中 N 表示两者不相邻,-1 表示小于,0 表示
等于,1 表示大于)
6.2 语法分析的实现:
首先建立一个符号栈 Sym,首先将#压入栈 Sym 中,然后与第一个词法分析获得的单词根
据简单优先矩阵进行优先级大小的比较,假如优先级较小或等于,则将其压入 Sym 中,取得
当前 Sym 中的栈顶元素与下一个单词进行比较,如此反复,直到遇到下一个输入的单词的优
先级大于当前 Sym 栈顶的元素。再依次回推,遇到第一个小于优先级符号,则将优先级不同
符号两者之间的字符串与文法句子比较,若满足文法规定条件则进行规约,将规约后的式子
用文法规定的字符替代,继续参与分析,直到分析完毕,规约到文法的开始符号完成整个分
析过程。若不符合条件,则输出出错信息,不再进行规约。
5
武汉理工大学《编译原理》课程设计说明书
6.3 程序流程图:
开始
读入字符串
词法分析
将#号入栈
从识别的单词中读取
一个单词
小(等)于
栈 顶 相 邻 元 素 优
先级比较
大于
将单词压入栈中
取栈顶元素
读取下一个单词
向栈底回推
小于
大于
相邻元素比较
Y
N
满足文法
向后取下一个
规约
出错
结束
6
武汉理工大学《编译原理》课程设计说明书
6.4 算法实现的关键代码:
void Yufafenxi()//简单优先语法分析
{
char c;
//保存栈顶元素
char t1;
//规约时判断是否规约的栈顶元素
char t2;
//规约时判断是否规约的次栈顶元素
cout<<"归约过程如下:"<
武汉理工大学《编译原理》课程设计说明书
case 1:
{
do
{
t1 = Sta.TopValue();
buf[count1][0]=0;
buf[count1][count2]=t1;
count2++;
t2 = Sta.NextTop();
Sta.Pop(c);//栈顶出栈
}while(Compare(t2, t1) != -1);
/* cout<=0;j--)
cout<