📄 ll1分析.cpp
字号:
// LL1分析.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "analysis.h"
/**************
文法描述:
E->TE'
E'->ATE'|ε
T->FT'
T'->MFT'|ε
F->(E)|i
A->+|-
M->*|/
**************/
//读入实验一中的二元式文件内容并完成转换
void ReadBuff()
{
char in[20];
FILE *infile;
do{
printf("\n请输入需要分析的源文件路径:");
scanf("%s",&in);
infile = fopen(in, "r");
if(infile==NULL)
printf("\n出错:未找到源文件,请再次输入源文件路径!\n\n");
}while(infile==NULL);
int id = 0, i = 0;
char b[20];
do{
fgets(b,20,infile);
char *cc;
cc = strtok(b,","); //用,分隔字符串b
id = atoi(cc); //把一个字符串转化成整形
switch(id){ //标号转换过程
case 12:
case 13:
buff[i++] = 'i';
break;
case 25:
buff[i++] = '/';
break;
case 26:
buff[i++] = '+';
break;
case 27:
buff[i++] = '-';
break;
case 28:
buff[i++] = '*';
break;
case 30:
buff[i++] = '(';
break;
case 31:
buff[i++] = ')';
break;
default:
break;
}
}while(id != 0 && i <= 50);
printf("\n转换为文法对应形式:%s\n\n",buff);
int n = strlen(buff);
buff[n++] = '#';
}
//打印输出分析过程
void PrintStep()
{
printf("%3d ",step);
for(int i=0; i< top; i++)
printf("%c",stack[i]);
for(int k=0; k< 12-i; k++)
printf(" ");
for(int j=index; j<(int)strlen(buff); j++)
printf("%c",buff[j]);
for(k=0; k< 10+index; k++)
printf(" ");
if(is_non_Terminate(currChar)){
int m = transFeiZhongjie(currChar);
int n = transZhongjie(buff[index]);
if(M_LL1[m][n] != NULL){
printf("%c->%s",currChar,M_LL1[m][n]);
}
else{
printf("分析出错");
}
}
if(currChar == '#' && buff[index] == '#')
printf("分析成功");
printf("\n");
}
//LL(1)文法分析过程
bool LL1Parser()
{
char* cc;
// printf("输入字符:");
// scanf("%s",buff);
//读入二元式文件并完成转换
ReadBuff();
//相关初始化操作
InitLL1Table();
InitStack();
step = 0;
index = 0;
push('#');
push('E');
printf("步骤 分析栈 余留输入串 所用产生式\n");
do{
step++;
currChar = stack[top-1];
PrintStep();
if(is_terminate(currChar)){ //终结符号
if(currChar == buff[index]){
pop();
index = index + 1;
}
else
{
return false;
}
}
else if(is_non_Terminate(currChar)){ //非终结符号
int m,n,j;
m = transFeiZhongjie(currChar);
n = transZhongjie(buff[index]);
if(m == -1 || n== -1)
return false;
cc = M_LL1[m][n];
if(cc == " " || cc == "" || cc == NULL) //出错
return false;
else if(cc == "e"){ //ε产生式
pop();
}else{ //非ε产生式
j = strlen(cc);
pop();
while(j>0){
j--;
push(cc[j]);
}
}
}
else
{
return false;
}
if(currChar == '#' && buff[index] == '#')
return true;
else if(index == 0 && top==0)
return false;
}while(top>0);
return true;
}
int main(int argc, char* argv[])
{
int c=0;
printf("************************\n");
printf("************************\n");
printf("------------------------\n");
printf("************************\n");
printf("** <文法描述> **\n");
printf("** 1:E->TE' **\n");
printf("** 2:E'->ATE'|ε **\n");
printf("** 3:T->FT' **\n");
printf("** 4:T'->MFT'|ε **\n");
printf("** 5:F->(E)|i **\n");
printf("** 6:A->+|- **\n");
printf("** 7:M->*|/ **\n");
printf("************************\n");
do{
printf("\n请选择:1-> LL(1)分析 2-> 退出\n");
scanf("%d",&c);
if(c==1){
if(LL1Parser())
printf("\n分析结果:输入串合法!\n");
else
printf("\n分析结果:输入串非法!\n");
}else if(c==2)
break;
else printf("\n请选择正确选项!\n");
}while(true);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -