递归下降程序

递归下降程序一般是针对某一个文法的。而递归下降的预测分析是为每一个非终结符号写一个分析过程,由于文法本身是递归的,所以这些过程也是递归的。

以上是前提。

Sample

  1. 假如给的是正规式子,首先要做的是将其改为文法表示:

    \((int | float) id(,id)^*\)
  2. 以上式子为例,将其改为文法表示

    \(D --> TL\)

    \(T-->int | float\)

    \(L--> L,id | id\)
  3. 然后消除其左递归

    \(D --> TL\)

    \(T-->int | float\)

    \(L--> idR\)

    \(L-->, idR|ε\)
  4. 求其\(FIRST表和FOLLOW表\)

    \(FIRST(D)=(int,float)\)

    \(FIRST(T)=(int,float)\)

    \(FIRST(L)=(id)\)

    \(FIRST(L)=(,ε)\)

    \(FOLLOW(D)=(\)$\()\)

    \(FOLLOW(L)=(\)$\()\)

    \(FOLLOW(T)=(id)\)

    \(FOLLOW(R)=(\)$\()\)
  5. \(Code\)
//递归下降分析程序

#include<iostream>
#include<cstdio>
#include<sstream>
#include<cstring>
#include<string>
#include<cstdlib>
using namespace std;
string str;
size_t lookahead = 0;
string alphabet[] = {
"int","float","(",")","id",","
};
//( int | float )id(,id)*
//正规式表达
void D();
void T();
void L();
void R();
void error(); void error() {
cout<<"Syntax Error!"<<endl;
}
void D() {
T();
L();
} void T() {
string m1 = str.substr(lookahead, 3);
string m2 = str.substr(lookahead, 5);
if (m1 == "int")
{
lookahead += 3;
}
else if (m2 =="float") {
lookahead += 5;
}
else
error();
} void L() {
string m3 = str.substr(lookahead, 2);
if (m3 == "id") {
lookahead += 2;
R();
}
else
error();
} void R() {
if (str[lookahead] == ',') {
lookahead += 1;
string m4 = str.substr(lookahead, 2);
if (m4 == "id") {
lookahead += 2;
R();
}
else
error();
}
} int main(void) {
int n;
cout<<"Test Number:" << endl;
cin >> n;
while (n--)
{
cout << "Input:";
cin >> str;
str.append("$");
str.append("\0");
D();
if (str[lookahead] == '$')
cout << "Accepted" << endl;
else
error();
lookahead= 0;
}
return 0;
}

LL(1)文法--递归下降程序的更多相关文章

  1. 十一次作业——LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  2. LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da | ε (3)B -> cC (4)C -> aADC | ε (5)D -> b | ε 验证文法 G ...

  3. 编译原理之LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  4. 第十一次作业 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  5. 第十一次 LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  6. 编译原理:LL(1)文法的判断,递归下降分析程序

    1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不 ...

  7. 作业十一——LL(1)文法的判断,递归下降分析程序

    作业十一——LL(1)文法的判断,递归下降分析程序 判断是否为LL(1)文法 选取有多个产生式的求select,只有一条产生式的无需求select 同一个非终结符之间求交集,全部判断为空后则为LL(1 ...

  8. 编译原理-递归下降分析法 c程序部分的分析

    实验三 语法分析程序实验 专业 商软2班   姓名 黄仲浩  学号 201506110166 一. 实验目的      编制一个部分文法分析程序. 二. 实验内容和要求 输入:源程序字符串 输出:正确 ...

  9. TINY语言采用递归下降分析法编写语法分析程序

    目录 自顶向下分析方法 TINY文法 消左提左.构造first follow 基本思想 python构造源码 运行结果 参考来源:聊聊编译原理(二) - 语法分析 自顶向下分析方法 自顶向下分析方法: ...

随机推荐

  1. LeetCode赛题394----Decode String

    394. Decode String Given an encoded string, return it's decoded string. The encoding rule is: k[enco ...

  2. [翻译] DZNSegmentedControl

    DZNSegmentedControl A drop-in replacement for UISegmentedControl for showing counts, to be used typi ...

  3. Spring学习---Spring中利用jackson进行JSON转换

    Spring中利用jackson进行JSON转换 import java.util.List; import com.fasterxml.jackson.core.JsonProcessingExce ...

  4. Linux中如何安装loadgenerator

    /* 1. 到官方网站到HP官网下载Load Generator 安装文件 _Load_Generator_11.00_T7330-15010.iso或者其它网站下载loadrunner-11-loa ...

  5. Buffers与cached啥区别

    A buffer is something that has yet to be “written” to disk. A cache is something that has been “read ...

  6. Python安装Windows的pip包

    1.到https://www.python.org/downloads/ 下载python包安装python 2.到https://pypi.python.org/pypi/pip#downloads ...

  7. mysql安装linux_二进制包安装

    1.下载(本地下载www.mysql.com ----->DOWNlOADS------>Archives----->MySQL Community Server---->Li ...

  8. tcp的三次握手:通信的本质:通信通知与信息交换

    tcp的三次握手:通信的本质:通信通知与信息交换

  9. ESP和EBP 栈顶指针和栈底指针

    http://blog.csdn.net/hutao1101175783/article/details/40128587 (1)ESP:栈指针寄存器(extended stack pointer), ...

  10. 2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165322 Exp3 免杀原理与实践 目录 实验内容与步骤 正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,加壳 ...