编译原理课程第11讲

编译原理课程第11讲

ID:46515345

大小:521.50 KB

页数:45页

时间:2019-11-24

编译原理课程第11讲_第1页
编译原理课程第11讲_第2页
编译原理课程第11讲_第3页
编译原理课程第11讲_第4页
编译原理课程第11讲_第5页
资源描述:

《编译原理课程第11讲》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、3.7分析器的生成器3.7.1分析器的生成器YaccYacc编译器Yac源程序translate.yy.tab.cC编译器y.tab.ca.outa.out输入输出Lex编译器Lex源程序lex.llex.yy.cC编译器lex.yy.ca.outa.out输入流记号序列用Lex建立词法分析器的步骤1/36Yacc程序包括三个部分声明%%翻译规则%%支持例程3.7分析器的生成器例---声明部分%{#include/*常量、变量的声明*/%}%tokenDIGIT%%3.7分析器的生成器EE+T

2、TTT*F

3、FF(E)

4、digit例---

5、翻译规则部分line:expr‘’{printf(“%d”,$1);};expr:expr‘+’term{$$=$1+$3;}

6、term;term:term‘*’factor{$$=$1*$3;}

7、factor;factor:’(’expr‘)’{$$=$2;}

8、DIGIT;%%3.7分析器的生成器EE+T

9、TTT*F

10、FF(E)

11、digit例---支持例程部分yylex(){intc;c=getchar();if(isdigit(c)){yylval=c–‘0’;returnDIGIT;}returnc;}3.7分析器的生成器EE+T

12、TT

13、T*F

14、FF(E)

15、digit5/363.7分析器的生成器3.7.2用Yacc处理二义文法解决分析动作冲突的两大默认规则:对于归约-归约冲突,选择在Yacc程序中最先出现的那个产生式归约对于移进-规约冲突,优先移进3.7分析器的生成器3.7.2用Yacc处理二义文法例台式计算器输入一个表达式并回车,显示计算结果。也可以输入一个空白行。lineslinesexpr‘’

16、lines‘’

17、eEE+E

18、E–E

19、E*E

20、E/E

21、(E)

22、-E

23、number3.7分析器的生成器%{#include#include#defin

24、eYYSTYPEdouble/*将栈定义为double类型*/%}%tokenNUMBER%left‘+’‘’%left‘*’‘/’%rightUMINUS%%lineslinesexpr‘’

25、lines‘’

26、eEE+E

27、E–E

28、E*E

29、E/E

30、(E)

31、-E

32、number3.7分析器的生成器lines:linesexpr‘’{printf(“%g”,$2)}

33、lines‘’

34、/**/;expr:expr‘+’expr{$$=$1+$3;}

35、expr‘’expr{$$=$1$3;}

36、expr‘*’expr{$$=$1*$3;}

37、e

38、xpr‘/’expr{$$=$1/$3;}

39、‘(’expr‘)’{$$=$2;}

40、‘’expr%precUMINUS{$$=$2;}

41、NUMBER;%%lineslinesexpr‘’

42、lines‘’

43、eEE+E

44、E–E

45、E*E

46、E/E

47、(E)

48、-E

49、number3.7分析器的生成器yylex(){intc;while((c=getchar())==‘’);if((c==‘.’)

50、

51、(isdigit(c))){ungetc(c,stdin);scanf(“%lf”,&yylval);returnNUMBER;}returnc;}linesli

52、nesexpr‘’

53、lines‘’

54、eEE+E

55、E–E

56、E*E

57、E/E

58、(E)

59、-E

60、number10/363.7分析器的生成器3.7.3Yacc的错误恢复编译器设计者的工作决定哪些“主要的”非终结符将有错误恢复与它们相关联加入Aerror的错误产生式,其中A是主要非终结符,是文法符号串为这样的产生式配上语义动作Yacc把错误产生式当作普通产生式处理3.7分析器的生成器遇到语法错误时从栈中弹出状态,直到发现栈顶状态的项目集包含形为A·error的项目为止把虚构的终结符error“移进”栈若为,直接进行产生式规约,并执行相关的语义动作,忽

61、略若干输入符号,直至发现能回到正常处理的符号为止。若不为,找到,把移进栈把error归约为A,恢复正常分析。s......栈........a..A发现错误s:C1·A2A·bA·error...C1A·2...AAb·...b3.7分析器的生成器lines:linesexpr‘’{printf(“%g”,$2)}

62、lines‘’

63、//

64、error‘’{printf(“重新输入上一行”);yyerrok;};语法分析内容总结文法和语言的基本知识自上而下的分析方法:预测分析,非递归的预测分析,LL(1)文法

65、自下而上的分析方法:SLR(1)方法,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。