编译原理课程设计-算术表达式的语法分析及语义分析程序设计(共13页).doc

上传人:飞****2 文档编号:14563423 上传时间:2022-05-05 格式:DOC 页数:13 大小:118.50KB
返回 下载 相关 举报
编译原理课程设计-算术表达式的语法分析及语义分析程序设计(共13页).doc_第1页
第1页 / 共13页
编译原理课程设计-算术表达式的语法分析及语义分析程序设计(共13页).doc_第2页
第2页 / 共13页
点击查看更多>>
资源描述

《编译原理课程设计-算术表达式的语法分析及语义分析程序设计(共13页).doc》由会员分享,可在线阅读,更多相关《编译原理课程设计-算术表达式的语法分析及语义分析程序设计(共13页).doc(13页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精选优质文档-倾情为你奉上设计题一:算术表达式的语法分析及语义分析程序设计。1.目的通过设计、编制、调试一个算术表达式的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。2.设计内容及要求:算术表达式的文法:无符号整数数字数字标志符字母字母数字表达式项加法运算符项项因子乘法运算符因子因子标志符无符号整数(表达式)加法运算符乘法运算符选择算符优先分析方法完成以上任务,生成逆波兰式的中间代码;(1) 写出算术表达式的符合分析方法要求的文法,给出分析方法的思想,完成分析程序设计。(2) 编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。源

2、代码#define _CRT_SECURE_NO_WARNINGS#include stdio.h#include stdlib.h#include using namespace std;char data2020; /算符优先关系char s100; /模拟符号栈s char lable20; /文法终极符集char input100; /文法输入符号串char str2010; /用于输入串的分析int k,j;char a,q;int r; /文法规则个数int r1;int m, n, N; /转化后文法规则个数char st1030; /用来存储文法规则char first1010

3、; /文法非终结符FIRSTVT集char last1010; /文法非终结符LASTVT集int fflag10 = 0 ; /标志第i个非终结符的FIRSTVT集是否已求出int lflag10 = 0 ; /标志第i个非终结符的LASTVT集是否已求出int deal(); /对输入串的分析int terminal_symbol(char c); /判断字符c是否是终极符int location(char c); /求字符c在算符优先关系表中的下标void out(int j, int k, char *s); /打印s栈void firstvt(char c); /求非终结符c的FIR

4、STVT集void lastvt(char c); /求非终结符c的LASTVT集void table(); /创建文法优先关系表char output10;/存储逆波兰式void main()int i, j, k = 0;printf(请输入文法规则数:);scanf(%d, &r);printf(请输入文法规则:n);for (i = 0; ir; i+)scanf(%s, sti); /存储文法规则,初始化FIRSTVT集和LASTVT集*/ firsti0 = 0; /*firsti0和lasti0分别表示sti0非终极符的FIRSTVT集和LASTVT集中元素的个数*/lasti0

5、 = 0;for (i = 0; ir; i+) /判断文法是否合法for (j = 0; stij != 0; j+)if (sti0Z)printf(文法error!n);exit(-1);if (stij = A&stij = A&stij + 1 = Z)printf(文法error!n);exit(-1);for (i = 0; ir; i+)/for (j = 0; stij != 0; j+)if (stijZ) & stij != -&stij != &stij != |)lablek+ = stij;lablek = #;lablek + 1 = 0;table();/pri

6、ntf(FIRST集为:n); /输出每个非终结符的FIRST集for (i = 0; ir; i+)printf(%c: , sti0);for (j = 0; jfirsti0; j+)printf(%c , firstij + 1);printf(n);printf(LAST集为:n); /输出每个非终结符的LAST集for (i = 0; ir; i+)printf(%c: , sti0);for (j = 0; jlasti0; j+)printf(%c , lastij + 1);printf(n);printf(算符优先分析表如下:n);for (i = 0; lablei !=

7、 0; i+)printf(t%c, lablei);printf(n);for (i = 0; ik + 1; i+)printf(%ct, lablei);for (j = 0; jk + 1; j+)printf(%ct, dataij);printf(n);printf(请输入文法输入符号串以#结束:);scanf(%s, input);deal();cout 逆波兰式为:;for (i = 0; lablei != 0; i+)cout outputi 0;/cout endl;void table()char text2010;/存储改写后的文法int i, j, k, t, l,

8、 x = 0, y = 0;int m, n;x = 0;for (i = 0; ir; i+)firstvt(sti0);lastvt(sti0);for (i = 0; i;elsetextxy = stij;y+;textxy = 0;x+;y = 0;r1 = x;/printf(转化后的文法为:n);for (i = 0; ix; i+) /输出转化后的文法规则串printf(%sn, texti);for (i = 0; i后的转化文法,用于最后的规约)*/stri0 = texti0;for (j = 3, l = 1; textij != 0; j+, l+)stril = t

9、extij;stril = 0;for (i = 0; ix; i+)for (j = 1; textij + 1 != 0; j+)if (terminal_symbol(textij) & terminal_symbol(textij + 1)m = location(textij);n = location(textij + 1);datamn = =;if (textij + 2 != 0&terminal_symbol(textij) & terminal_symbol(textij + 2) & !terminal_symbol(textij + 1)m = location(te

10、xtij);n = location(textij + 2);datamn = =;if (terminal_symbol(textij) & !terminal_symbol(textij + 1)/终结符和非终结符相接,用后于关系填表for (k = 0; kr; k+)if (stk0 = textij + 1)break;m = location(textij);for (t = 0; tfirstk0; t+)n = location(firstkt + 1);datamn = ;if (!terminal_symbol(textij) & terminal_symbol(texti

11、j + 1)/非终结符和终结符相接,用先于关系填表for (k = 0; kr; k+)if (stk0 = textij)break;n = location(textij + 1);for (t = 0; t;m = location(#);/#后于所有的终结符规约for (t = 0; tfirst00; t+)n = location(first0t + 1);datamn = ;n = location(#);/for (t = 0; t;datann = =;void firstvt(char c) /求FIRSTVT集int i, j, k, m, n;for (i = 0; i

12、r; i+)/找出是第i个非终结符if (sti0 = c)break;if (fflagi = 0)n = firsti0 + 1;m = 0;doif (m = 2 | stim = |)if (terminal_symbol(stim + 1)firstin = stim + 1;n+;elseif (terminal_symbol(stim + 2)firstin = stim + 2;n+;if (stim + 1 != c)firstvt(stim + 1);for (j = 0; jr; j+)if (stj0 = stim + 1)break;for (k = 0; kfirs

13、tj0; k+)int t;for (t = 0; tn; t+)if (firstit = firstjk + 1)break;if (t = n)firstin = firstjk + 1;n+;m+; while (stim != 0);firstin = 0;firsti0 = -n;fflagi = 1;void lastvt(char c) /求LASTVT集int i, j, k, m, n;for (i = 0; ir; i+)if (sti0 = c)break;if (lflagi = 0)n = lasti0 + 1;m = 0;doif (stim + 1 = 0 |

14、stim + 1 = |)if (terminal_symbol(stim)lastin = stim;n+;elseif (terminal_symbol(stim - 1)lastin = stim - 1;n+;if (stim != c)lastvt(stim);for (j = 0; jr; j+)if (stj0 = stim)break;for (k = 0; klastj0; k+)int t;for (t = 0; t)if (lablex != )outputsize+ = lablex;/将要规约的终结符存起来out(1, k, s);printf(%c, a);out(

15、i + 1, z, input);printf(规约n);doq = sj;if (terminal_symbol(sj - 1)j = j - 1;else j = j - 2;x = location(sj);y = location(q); while (dataxy != );int m, n, N;for (m = j + 1; m = k; m+)for (N = 0; Nr1; N+)for (n = 1; strNn != 0; n+)if (!terminal_symbol(sm) & !terminal_symbol(strNn)if (terminal_symbol(sm

16、 + 1) & terminal_symbol(strNn + 1) & sm + 1 = strNn + 1)sj + 1 = strN0;break;elseif (terminal_symbol(sm)if (sm = strNn)sj + 1 = strN0;break;k = j + 1;if (k = 2 & a = #)out(1, k, s);printf(%c, a);out(i + 1, z, input);printf(结束n);printf(规约成功!n);return 1; /输入串符合文法的定义elseif (dataxy = | dataxy = =) /移进ou

17、t(1, k, s);printf(%c, a);out(i + 1, z, input);printf(移进n);k+;sk = a;i+;elseprintf(n规约失败n);return 0;printf(n规约失败n);/return 0;void out(int j, int k, char *s)int n = 0;int i;for (i = j; i = k; i+)printf(%c, si);n+;for (; n15; n+)printf( );int location(char c) /求字符c在算符优先关系表中的下标int i;for (i = 0; lablei != 0; i+)if (c = lablei)return i;return -1;int terminal_symbol(char c) /判断字符c是否是终极符int i;for (i = 0; lablei != 0; i+)if (c = lablei)return 1;return 0;专心-专注-专业

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com