语法分析 递归下降分析法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

} void E() {if (A[i]=='('|| A[i]=='d')
{T(); if(A[i]=='+') E1(); else if(A[i]==')'|| A[i]=='$') {judge=0; return;} } } void E1() { if(A[i]=='+') { match(i); if (A[i]=='('|| A[i]=='d') {T(); if(A[i]=='+') E1(); else if(A[i]==')'|| A[i]=='$') judge=0; return;} else
if(A[i]==')') match(i); } else if(A[i]=='d') match(i); else judge=1;
} void match(int &k) {
k++; } 五、实验报告
编制并调试程序程序,运行通过后,书写实验报告,报告包括以下内容。 1. 实验题目与要求 2. 总的设计思想,及环境语言、工具等 3. 数据结构与模块说明(功能与框图) 4. 源程序(核心代码) 5. 运行结果与运行情况 6. 总结
//
E→TE'
//
//
E'→+TE'|ε
//
//
T→FT'
//
//
Leabharlann Baidu
T'→*FT'|ε
//
//
F→(E)|d
//
//
//
//
//源程序中 E1、T1 分别代替 E'、T'
//运行环境 Dev C++ 4.9.9.2
#include <iostream>
using namespace std;
#include <iomanip>
read(token); else
ERROR; If(token==’d’)
X(); Else if (token==’s’) //注意:对 Y 的识别也可以是在 X 的过程中一开始就进 行,所以在最外层分支中,加上一个 token==s 的分支
Y(); Else ERROR;
} Else ERROR; } Y() // Y→sZ {if(token==’s’) {read(token);
judge=0;return; else
judge=1; } } void T1() { if(A[i]=='*')//判断当前输入符是否属于 First(*FT1) {
match(i); if(A[i]=='('|| A[i]=='d') { F(); if( A[i]=='*') T1(); else if( A[i]=='+'|| A[i]==')'|| A[i]=='$')
#include <string.h>
#define ERROR printf("error./n");
char A[51]; //用于存放符号串,不能 50 个字符
int i=0; //用于控制当前要判断的字符
int n; bool judge=0;//用于判断输出"合法"或"不合法 " void E(); // void E1(); // void T(); //为每个非终节符构造一个子程序 E→TE' E'→+TE'|ε T→FT' T'→*FT'|ε F→(E)|d
void T1(); //
void F(); //
void match(int &k);//此程序只是此执行加 1 操作
int main( )
{
cout<<"请输入一个有待判断的符号串(以$结尾):\n";
cout<<"\n***************************************\n\n";
cout<<"
";
cin>>A;
cout<<"\n***************************************\n\n";
n=strlen(A);
E();
if(judge==0)
cout<<"\n 此输入串合法\n\n";
else
cout<<"\n 此输入串不合法\n\n";
system("pause");
judge=0;return; else
judge=1; } } else
if(A[i]=='+'||A[i]==')'||A[i]=='$')//判断当前输入符是否属于 Follow(T1) return; else judge=1; } void F() { if(A[i]=='(') { match(i); if (A[i]=='('|| A[i]=='d') E();
judge=1; } } else if(A[i]==')'||A[i]=='$')//判断当前输入符是否属于 Follow(E1) return ; else judge=1; } void T() { if(A[i]=='('|| A[i]=='d') { F(); if( A[i]=='*') T1(); else if( A[i]=='+'|| A[i]==')'| A[i]=='$')
分支
Return; Else ERROR; } Else ERROR; }
程序示例二(参考代码): 构造文法 G[E]: E→E + T | T T→ T * F | F F→(E)| d 的递归子程序
(即语法分析器)。 注:该文法消除左递归,得 E→TE' E'→+TE'|ε T→FT' T'→*FT'|ε F→(E)|d
实验 2 语法分析——递归下降分析法
一、实验目的
1、通过该课程设计要学会用消除左递归的方法来使文法满足进行确定自顶向下 分析的条件。 2、学会用 C/C++高级程序设计语言来设计一个递归下降分析法的语法分析器; 3、通过该课程设计,加深对语法分析理论的理解,培养动手实践的能力。
二、设计内容
参考算数运算的递归子程序构造方法及代码,完成以下任务: 构造布尔表达式的文法,并编写其递归子程序。 程序设计语言中的布尔表达式有两个作用,一是计算逻辑值,更多的情况是 二,用作改变控制流语句中条件表达式,如在 if-then,if-then-else 或是 while-do 语句中使用。 布尔表达式是由布尔算符(and,or,not)施予布尔变量或关系运算表达式而成。 为简单起见,以如下文法生成的布尔表达式作为设计对象: E→E and E | E or E | not E | i rop i | true | false i→标识符|数字 rop→>= | > | <= | < | == | <> 以上文法带有二义性,并且未消除左递归,请对之处理后,再构造递归下降 程序。可适当减少工作量,暂时忽略 id 的定义,输入时直接用数字或字母表示。
三、语法分析器的功能
该语法分析器能够分析词法分析器的结果,即单词二元式。在输入单词二元 式后,能输出分析的结果。
四、算法分析
1、语法分析的相关知识; 2、递归子程序法的相关理论知识; 3、根据递归子程序法相关理论,具体针对文法的每一条规则编写相应得递归子 程序以及分析过程等。
//在递归子程序的编写过程中,当要识别一个非终结符时,需时刻留意该非终结
If (token==’;’) Read(token); Else
ERROR; If (token==’d’ || ‘s’)
X(); Else ERROR; If(token==’end’) OK;
} Else ERROR; } X() //X→d;X|Y {if(token==’d’)
{read(token); if(token==’;’)
符的 FIRST 集与 FOLLOW 集。
程序示例一:
G:P→begin d;X end
G’:P→begin d;X end
X→d;X|Y
X→d;X|Y
Y→Y;s|s
Y→sZ Z→;sZ|ε
相应的递归子程序设计如下:
P() { if(token==“begin“)
{ Read(token); If(token==’d’) Read(token); Else ERROR;
If(token==’;’ || ‘end’) Z(); Else ERROR; Else ERROR; } Z() // Z→;sZ|ε
{if(token==’;’) {read(token); If(token==’s’) Read(token); Else ERROR; If(token==’;’) Z(); Else if (token==’end’) // 类似的,这里对于读到 end,也要最外层添加一个
相关文档
最新文档