编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)

编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)_第1张图片

一、实验内容与要求

  • 先从键盘读入要分析的文法,由程序自动构造FIRST、FOLLOW 集以及SELECT集合,判断是否为LL (1)文法。

分析文法为G[E]:

(0)E→ TE’  

(1)E’→ +TE’

(2)E’→ε   

(3)T→ FT’

(4)T’→ *FT’  

(5)T’→ε    

(6)F→ (E)  

 (7)F→a

  • 若符合LL (1)文法,由程序自动构造LL (1)分析表;
  • 由算法判断给定的输入符号串a*(a+a)是否为该文法的句型。

二、实验代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
using namespace std;
mapgetnum;
vectorgetzf;  
vectorproce(10);
vectorfirst(20);
vectorfollow(20);
int table[100][100];      //预测分析表
int num;
int numv;//终结符的数量-1
char j[2];

//读取终结符、非终结符与产生式 
void  read()
{
	char c;
	int i=0;
	int n=0;
	cout<<"******************************LL(1)语法分析****************************"<>ss&&ss!="end")
	{		 
		dd.clear();
		dd+=ss[0];
		proce[j]+=dd;
		for(i=3;i90)
			{
			 	 for( y=0;y进去 
				 getnum[proce[i][k]]=++n;
				 getzf.push_back(proce[i][k]);
				}
			}
		}	  
	}
}
 getnum['@']=++n;
 numv=n;//终结符的数量等于当前n的值 
 getzf.push_back('@');
 //非终结符压栈 
	for(int i=0;i64&&proce[i][k]<91)
				{
				 	 for( y=0;yTA 
   for(int i=0;i要加上 
    for(int j=1;jsta){
	int length=sta.size();//栈中元素数目
	vectortemp;
	for(int i=0;i=0;j--){
		cout<sta;//分析栈 
    sta.push('#');  //#最先进栈 
	sta.push(proce[0][0]);//将开始符压入分析栈中进行初始化 
    int i=0;
	int count=1;//步骤计数  
    printf("步骤\t\t分析栈\t\t判定串\t\t使用规则\n");//表头 
    while(!sta.empty())
    {
       cout<";
           for(int j=1;j0;j--)  
                {  if(proce[k][j]!='@')
                   sta.push(proce[k][j]);
                }
       }
       else     
       {
           return 0;
       }
       count++;
    }
    return 1;
}


//输入待判断的符号串 
void scanf()  
{
	cout<<"请输入待判定的符号串:";
    cin>>word;
    cout<<"判断分析表如下:"<TH
H->+TH
H->@
T->FJ
J->*FJ
J->@
F->(E)
F->a
end
*/

三、实验结果

编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)_第2张图片

编译原理之LL(1)语法分析实验(附完整C/C++代码与测试)_第3张图片END.

 

你可能感兴趣的:(计算机核心课程,编译原理)