📄 analysis.h
字号:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
#define M 7 //非终结符号数
#define N 8 //终结符号数
char buff[SIZE]; //输入串
char currChar; //当前分析的字符
int step = 0; //当前分析的步骤数
char* M_LL1[M][N] = {" "}; //LL(1)分析表,D代表E',G代表T'
int index = 0; //指示当前分析的字符
char stack[SIZE]; //字符栈
int top = 0; //栈顶标志
void pop();
//初始化栈
void InitStack()
{
while(top >0)
pop();
}
//入栈
void push(char ch)
{
if(top >= 0 && top != SIZE){
stack[top] = ch;
top++;
}
}
//出栈
void pop()
{
if(top > 0){
stack[top] = '\0';
top--;
}
}
//转换非终结符号为相应的下标
int transFeiZhongjie(char ch)
{
switch(ch){
case 'E':
return 0;
break;
case 'D':
return 1;
break;
case 'T':
return 2;
break;
case 'G':
return 3;
break;
case 'F':
return 4;
break;
case 'A':
return 5;
break;
case 'M':
return 6;
break;
default:
return -1;
}
}
//转换终结符号为相应的下标
int transZhongjie(char ch)
{
switch(ch){
case 'i':
return 0;
break;
case '+':
return 1;
break;
case '-':
return 2;
break;
case '*':
return 3;
break;
case '/':
return 4;
break;
case '(':
return 5;
break;
case ')':
return 6;
break;
case '#':
return 7;
break;
default:
return -1;
}
}
//判断是否为终结符号
bool is_terminate(char ch)
{
if(ch == 'i' || ch == '+' || ch == '-' || ch == '*' || ch == '('
|| ch == ')' || ch == '/' || ch == '#')
return true;
return false;
}
//判断是否为非终结符号
bool is_non_Terminate(char ch)
{
if(ch == 'E' || ch == 'D' || ch == 'T' || ch == 'G' ||
ch == 'F' || ch == 'A' || ch == 'M')
return true;
return false;
}
//初始化LL(1)分析表
void InitLL1Table()
{
M_LL1[0][0] = "TD"; //D代表E'
M_LL1[0][5] = "TD";
M_LL1[1][1] = "ATD";
M_LL1[1][2] = "ATD";
M_LL1[1][6] = "e"; //e代表单ε
M_LL1[1][7] = "e";
M_LL1[2][0] = "FG"; //G代表T'
M_LL1[2][5] = "FG";
M_LL1[3][1] = "e";
M_LL1[3][2] = "e";
M_LL1[3][3] = "MFG";
M_LL1[3][4] = "MFG";
M_LL1[3][6] = "e";
M_LL1[3][7] = "e";
M_LL1[4][0] = "i";
M_LL1[4][5] = "(E)";
M_LL1[5][1] = "+";
M_LL1[5][2] = "-";
M_LL1[6][3] = "*";
M_LL1[6][4] = "/";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -