#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stack>
using namespace std
struct Node1
{
char vn
char vt
char s[10]
}MAP[20]//存储分析预测表每个位置对应的终结符,非终结符,产生式
int k
//用R代表E',W代表T',e代表空
char G[10][10]={"E->TR","R->+TR","R->e","T->FW","W->*FW","W->e","F->(E)","F->i"}//存储文法中的产生式
char VN[6]={'E','R','T','W','F'}//存储非终结符
char VT[6]={'i','+','*','(',')','#'}//存储终结符
char SELECT[10][10]={"(,i","+","),#","(,i","*","+,),#","(","i"}//存储文法中每个产生式对应的SELECT集
char Right[10][8]={"->TR","->+TR","->e","->FW","->*FW","->e","->(E)","->i"}
stack <char>stak,stak1,stak2
bool compare(char *a,char *b)
{
int i,la=strlen(a),j,lb=strlen(b)
for(i=0i<lai++)
for(j=0j<lbj++)
{
if(a[i]==b[j])
return 1
}
return 0
}
char *Find(char vn,char vt)
{
int i
for(i=0i<ki++)
{
if(MAP[i].vn==vn &&MAP[i].vt==vt)
return MAP[i].s
}
return "error"
}
char * Analyse(char * word)
{
char p,action[10],output[10]
int i=1,j,l=strlen(word),k=0,l_act,m
while(!stak.empty())
stak.pop()
stak.push('#')
stak.push('E')
printf("________________________________________________________________________________\n")
printf("\n对符号串%s的分析过程\n",word)
printf("步骤栈顶元素剩余输入串推到所用产生式或匹配\n")
p=stak.top()
while(p!='#')
{
printf("%7d ",i++)
p=stak.top()
stak.pop()
printf("%6c ",p)
for(j=k,m=0j<lj++)
output[m++]=word[j]
output[m]='\0'
printf("%10s",output)
if(p==word[k])
{
if(p=='#')
{
printf("接受\n")
return "SUCCESS"
}
printf(" “%c”匹配\n",p)
k++
}
else
{
strcpy(action,Find(p,word[k]))
if(strcmp(action,"error")==0)
{
printf("没有可用的产生式\n")
return "ERROR"
}
printf("%c%s\n",p,action)
int l_act=strlen(action)
if(action[l_act-1]=='e')
continue
for(j=l_act-1j>1j--)
stak.push(action[j])
}
}
if(strcmp(output,"#")!=0)
return "ERROR"
}
int main ()
{
freopen("in.txt","r",stdin)
//freopen("out.txt","w",stdout)
char source[100]
int i,j,flag,l,m
printf("\n*****为了方便编写程序,用R代表E',W代表T',e代表空*****\n\n")
printf("该文法的产生式如下:\n")
for(i=0i<8i++)
printf(" %s\n",G[i])
printf("________________________________________________________________________________\n")
printf("\n该文法的SELECT集如下:\n")
for(i=0i<8i++)
{
printf(" SELECT(%s) = { %s }\n",G[i],SELECT[i])
}
printf("________________________________________________________________________________\n")
//判断是否是LL(1)文法
flag=1
for(i=0i<8i++)
{
for(j=i+1j<8j++)
{
if(G[i][0]==G[j][0])
{
if(compare(SELECT[i],SELECT[j]))
{
flag=0break
}
}
}
if(j!=8)
break
}
if(flag)
printf("\n有相同左部产生式的SELECT集合的交集为空,所以文法是LL(1)文法。\n")
else
printf("\n有相同左部产生式的SELECT集合的交集不为空,所以文法不是LL(1)文法。\n")
printf("________________________________________________________________________________\n")
//预测分析表
for(i=0,k=0i<8i++)
{
l=strlen(SELECT[i])
for(j=0j<lj+=2)
{
MAP[k].vn=G[i][0]
MAP[k].vt=SELECT[i][j]
strcpy(MAP[k].s,Right[i])
k++
}
}
printf("\n表达式文法的预测分析表如下:\n\n")
printf(" ")
for(i=0i<6i++)
printf("%10c",VT[i])
printf("\n")
for(i=0i<5i++)
{
printf("---------------------------------------------------------------\n")
printf("%10c",VN[i])
for(j=0j<6j++)
{
for(m=0m<km++)
{
if(VN[i]==MAP[m].vn &&VT[j]==MAP[m].vt)
{
printf("%10s",MAP[m].s)
break
}
}
if(m==k)
printf(" ")
}
printf("\n")
}
/*预测分析程序
Analyse函数*/
//输入源文件串
while(cin>>source)
{
printf("\n分析结果:%s\n\n",Analyse(source))
}
while(1)
return 0
}
编译原理IF条件语句的翻译程序设计—简单优先法、输出四元式通过设计、编制、调试一个条件语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。具体做到以下几点:①对输入语句进行词法分析。将输入的字符串进行扫描和分解,识别出一个个合法的单词。单词种类包括:关键字,标识符,运算符,常数和界限符②进行语法分析。编写条件语句的相应文法,按照语法分析方法中的简单优先分析法为文法设计简单优先表,对词法分析得到的单词序列进行语法分析,以判别输入的语句是否属于该文法的条件语句。③语法制导翻译。设计中间代码(四元式)序列的结构及属性文法,运用语法制导翻译,在进行语法分析的同时,执行相应的语义规则描述的动作,从而实现语义处理,生成中间代码以四元式的形式输出。④错误提示。对不同的错误给出简略描述,并终止程序的继续执行。下载地址如下,有你要的东西!pile.rar欢迎分享,转载请注明来源:内存溢出
评论列表(0条)