编译原理c++语法分析器

语法分析器

      针对编译原理第三版-何炎祥主编的书中一个 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;
}


   运行结果截图:



评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值