《编译原理课程设计-语法分析器》由会员分享,可在线阅读,更多相关《编译原理课程设计-语法分析器(22页珍藏版)》请在金锄头文库上搜索。
1、福建农林大学计算机与信息学院计算机类课程设计报告课程名称:编译原理课程设计题目:语法分析器姓 名:系:软件工程专 业:软件工程年 级:2012级学 号:3126016056指导教师:职 称:副教授20142015学年第二学期福建农林大学计算机与信息学院计算机类课程设计结果评定评语:成绩:指导教师签字:任务下达日期:评定日期:目 录1 正则表达式11.1 正则表达式11.2 确定化(化简)后的状态转换图11.3 分析程序代码11.4 程序运行截图21.5 小结32 LL(1)分析42.1 LL(1)文法42.2 LL(1)预测分析表42.3 分析程序代码42.4 程序运行截图62.5 小结73
2、算符优先分析83.1 算符优先文法83.2 算符优先关系表83.3 分析程序代码83.4 程序运行截图113.5 小结124 LR分析134.1 LR文法134.2 LR分析表134.3 分析程序代码134.4 程序运行截图174.5 小结19参考文献:191 正则表达式1.1 正则表达式(a*|b*)b(ba)*1.2 确定化(化简)后的状态转换图1.3 分析程序代码import java.util.Scanner;import java.util.regex.Matcher;import java.util.regex.Pattern;public class Main public st
3、atic void main(String args)String a,b;Scanner input = new Scanner(System.in);System.out.println(请先输入【正则表达式】再输入【符号串】);while(input.hasNext() a = input.next();b = input.next();System.out.println(符号串【 + b + 】 + work(a,b) + 正则表达式【 + a + 】);private static String work(String a, String b) Pattern pattern =
4、Ppile(a);/将给定的正则表达式编译并赋予给Pattern类Matcher matcher = pattern.matcher(b);/对输入的字串以该正则表达式为模开展匹配return matcher.matches()? 满足 : 不满足 ;/匹配检测#include#include#includeusing namespace std;int m100255;/m起点路径=终点bool end100;void init()m1a=2;m1b=3;m2a=2;m2b=4;m3b=6;m4b=5;m5a=4;m6a=4;m6b=6;end3=end4=end6=true;int mai
5、n()puts(本程序的正则表达式为(a*|b*)b(ba)*,请输入符号串);string s;init();cins;int now=1;for(int i=0;si;i+)now=mnowsi;if(endnow)puts(符合);elseputs(不符合);return 0;1.4 程序运行截图JAVAC+1.5 小结通过JAVA自带的类库可以轻松完成动态输入【正则表达式】的程序,而C+的我目前不懂是否有这些类,如果要写自带构图的,代码会比较复杂,所以这题我用C+写的程序是固定的【正则表达式】的,这样只需要在运行核心代码前用固定方式构建好状态转换图就可以了。2 LL(1)分析2.1 L
6、L(1)文法 SaD DSTe| TbH|H Hd| 2.2 LL(1)预测分析表aebd#SSaDDDSTeDDDDTTHTbHTHHHHd2.3 分析程序代码#include#include#include#include#includeusing namespace std;string s,stack;string LL255255;string reverse(string str)/字符串倒置char t100=0;int len=str.length();for(int i=0;ilen;i+)ti=strlen-i-1;return t;void init()/0表示没有这种转
7、化/表示for(int i=0;i255;i+)for(int j=0;j255;j+)LLij=0;LLSa=aD;LLDa=STe;LLDe=;LLDb=;LLDd=;LLD#=;LLTe=H;LLTb=bH;LLTd=H;LLHe=;LLHd=d;stack=S;void work()puts(符号栈输入串 动作);coutleft;int i=0;putchar(#);coutsetw(23)stack;coutsetw(23)s.substr(i,s.length();trywhile(!stack.empty()if(stackstack.length()-1=si)/执行弹出co
8、ut弹出栈顶符号siendl;i+;stack=stack.substr(0,stack.length()-1);else if(LLstackstack.length()-1si!=0)/执行转换coutstackstack.length()-1;if(LLstackstack.length()-1si=)puts();elsecoutLLstackstack.length()-1siendl;stack=stack.substr(0,stack.length()-1)+reverse(LLstackstack.length()-1si);elsethrow 0;putchar(#);cou
9、tsetw(23)stack;coutsetw(23)s;s=s+#;work();return 0;2.4 程序运行截图2.5 小结以【”0”】作为错误输入的标志,把2.1中给定表格中无数据的项填入0,当匹配到0时,表示输入的数据错误。因为本题要求显示【符号栈】,所以我用string而不是用stack来表示符号栈,但运用的仍然是栈的思想。这题我出错的地方在于循环条件写成【si!=#】 (已改正),循环条件应该为【!stack.empty()】,而成功判断放在循环外,为【si=#】。当输入错误时,一定会在循环内部被找出,或者是程序运行时抛出的异常都代表输入错误。3 算符优先分析3.1 算符优先
10、文法 EE+T | T TT*F | F F(E) | i3.2 算符优先关系表+*i()#+*i(#=3.3 分析程序代码#include#include#include#include#include#include#includeusing namespace std;char Precedence66= , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , = ;char symbol255;string s;map ex;void init()/构造映射symbol+=0;symbol*=1;symboli=2;symbol(=3;symbol)=4;symbol#=5;exE+T=E;ex