ImageVerifierCode 换一换
格式:DOCX , 页数:26 ,大小:19.38KB ,
资源ID:16570534      下载积分:1 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16570534.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(语法分析器源代码.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

语法分析器源代码.docx

1、语法分析器源代码#include#include#include#define HIGHER 1#define LOWER -1#define EQUAL 0#define TRUE 1#define FALSE 0 #define OPER_NUM 50 /默认算符数目#define VN_NUM 50 /默认非终结符数目#define MAX_BUFFER 128 /每行输入行最大长度#define MAX_GRA_NUM 20 /最大文法数目#define EMPTY -2 /算符优先表初始值,表示这对算符没有优先关系#define STACK_SIZE 64typedef struct

2、 char c; /非终极符符号 int firstvtOPER_NUM; /firstvt集,保存算符在oper_list中的下标 int fir_n,last_n; int lastvtOPER_NUM;vn_t; int prior_tableOPER_NUMOPER_NUM;char oper_listOPER_NUM;int oper_num = 0;vn_t vn_listVN_NUM;int vn_num = 0; char *grammarMAX_GRA_NUM2;int gra_num = 0;char start_vn;char stackSTACK_SIZE;int to

3、p = 0;void get_input(char *buf);int buf_deal(char* buf); void get_FIRVT_LASTVT(int vn_n); int create_table(); void init_table();int analyze(char *sentence);void display_table();void display_fir_lastvt();int get_oper(char c); /得到算符c的数组下标 没有返回-1 int get_vn(char c); /得到非终结符c的数组下标,没有返回-1 int is_vn(char

4、a) return (A=a&a=Z)?1:0);int get_oper(char c) int i; for(i = 0; i oper_num; +i) if(oper_listi = c) return i; return -1;int get_vn(char c) int i; for(i = 0; i vn_num; +i) if(vn_listi.c = c) return i; return -1; char reduce(int start, int end, int size) /规约 char *tar, *g, t1, t2, left; int i, j =0, gi

5、, ti, cn = 0; int same; tar = (char *)malloc(sizeof(char)*MAX_BUFFER); if(!tar) printf(Allocation fails.n); exit(-1); for(i = start; i = end; +i) /将此最左素短语的终结符存入tar字符串 if(!is_vn(stacki) tarj+ = stacki; tarj+ = 0; for(i = 0; i gra_num; +i) g = grammari1; gi = 0; ti = 0; same = FALSE; t1 = ggi; t2 = ta

6、rti; while (t1 != 0) if(t2 = 0 & !is_vn(t1) same = FALSE; break; if(!is_vn(t1) if(t1 != t2) same = FALSE; break; t2 = tar+ti; same = TRUE; t1= g+gi; if(same & t2 = 0) break; if(i = gra_num) printf(无法找到相应文法!n); return FALSE; left = grammari00; return vn_listget_vn(left).c;int analyze(char *sentence)

7、char r, c,new_vn; int i = 0, k = 0, j, pi, printi = 1, cou = 1; /i是sentence和stack的索引 int r_index, s_index, pre_index; printf(nn规约过程如下表所示:n); printf(-n); stacktop+ = #; printf(序号t符号栈t最左素短语t规约tn); do r = sentencei+; if(r_index = get_oper(r) = -1) printf(Error : 您输入的字符不在文法定义中!n); flushall();c = getchar

8、();flushall(); return FALSE; if(!is_vn(stackk) j = k; s_index = get_oper(stackj); else j = k - 1; s_index = get_oper(stackj); while(prior_tables_indexr_index = HIGHER) do pre_index = s_index; if(!is_vn(stackj-1) j-; s_index = get_oper(stackj); else j -= 2; s_index = get_oper(stackj); while(prior_tab

9、les_indexpre_index != LOWER); printf( %dt, cou+); for(pi = 0; pi top; +pi) printf(%c,stackpi); printf( t); for(pi = j + 1; pi ) return FALSE; pre = buf2; count = 0; while(now = buf+i) != 0) if(now != |) right_gcount = now; count+; if(is_vn(now) & is_vn(pre) return FALSE; if(is_vn(now) if(get_vn(now)

10、 = -1) vn_listvn_num.c = now; vn_listvn_num.fir_n = 0; vn_listvn_num.last_n = 0; vn_num+; else continue; else if(get_oper(now) = -1) oper_listoper_num = now; oper_num+; else continue; pre = now; else right_gcount = 0; grammargra_num0 = left_g; grammargra_num1 = right_g; gra_num+; break; if(bufi = 0)

11、 right_gcount = 0; grammargra_num0 = left_g; grammargra_num1 = right_g; gra_num+; else new_buf = (char *)malloc(sizeof(char)*MAX_BUFFER); new_buf0 = left_g0; new_buf1 = -; new_buf2 = ; strcpy(&new_buf3,&buf+i); return buf_deal(new_buf); return TRUE;int create_table() int gi = 0, ti, ni, fi, li, i; c

12、har *ng, t,next, next1; int t_index,n_index, n_index1, n_vn, t_vn; vn_t temp; for(gi = 0; gi gra_num; +gi ) ng = grammargi1; t = ng0; ti = 0; t_index = get_oper(t); next = ng1; ni = 1; n_index = get_oper(next); while(next != 0) if(t_index != -1 & n_index != -1) if (prior_tablet_indexn_index = EMPTY)

13、 prior_tablet_indexn_index = EQUAL; else printf(%c与%c有多种优先关系!n,oper_listt_index,oper_listn_index); return FALSE; else if(t_index != -1 & n_index = -1 & ngni+1 != 0) next1 = ngni+1; n_index1 = get_oper(next1); if(prior_tablet_indexn_index1 = EMPTY) prior_tablet_indexn_index1 = EQUAL; else printf(%c与%

14、c有多种优先关系!n,oper_listt_index,oper_listn_index1); return FALSE; prior_tablet_indexoper_num - 1 = -3; prior_tableoper_num - 1n_index1 = -3; if (t_index != -1 & n_index = -1) n_vn = get_vn(next); temp = vn_listn_vn; for(fi = 0; fi temp.fir_n; fi+) if(prior_tablet_indextemp.firstvtfi = EMPTY) prior_table

15、t_indextemp.firstvtfi = LOWER; else printf(%c与%c有多种优先关系!n,oper_listt_index,oper_listtemp.firstvtfi); return FALSE; else if(t_index = -1 & n_index != -1) n_vn = get_vn(t); temp = vn_listn_vn; for(fi = 0; fi temp.last_n; fi+) if(prior_tabletemp.lastvtfin_index = EMPTY) prior_tabletemp.lastvtfin_index

16、= HIGHER; else printf(%c与%c有多种优先关系!n,oper_listfi,oper_listn_index); return FALSE; t = ng+ti; next = ng+ni; t_index = get_oper(t); n_index = get_oper(next); for(i = 0; i oper_num - 1; +i) if(prior_tableoper_num - 1i != -3) prior_tableoper_num - 1i = LOWER; for(i = 0; i oper_num - 1; +i) if(prior_tabl

17、eioper_num - 1 != -3) prior_tableioper_num - 1 = HIGHER; prior_tableoper_num - 1oper_num - 1 = EQUAL; return TRUE;void display_fir_lastvt() int i, j; for (i = 0; i vn_num; +i) printf(FIRSTVT(%c) = , vn_listi.c); for(j = 0; j vn_listi.fir_n; +j) if (j = vn_listi.fir_n - 1) printf( %c ,oper_listvn_lis

18、ti.firstvtj); else printf( %c ,oper_listvn_listi.firstvtj); printf(n); printf(LASTVT(%c) = , vn_listi.c); for(j = 0; j vn_listi.last_n; +j) if (j = vn_listi.last_n - 1) printf( %c ,oper_listvn_listi.lastvtj); else printf( %c ,oper_listvn_listi.lastvtj); printf(nn); void display_table() int i,j; prin

19、tf(nt算 符); for(i = 0; i oper_num; +i) printf(t%c,oper_listi); printf(n); for(i = 0; i oper_num; +i) printf(t%c,oper_listi); for(j = 0; j ); else if(prior_tableij = -1) printf(t); else if(prior_tableij = 0) printf(t=); else printf(tNO); printf(n); void firstvt(int vn) int i, j, t, c_index, v_i, orin,

20、 pre = -1; char *ng, c; for(i = 0; i gra_num; +i) if (grammari00 = vn_listvn.c) ng = grammari1; c = ng0; if(c_index = get_oper(c) != -1) vn_listvn.firstvtvn_listvn.fir_n+ = c_index; continue; else v_i = get_vn(c); if(v_i != vn & v_i != pre) if(vn_listv_i.fir_n = 0 ) firstvt(v_i); orin = vn_listvn.fir_n; vn_listvn.fir_n += vn_listv_i.fir_n; t = 0; for(j = orin; j vn_listvn.fir_n; +j ) vn_listvn.firstvtj = vn_listv_i.firstvtt+; pre = v_i; if(ng1 != 0) vn_listvn.firstvtvn_listvn.fir_n+ = get_oper(ng1); void lastvt(int vn) int i, j, t, c_index, v_i, orin, ni = 0, pre = -1; c

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2