求 编译原理 语法分析程序

求 编译原理 语法分析程序,第1张

#include <iostream>

#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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12091333.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存