欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    算符优先语法分析设计原理与实现技术-实验报告-及源代码-北京交通大学(共14页).doc

    • 资源ID:14122023       资源大小:356.50KB        全文页数:14页
    • 资源格式: DOC        下载积分:20金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要20金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    算符优先语法分析设计原理与实现技术-实验报告-及源代码-北京交通大学(共14页).doc

    精选优质文档-倾情为你奉上算符优先语法分析设计原理与实现技术XXX 1028XXX 计科1XXX班功能描述能够有效识别以下算符优先文法E E+T | E-TT T*F | T/F | FF (E) | i所描述算术表达式主要数据结构描述数据结构功能描述string 存储该算符优先文法,对栈顶元素进行规约时要用到map<char, int>符号表中的元素映射成整数map<int, int>将用整数表示的符号映射到响应的行或列map<int, char>将整数映射成相应的字母表中的符号int 分析栈程序结构描述n 设计方法1. 由文法构造算符优先矩阵+-*/()i#+>><<<><>->><<<><>*>>>><><>/>>>><><>(<<<<<=<)>>>>>>i>>>>>>#<<<<<<=2. 根据算符优先矩阵算数表达式的词法分析结果进行语法分析,分析算法为:数据结构:符号栈S - 存放所有读进的符号(计数i)K - 符号栈使用深度a - 工作单元R, Q - 变量分析算法:先找最左素短语的尾部(>) 再找最左素短语的头部(<)以分析表达式i+i*i为例,详细过程如下:n 函数定义函数原型功能描述void init()各种初始化操作,主要是建立符号与整数、整数与行列号、整数与符号之间的映射,也包括各全局变量的初始化void isVt(int )判断某整数所代表的符号是否是终结符号或#void comp(int a, int b)比较两整数所代表的字符的优先关系void advance()从输入文件中读入一个词bool parser()算符优先分析函数,根据算符优先矩阵进行语法分析int main(int argc, char *argv)主函数,参数argv1代表输入文件n 函数调用关系maininitisVtadvanceparsercompn 程序执行图程序测试测试用例一:(a+b*c)+d+e+a*c/b首先调用实验一的词法分析程序,得到如下分析结果:(19, '(')(12, 'a')(14, '+')(12, 'b')(16, '*')(12, 'c')(20, ')')(14, '+')(12, 'd')(14, '+')(12, 'e')(14, '+')(12, 'a')(16, '*')(12, 'c')(17, '/')(12, 'b')在以此分析结果作为本程序实验结果的输入,得到如下分析结果:该结果显示了详细的分析过程,且表明该表达式是一个符合该文法的表达式测试用例二:(a+b*c)+d*-a*c+(a+b同样调用实验一的词法分析程序,得到如下结果:(19, '(')(12, 'a')(14, '+')(12, 'b')(16, '*')(12, 'c')(20, ')')(14, '+')(12, 'd')(16, '*')(15, '-')(12, 'a')(16, '*')(12, 'c')(14, '+')(19, '(')(12, 'a')(14, '+')(12, 'b')以此分析结果作为本实验程序的输入,得到如下语法分析结果:实验结果表明,在分析过程中出现了错误,分析过程未完成,该样例是一个非法的表达式学习总结Ø 按算符优先关系所确定的应被规约的子串恰好是当前举行的最左素短语Ø 尽管算符优先分析也属于自底向上语法分析的范畴,但却不是严格的从左至右的规范分析,每步所得的句型自然也不是一个规范句型Ø 采用上述策略进行算符优先分析时,尽管我们也指出了每一最左素短语应规约到的非终结符号,然而每次在查找最左素短语时,起主导作用的是终结符号间的优先关系,两终结符号之间究竟是哪个非终结符号无关宏旨/ operator_prior.cpp : Defines the entry point for the console application./#include "stdafx.h"#include <stdio.h>#include <ctype.h>#include <map>#include <vector>#include <string>#define ID 12#define ADD 14#define SUB 15#define MUL 16#define DIV 17#define LP 19#define RP 20#define EOI 31#define SHARP 32#define EQ 0#define BT 1#define LT 2#define UD 3#define N_Base 1000using namespace std;FILE *fp;int lookahead, yylineno;bool success;map<int, int> intToint;map<char, int> charToint;map<int, char> intTochar;string grammer8 = "E+T", "E-T", "T", "T*F", "T/F", "F", "(E)", "i"int prior_matrix99 = BT, BT, LT, LT, LT, BT, LT, BT, BT, BT, LT, LT, LT, BT, LT, BT, BT, BT, BT, BT, LT, BT, LT, BT, BT, BT, BT, BT, LT, BT, LT, BT, LT, LT, LT, LT, LT, EQ, LT, UD, BT, BT, BT, BT, UD, BT, UD, BT, BT, BT, BT, BT, UD, BT, UD, BT, LT, LT, LT, LT, LT, UD, LT, EQ;void init() success = true; yylineno = 0; intTointADD = 0; intTointSUB = 1; intTointMUL = 2; intTointDIV = 3; intTointLP = 4; intTointRP = 5; intTointID = 6; intTointSHARP = 7; charToint'+' = ADD; charToint'-' = SUB; charToint'*' = MUL; charToint'/' = DIV; charToint'(' = LP; charToint')' = RP; charToint'i' = ID; intTocharADD = '+' intTocharSUB = '-' intTocharMUL = '*' intTocharDIV = '/' intTocharLP = '(' intTocharRP = ')' intTocharID = 'i' intTocharSHARP = '#' intTocharN_Base = 'N'bool isVt(int a) if (a >= N_Base) return false; else return true;int comp(int a, int b) int x = intTointa; int y = intTointb; return prior_matrixxy;void advance() if (fscanf(fp, "(%d", &lookahead) = EOF) lookahead = SHARP; else char ch; do ch = fgetc(fp); if (ch = 'n' | ch = EOF) break; while (true); yylineno+;void parser() int stack100, top = 0; int i, j, k, ii, jj; stacktop+ = SHARP; advance(); do for (i = 0; i < top; i+) printf("%c", intTocharstacki); printf("t%cn", intTocharlookahead); for (i = top - 1; i >= 0; i-) if (isVt(stacki) break; int res = comp(stacki, lookahead); if (res = LT | res = EQ) stacktop+ = lookahead; advance(); else if (res = BT) int temp = stacki; for (j = i - 1; j >= 0; j-) if (isVt(stackj) if (comp(stackj, temp) = LT) break; else temp = stackj; for (k = 0; k < 8; k+) if (int)grammerk.length() = top - 1 - j) ii = j + 1; jj = 0; do if (grammerk.at(jj) >= 'A' && grammerk.at(jj) <= 'Z') if (isVt(stackii) break; else if (charTointgrammerk.at(jj) != stackii) break; ii+; jj+; while (ii < top && jj < (int)grammerk.length(); if (ii >= top) break; if (k >= 8) success = false; return ; top = j + 1; stacktop+ = N_Base; else success = false; return ; if (stack0 = SHARP && stack1 = N_Base && stack2 = SHARP) printf("#N#n"); break; while (true); success = true;int main(int argc, char *argv) if (argc = 2) fp = fopen(argv1, "r"); init(); parser(); if (success) printf("This is a legal expression."); else printf("This is a illegal expression."); else printf("参数错误!n"); return 0;专心-专注-专业

    注意事项

    本文(算符优先语法分析设计原理与实现技术-实验报告-及源代码-北京交通大学(共14页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开