码迷,mamicode.com
首页 > 其他好文 > 详细

软件构造——递归下降分析法

时间:2020-01-17 20:50:15      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:inf   out   span   要求   词法分析   设计   截图   clu   递归下降   

【实验目的】 

(1)掌握自上而下语法分析的要求与特点。 

(2)掌握递归下降语法分析的基本原理和方法。 

(3)掌握相应数据结构的设计方法。  

【实验内容】 

用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子。

【实验要求】 

对下列文法,用递归下降分析法对任意输入的符号串进行分析:

E->TG    G->+TG|-TG   G->ε

T->FS    S->*FS|/FS    S->ε

F->(E)     F->i

【实验结果】 

技术图片

 

 技术图片

 

 代码:

  1 #include <iostream>
  2 #include"yytex.h"
  3 
  4 using namespace std;
  5 char str[10];
  6 int lookahead=0;
  7 void match(char t);
  8 void E();
  9 void T();
 10 void G();
 11 void F();
 12 void S();
 13 void Error();
 14 void Fen();
 15 void Sheng();
 16 int bo = 1;
 17 int Leaf = 1;
 18 int main()
 19 {
 20     cout << "********************************************************" << endl;
 21     cout << "欢迎使用20173599 信1705-1 周博的词法分析器 (采用递归下降分析法)" << endl;
 22     cout << "请输入待检测词法,#号键结束" << endl;
 23     cin >> str;
 24     cout << "文法\t分析串\t分析字符\t剩余串\t" << endl;
 25     E();
 26     Error();
 27 }
 28 void Error()
 29 {
 30     
 31     if (bo == 1)
 32     {
 33     
 34         if (str[lookahead] == #&&Leaf == 1)
 35         {
 36             cout << "Success" << endl;
 37             
 38         }
 39             
 40         else cout << "ERROR" << endl;
 41     }
 42     bo += 1;
 43 }
 44 void Fen()
 45 {
 46     cout << str[lookahead] << "\t";
 47 }
 48 void Sheng()
 49 {
 50     cout << "\t";
 51     for (int i = lookahead; i < strlen(str); i++)
 52     {
 53         cout << str[i];
 54     }
 55     cout << endl;
 56 }
 57 void match(char t)
 58 {
 59     Fen();
 60     if (str[lookahead] ==t)
 61     {
 62         cout << t <<"\t";
 63         lookahead += 1;
 64         Sheng();
 65     }
 66     else Error();
 67 }
 68 void E()
 69 {
 70     cout << "S->TG\t\t";
 71     Fen();
 72     Sheng();
 73     T();
 74     G();
 75     
 76 }
 77 void T()
 78 {
 79     cout << "T->FS\t\t";
 80     Fen();
 81     Sheng();
 82     F();
 83     S();
 84     Leaf = 0;
 85 }
 86 void G()
 87 {
 88     if (str[lookahead] == +)
 89     {
 90         cout << "G->+TG\t";
 91         match(+);
 92         T();
 93         G();
 94         Leaf = 1;
 95     }
 96     else if (str[lookahead] == -)
 97     {
 98         cout << "G->-TG\t";
 99         match(-);
100         T();
101         G();
102         Leaf = 1;
103     }
104     cout << "G->ε\t\t";
105     Fen();
106     Sheng();
107     Leaf = 1;
108 
109 }
110 void F()
111 {
112 
113     if (str[lookahead] == i)
114     {
115         cout << "F->i\t";
116         match(i);
117         Leaf = 1;
118     }
119 
120     else if (str[lookahead] == ()
121     {
122         cout << "F->(E)\t";
123         match(();
124         E();
125         if (str[lookahead] == ))
126             match());
127         else Error();
128         Leaf = 0;
129     }
130     else
131     {
132         Leaf = 0;
133         Error();
134         
135     }
136 
137 }
138 void S()
139 {
140     if (str[lookahead] == *)
141     {
142         cout << "S->*FS\t";
143         match(*);
144         F();
145         S();
146     }
147     else if(str[lookahead] == /)
148     {
149         cout << "S->/FS\t";
150         match(*);
151         F();
152         S();
153     }
154     cout << "S->ε\t\t";
155     Fen();
156     Sheng();
157     Leaf = 1;
158 }

截图:

技术图片

 

 技术图片

软件构造——递归下降分析法

标签:inf   out   span   要求   词法分析   设计   截图   clu   递归下降   

原文地址:https://www.cnblogs.com/smartisn/p/12207393.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!