📄 ll1.h
字号:
/*修改后的文法规则
1 START->function id {L}
2 L->SA
3 A->;SA|EPS
4 S->{L}
5 S->while B do S
6 S->if B then S else S
7 S->id=E;
8 S->int D;
9 D->idF
10 F->,idF|EPS
11 B->(B)H|!BH|true H|false H|id relop E H
12 H->GH|EPS
13 G->&B||B
14 relop-><I|>I|==
15 I->=
16 E->JK
17 K->+JK|EPS
18 J->MN
19 N->*MN|EPS
20 M->(E)|num
*/
#include <stdio.h>
#define TER_START 16 /*非终结符的起始码*/
#define VAR_NUM 16 /*非终结符的个数( ε)*/
#define TER_NUM 25 /*终结符的个数*/
#define SUM_NUM VAR_NUM+TER_NUM /*终结符与非终结符的总个数*/
#define EXP_NUM 33 /*表达式的个数*/
#define EXP_LONGTH 8 /*exp_LONGTH=表达式的最大长度+1*/
#define EXP_END -1 /*表达式的结尾*/
#define ERROR -1 /*分析错误表示*/
#define FIRST_END -1 /*first集的结尾标示*/
#define FOLLOW_END -1 /*follow集的结尾标示*/
#define EPS_OUT false /*不包含EPS*/
#define EPS_IN true /*包含EPS*/
/*文法符号(包括 结尾符号)*/
enum{
START=0,L,A,S,D,F,B,H,G,relop,I,E,K,J,N,M,
FUNC,WHILE,DO,IF,THEN,ELSE,INT,TRUE,FALSE,
ID,NUM,
L_BIG_BRACKET, //{
R_BIG_BRACKET, //}
EQU, //=
L_MINI_BRACKET, //(
R_MINI_BRACKET, //)
NOT, //!,
OR, //|
AND, //&
BIGGER, //>
SMALLER, //<
ADD, //+
MUL, //*
SEMICOLON, //;
DOT, //,
EPS, //ε
END, //end
};
/*保存文法表达式*/
int express[EXP_NUM][EXP_LONGTH]={
{START,FUNC,ID,L_BIG_BRACKET,L,R_BIG_BRACKET,EXP_END},//START->FUNCTION ID{L}
{L,S,A,EXP_END},//L->SA
{A,SEMICOLON,S,A,EXP_END},//A->;SA
{A,EPS,EXP_END},//EPS
{S,L_BIG_BRACKET,L,R_BIG_BRACKET,EXP_END},//S->{L}
{S,WHILE,B,DO,S,EXP_END},//S->while B do S
{S,IF,B,THEN,S,ELSE,S,EXP_END},// S->if B then S else S
{S,ID,EQU,E,EXP_END},//S->id=E;
{S,INT,D,EXP_END},//S->int D;
{D,ID,F,EXP_END},//9 D->idF
{F,DOT,ID,F,EXP_END},//,10 F->,idF
{F,EPS,EXP_END},//EPS
{B,L_MINI_BRACKET,B,R_MINI_BRACKET,EXP_END},//B->(B)H|!BH|true H|false H|id relop E H
{B,NOT,B,H,EXP_END},
{B,TRUE,H,EXP_END},
{B,FALSE,H,EXP_END},
{B,ID,relop,E,H,EXP_END},
{H,G,H,EXP_END},
{H,EPS,EXP_END},//H->GH|EPS
{G,AND,B,EXP_END},
{G,OR,B,EXP_END},//G->&B||B
{relop,BIGGER,I,EXP_END},//relop-><I|>I|==
{relop,SMALLER,I,EXP_END},
{relop,EQU,EQU,EXP_END},
{I,EQU,EXP_END},//15 I->=
{E,J,K,EXP_END,EXP_END},//16 E->JK
{K,ADD,J,K,EXP_END,EXP_END},//17 K->+JK|EPS
{K,EPS,EXP_END},
{J,M,N,EXP_END},//18 J->MN
{N,MUL,M,N,EXP_END},//19 N->*MN|EPS
{N,EPS,EXP_END},
{M,L_MINI_BRACKET,E,R_MINI_BRACKET,EXP_END},//20 M->(E)|num
{M,NUM,EXP_END},
};
//first集(EPS)
typedef struct node {
int TerValue ;
node *next;
}Set;
//所有文法符号的first集(包括EPS)
Set FirstSet[SUM_NUM+1];
//表达式的 first集(EPS)
Set ExpFirstSet[EXP_NUM];
//非终结符的follow集(END)
Set FollowSet[VAR_NUM];
//预测分析表(EPS+END)
int PreTable [VAR_NUM][TER_NUM+1+1];
//作为输入串的缓冲区
int Buffer[EXP_LONGTH];
//求解符号串的first集时使用的临时缓冲区
Set Temp;
/*tokes文件*/
FILE*tokens=fopen("tokens.txt","r");
/*输出文件*/
FILE*output=fopen("output.txt","w");
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -