📄 ll1.cpp
字号:
// LL1.cpp : Defines the entry point for the console application.
//
// LL1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "windows.h"
typedef struct
{
char *text;
int len;
}table;
//-------------------------------------
typedef struct
{
char data[30];
int top;
}stack;
stack S;
char unend_char[5]={'E','G','T','L','F'};
char end_char[8]={'i','+','-','*','/','(',')','$'};
//--------------------------------------------------------------
int End_Char(char ch)
{
for(int i=0;i<8;i++)
{
if(ch==end_char[i])
return i;
}
return -1;
}
//------------------------------------------------------------
int Unend_Char(char ch)
{
for(int i=0;i<5;i++)
{
if(ch==unend_char[i])
return i;
}
return -1;
}
table M[5][8];
char word[30];
int length;
void setanalytical_table()
{
for(int i=0;i<5;i++)
for(int j=0;j<8;j++)
{
M[i][j].text="@";
M[i][j].len=1;
}
M[0][0].text="TG";
M[0][0].len=2;
M[0][5].text="TG";
M[0][5].len=2;
M[1][1].text="+TG";
M[1][1].len=3;
M[1][2].text="-TG";
M[1][2].len=3;
M[1][6].text="e";
M[1][6].len=1;
M[1][7].text="e";
M[1][7].len=1;
M[2][0].text="FL";
M[2][0].len=2;
M[2][5].text="FL";
M[2][5].len=2;
M[3][1].text="e";
M[3][1].len=1;
M[3][2].text="e";
M[3][2].len=1;
M[3][3].text="*FL";
M[3][3].len=3;
M[3][4].text="/FL";
M[3][4].len=3;
M[3][6].text="e";
M[3][6].len=1;
M[3][7].text="e";
M[3][7].len=1;
M[4][0].text="i";
M[4][0].len=1;
M[4][5].text="(E)";
M[4][5].len=3;
S.data[0]='$';
S.data[1]='E';
S.top=1;
printf(" LL(1)文法如下:\n");
printf(" ┏━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┓\n");
printf(" ┃ ┃ i ┃ + ┃ - ┃ * ┃ / ┃ ( ┃ ) ┃ $ ┃ \n");
for(i=0;i<5;i++)
{
printf(" ┣━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━┫\n");
printf(" ┃ %2c ┃",unend_char[i]);
for(int j=0;j<8;j++)
{
if(M[i][j].text!="@")
{
printf("%c",unend_char[i]);
printf("→");
printf("%3s┃",M[i][j].text);
}
else
{
printf(" ┃");
}
}
printf("\b\b");
printf("┃\n");
}
printf(" ┗━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┛\n");
}
void show(stack S,char word[],int i,int length)
{
printf(" ");
for(int k=0;k<=S.top;k++)
printf("%c",S.data[k]);
for(k=0;k<=26-S.top-length+i;k++)
printf(" ");
for(int j=i;j<=length;j++)
printf("%c",word[j]);
printf("\t");
printf("\n");
}
void Operation_analysing(stack S,char word[],int length)
{
int flag=0;
int i=0;
int m,n;
show(S,word,i,length);
while(S.data[S.top]!='$'&&flag==0)
{
if(End_Char(S.data[S.top])!=-1)
{
if(S.data[S.top]==word[i])
{
S.top=S.top-1;
i++;
show(S,word,i,length);
}
else
{
flag=1;
}
}
else
{
m=Unend_Char(S.data[S.top]);
n=End_Char(word[i]);
if(strcmp(M[m][n].text,"e")==0)
{
S.top--;
show(S,word,i,length);
}
else if(strcmp(M[m][n].text,"@")!=0)
{
S.top--;
for(int j=M[m][n].len-1;j>=0;j--)
{
S.top++;
S.data[S.top]=M[m][n].text[j];
}
show(S,word,i,length);
}
else
{
flag=1;
}
}
}
if(flag==0)
printf("输入的运算式符合LL(1)文法!\n");
else
printf("输入的运算式不符合LL(1)文法!\n");
}
int main(int argc, char* argv[])
{
char ch;
system("color a");
setanalytical_table();
length=0;
printf("请输入一个表达式(例如:i+i*i-(i+i/i)$):");
scanf("%c",&ch);
while(ch!='$')
{
word[length]=ch;
length++;
scanf("%c",&ch);
}
word[length]='$';
printf("==================================\n");//
printf(" 栈 ┃ 输入 \n");
printf("━━━━━━━━┻━━━━━━━━\n");
Operation_analysing(S,word,length);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -