语法分析器
针对编译原理第三版-何炎祥主编的书中一个 LL(1)语法分析表,利用c++编写了语法分析程序,下附加代码:
/*
Name: LL(1)语法分析器
Copyright:
Author:y cc
Date: 18/04/17 16:26
Description: 根据固定的分析表,这里是编译原理第三版-何炎祥主编的书中一个语法分析表 对输入以$结尾的字符串进行判断是否符合语法
*/
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
typedef struct
{
char data[10];
int top;
} message;//栈内元素对象
void create(message *&m)
{
m=(message *)malloc(sizeof(message));
m->top=-1;
}
void push(message *&m,char i)//进栈操作
{
if(m->top<10)
{
m->top++;
m->data[m->top]=i;
}
else
cout<<"栈满";
}
char pop(message *&m)//出栈操作
{
char i;
if(m->top!=-1)
{
i=m->data[m->top];
m->top--;
return i;
}
else
cout<<"栈空";
}
void getStr(char str[])//将输入的以$结尾的字符串 保存于字符串数组中
{
int j=0;
while(true)
{
cin>>str[j];
if(str[j]=='$')
break;
else
j++;
}
}
void output(message *m,char *j)//用于输出符号栈与输入串的代码
{
int counti=0,countj=0;
while(m->top>-1)
{
cout<<m->data[m->top];
m->top--;
counti++;
}
cout<<" ";
while(*j!='$')
{
cout<<*j;
j++;
countj++;
}
cout<<"$";
while(counti!=0)
{
m->top++;
counti--;
}
while(countj!=0)
{
j--;
countj--;
}
}
int main() //main方法
{
string b[6][6]={{""," "," ","a","a"," "},//对应分析表
{" "," "," ","bA","bA"," "},
{"ibA"," ","#"," "," ","#"},
{" "," "," ","cB","cB"," "},
{"#","+cB","#"," "," ","#"},
{" "," "," ","(",")a*"," "}};
int i=-1;
message *m;
create(m);
cout<<"输入字符串,字符串以$结尾,注意调成英文输入法。例如 (i($"<<endl;
char str[20];
getStr(str);//获取字符串
char *j=str;
push(m,'$');//'$'进栈
push(m,'s');//'s'进栈
cout<<" 符号串分析过程 "<<endl;
cout<<"符号栈m 输入串str[j] 产生式b[][]"<<endl;
while(true)
{
//终结符时的判断
if(m->data[m->top]=='i'||m->data[m->top]=='+'||m->data[m->top]=='*'||m->data[m->top]=='('||m->data[m->top]==')'||m->data[m->top]=='#'||m->data[m->top]=='$')
{
if(m->data[m->top]==*j)
{
if(m->data[m->top]=='$')//设定终结条件
{
output(m,j);//用于输出符号栈与输入串的代码
cout<<" ";
cout<<"ok";
break;
}
else
{
output(m,j);//用于输出符号栈与输入串的代码
cout<<endl;
j++;
pop(m);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
//非终结符的判断开始
else if(m->data[m->top]=='s')//非终结符's'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=0;
int n;
int k;
switch(*j) //利用这种方式查找产生式,这是我觉得比较得意的方式
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
} //非终结符's'
else if(m->data[m->top]=='a') //非终结符'a'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=1;
int n;
int k;
switch(*j)
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
}//非终结符'a'
else if(m->data[m->top]=='A')//非终结符'A'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=2;
int n;
int k;
switch(*j)
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
}//非终结符'A'
else if(m->data[m->top]=='b')//非终结符'b'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=3;
int n;
int k;
switch(*j)
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
}//非终结符'b'
else if(m->data[m->top]=='B')//非终结符'B'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=4;
int n;
int k;
switch(*j)
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
}//非终结符'B'
else//非终结符'C'
{
output(m,j);//用于输出符号栈与输入串的代码
int m1=5;
int n;
int k;
switch(*j)
{
case 'i':n=0;break;
case '+':n=1;break;
case '*':n=2;break;
case '(':n=3;break;
case ')':n=4;break;
case '$':n=5;break;
}
if(b[m1][n]=="#")
{
cout<<" ";
cout<<"#"<<endl;
pop(m);
}
else
{
cout<<" ";
cout<<b[m1][n]<<endl;
pop(m);
k=b[m1][n].size();
if(b[m1][n]!=" ")
{
char c[k];
strcpy(c,b[m1][n].c_str());//将String转化为 char[]
for(int j=0;j<k;j++)
{
push(m,c[k-j-1]);
}
}
else
{
cout<<"不是一个句子";
break;
}
}
}//非终结符'C'
}
return 0;
}
运行结果截图: