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

语法分析器

      针对编译原理第三版-何炎祥主编的书中一个 LL(1)语法分析表利用c++编写了语法分析程序,下附加代码

/*
Name: LL(1)语法分析器 
Copyright: 
Author:y cc 
Date: 18/04/17 16:26
Description: 根据固定的分析表,这里是编译原理第三版-何炎祥主编的书中一个语法分析表 对输入以$结尾的字符串进行判断是否符合语法 
*/
#include
#include
#include
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<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($"<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<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<<"#"<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<<"#"<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<<"#"<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<<"#"<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<<"#"<


   运行结果截图:

编译原理c++语法分析器_第1张图片

编译原理c++语法分析器_第2张图片

你可能感兴趣的:(c++,编译原理)