编译原理实验(二)——LL(1)文法语法分析

小咪咪 2023-05-30 09:15 100阅读 0赞

编译原理实验(二)——LL(1)文法语法分析

      • 实验要求
      • 参考程序
        • 程序输入说明
        • 实验结果
          • 截图

实验要求

根据LL(1)分析法编写一个语法分析程序 直接输入根据已知文法构造的分析表M;对于输入的文法和符号串,所编制的语法分析程序应能正确判断此串是否为文法的句子,并要求输出分析过程。

参考程序

  1. #include <iostream>
  2. #include <string>
  3. #include <map>
  4. #include <stack>
  5. #include <vector>
  6. #include <iomanip>
  7. using namespace std;
  8. const int maxSize = 10; //定义分析表的最大大小
  9. const string errorstr = "你输入的语言该文法无法识别";
  10. const int outWidth = 30; //设置输出字符串所占宽度
  11. string LL1ForecastAnalysisTable[maxSize][maxSize]; //分析表的具体的内容
  12. int terminatorNum; //输入终结符的数量
  13. int nonterminatorNum; //输入非终结符的数量
  14. map<char, int> terminatorSet; //输入终结符的集合,用map 映射表示在分析表的第几列
  15. map<char, int> nonterminatorSet; //输入非终结符的集合,用map 映射表示在分析表的第几行
  16. vector<char> analysisStack; //为了更好的输出栈中的内容,用vector数组模拟栈行为
  17. void analysisProcess(string); //对输入的语言用LL1预测分析表进行分析
  18. char S;
  19. int main()
  20. {
  21. cout << "请输入终结符的个数:";
  22. cin >> terminatorNum;
  23. char str;
  24. cout << "请依次按照分析表输入终结符(包含结束符#):" << endl;
  25. for (int i = 1; i <= terminatorNum; ++i)
  26. {
  27. cin >> str;
  28. terminatorSet[str] = i;
  29. }
  30. cout << "请输入非终结符的个数:";
  31. cin >> nonterminatorNum;
  32. cout << "请依次按照分析表输入终结符:" << endl;
  33. for (int i = 1; i <= nonterminatorNum; ++i)
  34. {
  35. cin >> str;
  36. nonterminatorSet[str] = i;
  37. }
  38. cout << "请输入开始符合:";
  39. cin >> S;
  40. cout << "请依次输入分析表的内容,对于出错错误的请输入单个英文字符_:\n";
  41. for (int i = 1; i <= nonterminatorNum; ++i)
  42. {
  43. for (int j = 1; j <= terminatorNum; ++j)
  44. {
  45. cin >> LL1ForecastAnalysisTable[i][j];
  46. }
  47. }
  48. cout << "请输入要分析语言: ";
  49. string L;
  50. cin >> L;
  51. analysisProcess(L);
  52. }
  53. void analysisProcess(string str)
  54. {
  55. cout << " 步骤 分析栈 剩余输入串 所用产生式" << endl;
  56. int i = 0, ip = 0; //i代表进行到第几步 a是分析到输入语言字符串第几个
  57. char X, a = str[ip]; //分析栈栈顶符号
  58. str += "#"; //在语言末尾加入输入结束符
  59. analysisStack.clear(); //使分析栈为空
  60. analysisStack.push_back('#');
  61. analysisStack.push_back(S); //初始化将’#’压入堆栈中,将开始符号S压入栈中
  62. string outStack, outStr;
  63. while (++i)
  64. {
  65. X = analysisStack.back();
  66. analysisStack.pop_back();
  67. if (X == '#')
  68. {
  69. if (X == a)
  70. {
  71. cout << setw(10) << setiosflags(ios::left) << i << setw(outWidth);
  72. cout << setiosflags(ios::left) << "#" << setw(outWidth) << setiosflags(ios::left) << "#"
  73. << "接受\n";
  74. }
  75. else
  76. {
  77. cout << errorstr << endl;
  78. }
  79. return;
  80. }
  81. else if (terminatorSet[X])
  82. {
  83. if (X == a)
  84. {
  85. outStack = "";
  86. for (int i = 0; i < analysisStack.size(); ++i)
  87. outStack += analysisStack[i];
  88. outStack += X;
  89. cout << setw(10) << setiosflags(ios::left) << i << setw(outWidth) << setiosflags(ios::left) << outStack;
  90. outStr = "";
  91. for (int t = ip; t < str.size(); ++t)
  92. outStr += str[t];
  93. cout << setw(outWidth) << setiosflags(ios::left) << outStr << a << "匹配\n";
  94. a = str[++ip];
  95. }
  96. else
  97. {
  98. cout << errorstr << endl;
  99. return;
  100. }
  101. }
  102. else
  103. {
  104. int row = nonterminatorSet[X], col = terminatorSet[a];
  105. string f = LL1ForecastAnalysisTable[row][col]; //获取文法产生式
  106. if (f == "_")
  107. {
  108. cout << errorstr << endl;
  109. return;
  110. }
  111. outStack = "";
  112. for (int i = 0; i < analysisStack.size(); ++i)
  113. outStack += analysisStack[i];
  114. outStack += X;
  115. cout << setw(10) << setiosflags(ios::left) << i << setw(outWidth) << setiosflags(ios::left) << outStack;
  116. outStr = "";
  117. for (int t = ip; t < str.size(); ++t)
  118. outStr += str[t];
  119. cout << setw(outWidth) << setiosflags(ios::left) << outStr << X << "->" << f << endl;
  120. if (f != "@")
  121. for (int j = f.size() - 1; j >= 0; --j)
  122. analysisStack.push_back(f[j]);
  123. }
  124. }
  125. }

程序输入说明

输入的终结符与终结符都为单个字符
空( ε \varepsilon ε)用@表示

实验结果

对于文法
E->TA
A->+TA|@
T->FB
B->*FB|@
F->(E)|i
分析表为
在这里插入图片描述
输入数据为

  1. 6
  2. i + * ( ) #
  3. 5
  4. E A T B F
  5. E
  6. TA _ _ TA _ _
  7. _ +TA _ _ @ @
  8. FB _ _ FB _ _
  9. _ @ *FB _ @ @
  10. i _ _ (E) _ _
  11. i+i*i
截图

在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,100人围观)

还没有评论,来说两句吧...

相关阅读