递归下降程序

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

以上是前提。

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算法题5----Longest Palindromic Substring

    #5. Longest Palindromic Substring Given a string S, find the longest palindromic substring in S. You ...

  2. ubuntu 14.04/14.10 iptables 防火墙设置

    1. 一键批处理设置      [plain] view plaincopyprint? #!/bin/bash PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/loc ...

  3. Android ListView实现新闻客户端的新闻内容图文混排

    布局文件: <LinearLayout xmlns:android="<a href="http://schemas.android.com/apk/res/andro ...

  4. Redis的基本操作语句

    注:以下出现的key.value都需要具体 1.String类型的数据存储获取 set key value:设置key的值为value,若存在则覆盖,不存在则自动创建decrby get key:获取 ...

  5. Effective C++ Notes

    Item 07 : 为多态基类声明virtual析构函数 #include <iostream> using namespace std; class Base { public: Bas ...

  6. Linux ping命令详解

    Linux系统的ping命令是常用的网络命令,它通常用来测试与目标主机的连通性 基于IMCP协议 常见命令参数 -q 不显示任何传送封包的信息,只显示最后的结果 -n 只输出数值 -R 记录路由过程 ...

  7. Linux 硬件RAID详解系统功能图

    RAID-0(条带模式) 特点: 在读写的时候可以实现并发,所以相对其读写性能最好,每个磁盘都保存了完整数据的一部分,读取也采用并行方式,磁盘数量越多,读取和写入速度越快. 因为没有冗余,一个硬盘坏掉 ...

  8. Asp.Net MVC 开发技巧(一)

    开发程序时的流程: 1.设计数据模型. 数据模型最为重要,不仅关系到数据的存储,同时程序的可扩展性,效率也受影响,甚至决定开发工作量.所以要极其认真的设计数据库的表和相关字段. 建完基本的数据模型后, ...

  9. php中的html元素

    我们先看下面的代码 form2.php <html> <head><title>greetins eartyling</title></head& ...

  10. Permission Denial: opening provider 隐藏的android:exported属性的含义

    Permission Denial: opening provider 隐藏的android:exported属性的含义 2013-03-07 13:17 227人阅读 评论(0) 收藏 举报 场景: ...