📄 shiyan3.cpp
字号:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
char src[255];
char stack[255];
int codelength;
int stack_top;
int cur_pos;
char Act[5][8][5] = {
{"TG", "", "", "", "", "", "TG", ""},
{"FS", "", "", "", "", "", "FS", ""},
{"", "#", "", "", "+TG", "-TG", "", "#"},
{"", "#", "*FS", "/FS", "#", "#", "", "#"},
{"(E)", "", "", "", "", "", "i", ""}
};
int toN(char ch)
{
switch(ch)
{
case '(': return 0;
case ')': return 1;
case '*': return 2;
case '/': return 3;
case '+': return 4;
case '-': return 5;
case 'i': return 6;
case '$': return 7;
case 'E': return 10;
case 'T': return 11;
case 'G': return 12;
case 'S': return 13;
case 'F': return 14;
default: return -1;
}
}
void init()
{
codelength = strlen(src);
src[codelength] = '$';
src[++codelength] = '\0';
stack_top = 0;
stack[stack_top++] = '$';
stack[stack_top++] = 'E';
stack[stack_top] = '\0';
cur_pos = 0;
}
void error()
{
printf("error!\n");
}
int isTerminal(char ch)
{
if(ch == '(' || ch == ')' || ch == '*' || ch == '/' ||
ch == '+' || ch == '-' || ch == 'i' || ch == '$')
{
return 1;
}
return 0;
}
int entry(char ch1, char ch2)
{
if(strlen(Act[toN(ch1) % 10][toN(ch2)]) == 0) return 0;
return 1;
}
void stack_push(char ch1, char ch2)
{
int len, i, d1, d2;
d1 = toN(ch1) % 10;
d2 = toN(ch2);
len = strlen(Act[d1][d2]);
if(Act[d1][d2][0] == '#')
{
printf("%c-> ε\n", ch1);
stack[stack_top] = '\0';
return;
}
for(i = len - 1; i >= 0; i--)
{
stack[stack_top++] = Act[d1][d2][i];
}
stack[stack_top] = '\0';
printf("%c->%s\n", ch1, Act[d1][d2]);
}
void LL1_Analysis()
{
char ch1, ch2;
while(stack[stack_top - 1] != '$')
{
ch1 = stack[stack_top - 1];
ch2 = src[cur_pos];
if(ch2 == ' ' || ch2 == '\t') continue;
printf("%-20s%-20s ", stack, src + cur_pos);
if(isTerminal(ch1) && ch1 == ch2)
{
stack_top--;
stack[stack_top] = '\0';
printf("匹配\n");
cur_pos++;
}
else if(!isTerminal(ch1) && isTerminal(ch2) && entry(ch1, ch2))
{
stack_top--;
stack_push(ch1, ch2);
}
else
{
break;
}
}
if(stack[stack_top - 1] == '$' && src[cur_pos] == '$')
{
printf("%-20s%-20s ", stack, src + cur_pos);
printf("接受\n");
return;
}
else
{
error();
}
}
int main()
{
while(gets(src) != NULL)
{
if(strlen(src) == 0) continue;
init();
LL1_Analysis();
}
system("pause");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -