📄 ll1.cpp
字号:
#include <stdio.h>
#include <string.h>
#define N 50
#define MAX 100
#define SEM 1 /*语义*/
#define SYN 0 /*算符*/
struct LL{
int num ;
char name[4] ;
};
/*P表示将字符压栈*/
/*Q表示字符*/
/*H表示E'*/
/*X表示GRE(+)*/
/*Y表示GRE(-)*/
/*0表示空*/
/*I表示T'*/
/*W表示GRE(*)*/
/*U表示GRE(/)*/
char str[MAX] ;
char synstack[MAX] ; /*算符栈数组*/
int ksyn = 0 ; /*算符栈顶指针*/
char semstack[MAX] ; /*语义栈数组*/
int ksem = 0 ; /*语义栈顶指针*/
char qt[N][10] ; /*四元式字符串*/
int kqt ; /*四元式字符串当前个数*/
LL ll[N] ; /*文法数组*/
/* i , + , - , * , / , ( , ) , # , */
int analysit[5][8] = {
1 , 0 , 0 , 0 , 0 , 1 , 0 , 0 ,
0 , 2 , 3 , 0 , 0 , 0 , 4 , 4 ,
5 , 0 , 0 , 0 , 0 , 5 , 0 , 0 ,
0 , 8 , 8 , 6 , 7 , 0 , 8 , 8 ,
9 , 0 , 0 , 0 , 0 , 10 , 0 , 0
}; /*分析表*/
int isVt(char w) ;
int isVn(char w) ;
void initll() ;
int L(char, char) ;
int char_int(char) ;
int analysis() ;
int push(char stack[] , char w , int flag) ;
char pop (char stack[] , int flag) ;
void initll()
{
int i = 0 , j=0 ;
FILE * in ;
in = fopen("test1.txt" , "r") ;
if(in == NULL)
{
printf("test1.txt不存在\n") ;
return ;
}
for(i = 0 ; i<10 ; i++)
{
for(j=0 ; j<4 ; j++)
fscanf(in , "%s" , &ll[i].name[j]) ;
fscanf(in , "%d" , &ll[i].num) ;
}
return ;
}
int char_int(char w)
{
char x = 0 ;
if(w>='a'&&w<='z'||(w>='0'&&w<='9'))
x = 0 ;
switch(w)
{
case 'E':
x = 0 ;
break ;
case 'H':
x = 1 ;
break ;
case 'T':
x = 2 ;
break ;
case 'I':
x = 3 ;
break ;
case 'F':
x = 4 ;
break ;
case '#':
x = 7 ;
break ;
case '*':
x = 3 ;
break ;
case '/':
x = 4 ;
break ;
case '+':
x = 1 ;
break ;
case '-':
x = 2 ;
break ;
case '(':
x=5 ;
break ;
case ')':
x = 6 ;
break ;
}
return x ;
}
int L(char x , char w)
{
if(analysit[char_int(x)][char_int(w)] >0)
return analysit[char_int(x)][char_int(w)] ;
return 0 ;
}
int isVn(char w)
{
if(w>='A'&&w<='Z')
return 1 ;
return 0 ;
}
int isVt(char w)
{
if(w>='a'&&w<='z'||(w>='0'&&w<='9')||w == '+'||
w=='-'||w=='*'||w=='/'||w=='('||w==')')
return 1 ;
return 0 ;
}
char pop(char stack[] , int flag)
{
char w ;
if(flag == SEM)
{
if(ksem == 0)
{
printf("栈空\n") ;
return -1 ;
}
w = stack[ksem-1] ;
ksem -- ;
return w ;
}
if(flag == SYN)
{
if(ksyn == 0)
{
printf("栈空\n") ;
return -1 ;
}
w = stack[ksyn-1] ;
ksyn-- ;
return w ;
}
}
int push(char stack[] , char w , int flag)
{
if(ksyn==N-1||ksem == N-1)
{
printf("栈溢出\n") ;
return 1 ;
}
else
{
if(SYN == flag)
{
stack[ksyn] = w ;
ksyn++ ;
}
if(SEM == flag)
{
stack[ksem] = w ;
ksem ++ ;
}
}
return 0 ;
}
void record(char x)
{
char asem=0 , bsem= 0 , syn= 0 ;
asem = pop(semstack , SEM) ;
bsem = pop(semstack , SEM) ;
// syn = pop(synstack , SYN) ;
if(asem == -1||bsem== -1)
{
printf("记录四元式错误\n") ;
return ;
}
else
{
int i = 0 ;
qt[kqt][i++] = '(' ;
if(x=='X')
qt[kqt][i++] = '+' ;
else if(x=='Y')
qt[kqt][i++] = '-' ;
else if(x=='W')
qt[kqt][i++] = '*' ;
else
qt[kqt][i++] = '/' ;
qt[kqt][i++] = ',' ;
qt[kqt][i++] = bsem ;
qt[kqt][i++] = ',' ;
qt[kqt][i++] = asem ;
qt[kqt][i++] = ',' ;
qt[kqt][i++] = 't' ;
qt[kqt][i++] = ')' ;
push(semstack , 't' , SEM) ;
kqt++ ;
if(kqt==N)
{
printf("四元式数组满\n") ;
return ;
}
}
return ;
}
void output()
{
int i = 0;
for(i =0 ; i<kqt ; i++)
printf("%s\n" , qt[i]) ;
}
int analysis()
{
int i = 0 ;
char w = 0 , x = 0 ;
push(synstack , '#' , SYN) ;
push(synstack , 'E' , SYN) ;
while(i<strlen(str))
{
t1: w = str[i++] ;
t2: x = pop(synstack , SYN) ;
if(isVt(x))
{
if(x==w)
{
goto t1 ;
}
else
{
printf("\nError\n") ;
return 1 ;
}
}
else
{
if(isVn(x))
{
if(x == 'X'||x=='Y'||x=='W'||x=='U')
{
record(x) ;
goto t2 ;
}
if(x == 'P')
goto t2 ;
int t = 0 ;
t = L(x , w) ;
if(0==t)
return 1 ;
else
{
int i = 0 ;
for(i = ll[t-1].num-1 ; i>=0 ; i--)
{
if(ll[t-1].name[i] == 'Q')
push(synstack , w , SYN) ;
else if(ll[t-1].name[i] == 'P')
{
push(synstack , 'P' , SYN) ;
push(semstack , w , SEM) ;
}
else
push(synstack , ll[t-1].name[i] , SYN) ;
}
goto t2 ;
}
}
else
{
if(x=='#')
return 0 ;
else
{
printf("\nError\n") ;
return 1 ;
}
}
}
}
}
int main()
{
fgets(str , MAX , stdin) ;
initll() ;
analysis() ;
output() ;
return 0 ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -