📄 syntax.c
字号:
// 终结符列表
// if,while,else,char,int,float,return,void,(共 8 个关键字)
// +,-,*,/,%,=,>,<,!,AND,OR,BIG_EQUAL,SMA_EQUAL,UNEQUAL,EQUIV,SELF_ADD,SELF_SUB,(共 17 种运算)
// ID,NUMBER,REAL,STRING,SINGLE_CHAR (共5个声明类型)
//非终结符列表
//特殊符号列表
// DONE ; , { } [ ] ( ) PARSE_ERROR SYNCH
//结束符 $ , 空字符为 #
/*
文法列表:
*/
#define T_SIZE 40
#define N_SIZE 40
#define E_SIZE 5
#define MAX_R_SIZE 10
#define INFER_SIZE 100
//使用一个整形数组来存取这些符号列表
int N_T[T_SIZE+N_SIZE];
//使用一个结构体数组存储产生式列表
struct node
{
int curr;
int s[10];
} First[N_SIZE];
int First[N_SIZE][10];
int Follow[N_SIZE][10];
struct list_node
{
int header; //存取左端的非终结符在N_T数组中的值
int r_size; //右端产生式的个数
struct r_node *first; //第一个产生式的地址
} infer[INFER_SIZE];
//用链表存取右部产生式
struct r_node
{
int len ; //产生式长度
int s[MAX_R_SIZE]; //存放各节点的在N_T数组中的索引值
struct r_node *next;
};
//存取项目
struct item
{
int header; //产生式左部索引
struct node *next; //产生式右部
int position; //项目 .的位置
};
//存取项目集簇
struct item_cluster
{
struct item set;
struct item *next;
} state[MAX_STATE];
//E'-->A null-->#, T'-->B
void init_syntax()
{
int i;
infer[0].header=N_T[0]='E';
infer[2].header=N_T[1]='A';
infer[3].header=N_T[2]='T';
infer[4].header=N_T[3]='B';
infer[5].header=N_T[4]='F';
for(i=5;i<N_SIZE;i++)
{
N_T[i]=0;
}
N_T[i++]=ID;
N_T[i++]='+';
N_T[i++]='*';
N_T[i++]='(';
N_T[i++]=')';
N_T[i++]='#';
N_T[i++]='$';
for(;i<N_SIZE;i++)
N_T[i]=0;
infer[0].r_size=1;
infer[1].r_size=2;
infer[2].r_size=1;
infer[3].r_size=2;
infer[4].r_size=2;
infer[0].first=(struct r_node *)malloc(sizeof(struct r_node));
infer[0].first->len=2;
infer[0].first->s[0]=ntoindex('T');
infer[0].first->s[1]=ntoindex('A');
infer[0].first->s[2]=ntoindex('$');
infer[0].first->next=NULL;
infer[1].first=(struct r_node *)malloc(sizeof(struct r_node));
infer[1].first->len=3;
infer[1].first->s[0]=ntoindex('+');
infer[1].first->s[1]=ntoindex('T');
infer[1].first->s[2]=ntoindex('A');
infer[1].first->s[3]=ntoindex('$');
infer[1].first->next=(struct r_node *)malloc(sizeof(struct r_node));
infer[1].first->next->len=1;
infer[1].first->next->s[0]=ntoindex('#');
infer[1].first->next->s[1]=ntoindex('$');
infer[1].first->next->next=NULL;
infer[2].first=(struct r_node *)malloc(sizeof(struct r_node));
infer[2].first->len=2;
infer[2].first->s[0]=ntoindex('F');
infer[2].first->s[1]=ntoindex('B');
infer[2].first->s[2]=ntoindex('$');
infer[2].first->next=NULL;
infer[3].first=(struct r_node *)malloc(sizeof(struct r_node));
infer[3].first->len=3;
infer[3].first->s[0]=ntoindex('*');
infer[3].first->s[1]=ntoindex('F');
infer[3].first->s[2]=ntoindex('B');
infer[3].first->s[3]=ntoindex('$');
infer[3].first->next=(struct r_node *)malloc(sizeof(struct r_node));
infer[3].first->next->len=1;
infer[3].first->next->s[0]=ntoindex('#');
infer[3].first->next->s[1]=ntoindex('$');
infer[3].first->next->next=NULL;
infer[4].first=(struct r_node *)malloc(sizeof(struct r_node));
infer[4].first->len=3;
infer[4].first->s[0]=ntoindex('(');
infer[4].first->s[1]=ntoindex('E');
infer[4].first->s[2]=ntoindex(')');
infer[4].first->s[2]=ntoindex('$');
infer[4].first->next=(struct r_node *)malloc(sizeof(struct r_node));
infer[4].first->next->len=1;
infer[4].first->next->s[0]=ntoindex(ID);
infer[4].first->next->s[1]=ntoindex('$');
infer[4].first->next->next=NULL;
}
void set_goto()
{
}
void action()
{
}
void closure()
{
}
void get_cluster()
{
}
int ntoindex(int n)
{
int i=1;
while(N_T[i]!=n)
i++;
return i;
}
void first(int head)
{
int i;
int len;
int j;
struct r_node *r;
if(head>N_SIZE)
return;
i=infer[head]->r_size;
len=infer[head]->first->len;
r=infer[head]->first;
while(r->s[0]<N_SIZE)
{
}
}
void follow(int head)
{
}
int main()
{
init_syntax();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -