编译原理LL(1)语法分析实验报告要点(2)

2019-08-29 00:08

开始取得一个非终结符V查找产生式的右部含有V的产生式YV是不是最后一个字符NV后一个字符V*是否为终结符YY添加#到V的Follow集中YN是否遍历完所有右部含有V的产生式添加V*到V的Follow中Y将V*的First集加入到V的Follow集中是否有未求解过的非终结符N完成

3.预测分析控制程序的算法流程

5

输入要分析的字符串Y判断字符串是否正确N‘#’’E’进栈,当前终结符号送入a若产生式为A→A1A2…An,按逆序即[An…A2A1]入栈显示分析步骤读入下一符号显示栈中内容NY显示剩余输入串接受Y产生式右部为空?A∈Vt?YYA=‘a’?N匹配字符串?NNA=‘#’?YN产生式不存在?Y显示产生式NY出错出错

【源代码】

#include #include #include

6

#include

char A[20];/*分析栈*/ char B[20];/*剩余串*/

char v1[20]={'i','+','*','(',')','#'};/*终结符 */ char v2[20]={'E','G','T','S','F'};/*非终结符 */

int j=0,b=0,top=0,l;/*L为输入串长度 */

typedef struct type/*产生式类型定义 */ {

char origin;/*大写字符 */

char array[5];/*产生式右边字符 */ int length;/*字符个数 */ }type;

type e,t,g,g1,s,s1,f,f1;/*结构体变量 */ type C[10][10];/*预测分析表 */

void print()/*输出分析栈 */ {

int a;/*指针*/

for(a=0;a<=top+1;a++) printf(\ printf(\}/*print*/

void print1()/*输出剩余串*/ {

int j;

for(j=0;j

printf(\ printf(\}/*print1*/

void main() {

int m,n,k=0,flag=0,finish=0; char ch,x;

type cha;/*用来接受C[m][n]*/ /*把文法产生式赋值结构体*/ e.origin='E';

strcpy(e.array,\

7

e.length=2; t.origin='T';

strcpy(t.array,\ t.length=2; g.origin='G';

strcpy(g.array,\ g.length=3; g1.origin='G'; g1.array[0]='^'; g1.length=1; s.origin='S';

strcpy(s.array,\ s.length=3; s1.origin='S'; s1.array[0]='^'; s1.length=1; f.origin='F';

strcpy(f.array,\ f.length=3; f1.origin='F'; f1.array[0]='i'; f1.length=1;

for(m=0;m<=4;m++)/*初始化分析表*/ for(n=0;n<=5;n++)

C[m][n].origin='N';/*全部赋为空*/ /*填充分析表*/

C[0][0]=e;C[0][3]=e;

C[1][1]=g;C[1][4]=g1;C[1][5]=g1; C[2][0]=t;C[2][3]=t;

C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1; C[4][0]=f1;C[4][3]=f;

printf(\提示:本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析,\\n\

printf(\请输入要分析的字符串:\ do/*读入分析串*/ {

scanf(\

if ((ch!='i') &&(ch!='+') &&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')) {

printf(\输入串中有非法字符\\n\ exit(1); }

B[j]=ch;

8

j++;

}while(ch!='#'); l=j;/*分析串长度*/

ch=B[0];/*当前分析字符*/

A[top]='#'; A[++top]='E';/*'#','E'进栈*/

printf(\步骤\\t\\t分析栈 \\t\\t剩余字符 \\t\\t所用产生式 \\n\ do {

x=A[top--];/*x为当前栈顶字符*/ printf(\ printf(\

for(j=0;j<=5;j++)/*判断是否为终结符*/ if(x==v1[j]) {

flag=1; break; }

if(flag==1)/*如果是终结符*/ {

if(x=='#') {

finish=1;/*结束标记*/

printf(\接受 */ getchar(); getchar(); exit(1); }/*if*/ if(x==ch) {

print(); print1();

printf(\匹配\\n\

ch=B[++b];/*下一个输入字符*/ flag=0;/*恢复标记*/ }/*if*/

else/*出错处理*/ {

print(); print1();

printf(\出错\\n\输出出错终结符*/ exit(1); }/*else*/ }/*if*/

else/*非终结符处理*/

9


编译原理LL(1)语法分析实验报告要点(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:XX花城项目营销策划构思方案

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: