当前位置:   article > 正文

《编译原理》实验报告——递归下降语法分析器的构建_输入:简单表达式计算的文法g1 输出: 递归下降语法分析同时输出表达式结果

输入:简单表达式计算的文法g1 输出: 递归下降语法分析同时输出表达式结果

一、实验要求

运用递归下降法,针对给定的上下文无关文法,给出实验方案。预估实验中可能出现的问题。

 

二、实验方案

1、构造LL(1),通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹配,观察输入符号串是否为给定文法的句子。

2、根据LL(1)写函数和程序

 

三、预估问题

应确保LL(1)构造成功,不然程序会出错

理论基础

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路(形如P⇒+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

 

四、内容和步骤

1、针对4.8习题输入和输出的设计及代码

 

2、针对现场给定语法的设计和处理

【考虑简单算术表达式文法G:

E→E + T | T

T→T * F | F

F→(E) | id

试设计递归下降分析程序,以对任意输入的符号串进行语法分析。】

 

3、实验具体步骤

(1)输入字符串,后并加上$符号

(2)匹配字符,若成功,输出并换行,若遇到非终结符,输出空格,若遇到错误,输出字符和位置。

 

针对给定语法进行设计:

  1. E->E+T|T
  2. T->TF|F
  3. F->(E)|id
  4. E->TE’
  5. E’->+TE’|ε
  6. T->FT’
  7. T’->FT’|ε
  8. F->(E)|id
  9. First(E)={(,id}
  10. First(E’)={+, ε}
  11. First(T)={(,id}
  12. First(T’)={, ε}
  13. First(F)={(,id}
  14. Follow(E)={KaTeX parse error: Expected 'EOF', got '}' at position 3: ,)}̲ Follow(E’)={,)}
  15. Follow(T)={+,KaTeX parse error: Expected 'EOF', got '}' at position 3: ,)}̲ Follow(T’)={+,,)}
  16. Follow(F)={*,+,$,)}

五、实验结果

代码

  1. #include<iostream>
  2. #include<string>
  3. #include<math.h>
  4. using namespace std;
  5. string str;
  6. int pos;
  7. bool flag;
  8. void lexp_seq();
  9. void lexp_seq1();
  10. char judge(char ch)
  11. {
  12. if(ch >= '0' && ch <= '9') return 'n';
  13. else if((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) return 'a';
  14. else return ch;
  15. }
  16. void error(char ch)
  17. {
  18. if (flag) return;
  19. else flag = false;
  20. cout<<endl<<"error:"<<ch<<",position:"<<pos;
  21. }
  22. void match(char kind, char ch)
  23. {
  24. cout<<kind<<": "<<ch<<endl;
  25. pos++;
  26. }
  27. void atom()
  28. {
  29. if(!flag) return;
  30. char ch= judge(str[pos]);
  31. if(ch=='n') match('n', str[pos]);
  32. else if(ch=='a') match('a', str[pos]);
  33. else if(ch=='$') cout<<"accept"<<endl;
  34. else error(ch);
  35. }
  36. void list()
  37. {
  38. if(!flag) return;
  39. match('l', '(');
  40. cout<<" ";
  41. lexp_seq1();
  42. if(str[pos] == ')') match('r',')');
  43. else error(str[pos]);
  44. }
  45. void lexp()
  46. {
  47. if(!flag) return;
  48. char ch= judge(str[pos]);
  49. if(ch == 'n' || ch == 'a'){cout<<" ";atom();}
  50. else if(ch == '('){cout<<" ";list();}
  51. else if(ch == '$' ) cout<<"accept"<<endl;
  52. else error(ch);
  53. }
  54. void lexp_seq1()
  55. {
  56. if(!flag) return;
  57. char ch= judge(str[pos]);
  58. if(ch == 'n' || ch == 'a' || ch == '(') {
  59. cout<<" ";
  60. lexp();
  61. cout<<" ";
  62. lexp_seq1();
  63. }
  64. else if(ch == ')') match('r', ')');
  65. else if(ch == '$') cout<<"accept"<<endl;
  66. else error(ch);
  67. }
  68. int main()
  69. {
  70. pos = 0;
  71. flag = true;
  72. cin>>str;
  73. str +='$';
  74. lexp_seq1();
  75. return 0;
  76. }

截图

 

六、实验结论

1 、实验结论

通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹配,观察输入符号串是否为给定文法的句子,输出其语法树。

2、分析和总结

1)对输入设计的结论

按照4.8的输入

2)对输出设计的结论

输出一个语法树,不受界面尺寸限制

3)对递归下降法的算法的结论

递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数),

这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。

 

3、对预估问题的结论

预估问题未发生

资源下载

第四次上机作业 语法分析2

参考文章

《编译原理》实验预习报告——递归下降语法分析器的构建

编译原理 实验4《递归下降分析法设计与实现》

编译原理实验二 递归下降语法分析器的构建

编译原理与实践第四章答案

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/644584
推荐阅读
相关标签
  

闽ICP备14008679号