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

【实验目的】

(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 }

截图:

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

时间: 2024-11-08 15:48:34

软件构造——递归下降分析法的相关文章

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

实验三 递归下降分析法

实验三递归下降分析程序实验 专业 商软2班   姓名 蓝海鹏  学号 201506110171 一.        实验目的      编制一个使用递归下降分析法实现的语法分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试 1.      源程序名:171-蓝海鹏.c 可执行程序名:171蓝海鹏.exe 2.      原理分析及流程图 3.      主要程序段: 1 #include<stdio.h> 2

递归下降分析法

实验三 递归下降分析法 实验三递归下降分析程序实验 专业 商软2班   姓名 李文辉  学号 201506110168 一.        实验目的      编制一个使用递归下降分析法实现的语法分析程序. 二.        实验内容和要求 输入:正规式 输出:判断该正规式是否正确. 三.        实验方法.步骤及结果测试 1.      源程序名:168-李文辉.c 可执行程序名:168李文辉.exe 2.      原理分析及流程图 3.      主要程序段: 1 #include

编译原理-递归下降分析法

题:对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->TG (2)G->+TG|—TG (3)G->ε, (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 答:文法太多,可先合并. (1)E->FSG (2)G->+TG|—TG|ε (3)S->*FS|/FS|ε (4)F->(E)|i 结合1,4 (1)E->ESG|iSG (2)G->+TG|—TG|

构造递归下降分析程序

词法分析程序scaner( ),sym:error( ) 每个函数名是相应的非终结符,函数体是根据右部符号串的结构编写. 当遇到终结符时,则编写语句if(当前读入的符号==a)则读入下一个单词当遇到非终结符A时,则编写语句调用A( )当遇到规则A→ε时,则编写语句调用if(当前读入的符号? FOLLOW(A))error( ) 对于给定的文法G[E] : E→E+T|E-T|TT→T*F| T/F|FF→(E)|i 消除左递归后的文法是:E→TE' E'→+TE'|-TE'|∑ T→FT' T'

1216 递归下降分析法

/*G[E]: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 左递归消除 E->TE' E'->+TE'|-TE'|ε T->FT' T'->*FT'|/FT'|ε F->(E)|i */ #include<stdio.h> char sym; char LL1[1000]; int N=-1; void T(); void E(); void F(); void e(); void t(); void error();

递归下降分析法--算数语法分析

#include<stdio.h>char curr;char LL1[1000];int N=-1; void T();void E();void F();void e();void t();void error();void scaner(); void main(){ char ch; int i=0; printf("请输入需要分析的curr语法:(以#结束)\n"); do{ scanf("%c",&ch); LL1[i] = ch;

软件构造实验三-递归下降分析分析法

[实验目的] (1)掌握自上而下语法分析的要求与特点. (2)掌握递归下降语法分析的基本原理和方法. (3)掌握相应数据结构的设计方法. [实验内容] 用递归下降法编写一个语法分析程序,使之与词法分析器结合,能够根据语言的上下文无关文法,识别输入的单词序列是否文法的句子. [实验要求] 对下列文法,用递归下降分析法对任意输入的符号串进行分析: E->TG    G->+TG|-TG   G->ε T->FS    S->*FS|/FS    S->ε F->(E)

递归下降分析实验报告

                                                                      实验四:语法分析实验 一.        实验目的   编写递归下降分析语法分析程序. 二.        实验内容和要求 输入:输入算术表达式以"#"结束 输出:是否分析成功 三.        实验方法.步骤及结果测试  1.      源程序名:压缩包文件(rar或zip)中源程序名 语法分析.c 可执行程序名:语法分析.exe 2.