参考来源:聊聊编译原理(二) - 语法分析

自顶向下分析方法

自顶向下分析方法:递归下降分析法,LL1分析法。其实本质上核心思想是一样的,也就是LL,从左至右,最左推导,因而我觉得其实可以把前一个称为LL0分析法,即不使用向前看符号,这也是他们的不同点,具体实现不同罢了,递归下降需要用回溯和分治,调用递归函数,因为递归调用,耗费时间当然要长一点,而LL1使用first和follow函数(当然前者也用到了)创建了一个预测分析表,可以知道,这个算法不需要再去遍历尝试每一种语法树组合,而是根据表肯定能选出最优的组合去匹配,这也就是典型的牺牲空间换时间的算法。

TINY文法


为简单起见,丢弃了read和write语句(但实际上也就加两条语法的问题,可直接补充)

  1. program -> stmt-sequence
  2. stmt-sequence -> stmt-sequencestatement | statement
  3. statement -> if-stmt | repeat-stmt | assign-stmt //丢弃了读写语句
  4. if-stmt -> if exp then stmt-sequence end //条件语句
  5. | if exp then stmt-sequence else stmt-sequence end
  6. repeat-stmt -> repeat stmt-sequence until exp //循环语句
  7. assign-stmt -> id := exp //赋值语句
  8. exp -> simple-exp compar-op simple-exp | simple-exp //算数表达式
  9. compar-op -> < | =
  10. simple-exp -> simple-exp add-op term | term
  11. add-op -> + | -
  12. term -> term mul-op factor | factor
  13. mul-op -> * | /
  14. factor -> ( exp ) | number | id

消左提左、构造first follow



基本思想

  • 为每个非终结符构造一个分析函数
  • 用前看符号指导产生式规则的选择

第一点简单来说就是A -> Bc B -> d
构造函数A(),B()
第二点即是说会用到first(A)和first(B) 即上图中的红色部分

python构造源码

对于文法来说分三种情况

  1. A -> B C
    没有其他的终结符和|,则直接调用两个产生式右部的非终结符函数

如: stmt-sequence -> statement ST

  1. A -> B | C
    存在 | ,则需要看A的first,| 等价于if-else,所以需要看first(A)的结果去分类判断该调用哪个非终结符函数,同时,这里需要putback,因为这个token是多读的,需要将指针调回去

如:statement -> if-stmt | repeat-stmt | assign-stmt

  1. A -> B |
    存在 空,则需要回溯,因为A可以在此不做任何事情,因而读取的token不满足first(B)时,则同样需要putback,将指针倒回去重新读取token

如:ST -> ;statement ST |

主要函数

  • 基本的函数定义
    init初始化函数,得到已经特意写好的token流,指针位置初始化为0
    get_next_token 得到下一个token
    put_token_back 回溯上一个token
  • main函数
    预置好了token流,用空格分开,因为上面init是根据空格切开为数组的
    匹配过程中如果有错误,会直接抛出异常,则程序是不会走到最后的print的,故输出匹配成功了则是匹配无误
  • 非终结符函数


运行结果


故意改错语法 tiny语言赋值语法为’ := ’ 而非’ = ’

完整源码:parseTINY

TINY语言采用递归下降分析法编写语法分析程序的更多相关文章

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

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

  2. Tiny语法分析器(递归下降分析法实现)

    递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...

  3. 编译原理 #02# 简易递归下降分析程序(js实现)

    // 实验存档 截图: 代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g ...

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

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

  5. 递归下降和LL(1)语法分析

    什么是自顶向下分析法 在语法分析过程中一般有两种语法分析方法,自顶向下和自底向上,递归下降分析和LL(1)都属于是自顶向下的语法分析 自顶向下分析法的过程就像从第一个非终结符作为根节点开始根据产生式进 ...

  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)文法的判断,递归下降分析程序

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

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

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

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

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

随机推荐

  1. 表格的td行利用css显示...

      默认超过指定长度以...显示, 鼠标放到文本上显示全 代码如下 .fh{ max-width:220px; word-wrap:break-word; text-overflow:ellipsis ...

  2. Lua在Nginx的应用

    当 Nginx 标准模块和配置不能灵活地适应系统要求时,就可以考虑使用 Lua 扩展和定制 Nginx 服务.OpenResty集成了大量精良的 Lua 库.第三方模块,可以方便地搭建能够处理超高并发 ...

  3. 2、mysql如何控制用户对数据库的访问

    基础理解:通过对用户赋予某些权限就可以控制用户对数据库的访问 更深层次的理解:当mysql对用户赋予某些权限时,mysql底层是如何控制用户对数据库的访问 用户管理和权限管理 (基础理解) 用户管理 ...

  4. 采用 DIV+CSS 布局网页练习

    实验四:采用 DIV+CSS 布局网页练习 实验目的: 熟悉 DIV+CSS 布局网页的方法 实验要求: 1.制作一个完整网页和一个 css 文件: 2.在网页中采用 DIV+CSS 布局 4 个以上 ...

  5. 《Mybatis 手撸专栏》第1章:开篇介绍,我要带你撸 Mybatis 啦!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 1. 为甚,撸Mybatis 我就知道,你会忍不住对它下手! 21年带着粉丝伙伴撸了一遍 Sp ...

  6. 5月14日 python学习总结 视图、触发器、事务、存储过程、函数、流程控制、索引

    一.视图 1.什么是视图 视图就是通过查询得到一张虚拟表,然后保存下来,下次用的直接使用即可 2.为什么要用视图 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何用视图 create view t ...

  7. 5月10日 python学习总结 单表查询 和 多表连接查询

    一. 单表查询  一 语法 select distinct 查询字段1,查询字段2,... from 表名 where 分组之前的过滤条件 group by 分组依据 having 分组之后的过滤条件 ...

  8. 4月20日 python学习总结 套接字工作流程

    一.套接字工作流程 一个生活中的场景.你要打电话给一个朋友,先拨号,朋友听到电话铃声后提起电话,这时你和你的朋友就建立起了连接,就可以讲话了.等交流结束,挂断电话结束此次交谈. 生活中的场景就解释了这 ...

  9. 查找goog13的ip

    C:\Users\Deen>ping 172.217.24.14 Pinging 172.217.24.14 with 32 bytes of data: Reply from 172.217. ...

  10. Python 局域网主机存活扫描

    #! python # -*- coding: utf-8 -*- __author__ = 'Deen' import os import threading import argparse # 从 ...