Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多,因此,在编写之前可能也会铺垫得更多一些。当然,本系列旨在“写出”一个编译器,所以理论方面只会简单介绍 tao 语言所涉及的部分。

之前的几章中,我纯手写了tao 语言的 Tokenizer。但如果我准备也纯手写一个 Parser,那将是非常麻烦且繁琐的一件事情。实际上,就在在写出这篇文章之前,我已完成了 Parser 的编写,并测试妥当,因此我可以在此面对各位得出这个结论。

我将使用这么一种方式“制造”出 Parser:

将 tao 语言的所有语法细节描述出来,即定义 tao 语言。

写一个能”根据定义,生成 tao 语言的 Parser“的程序。

如果以上描述有些让人困惑,那我举个通俗点的例子吧:

假如我想要制作一双鞋子,通常的方案是,我会买好材料,并把鞋子做出来。但还有另一种方案,我先画出鞋子的设计图,再造一台能依照设计图造出鞋子的机器,然后把设计图交给机器,再发动机器,得到鞋子。

在”制造鞋子的世界“中,除非我要开鞋厂,否则若我仅仅想造双鞋子,那么前一个方案显然更好。但在”制造编译器的世界“中,却与直觉相反,当语言本身足够复杂的时候,后一种方案比前一种方案要方便得多。

至此,我需要一个能读懂 tao 语言的定义,并根据定义生成 Parser 的一个程序。这种程序我们称之为 Compiler-compiler 。这样的程序(或称工具)有很多现成的可供选择(包括在 Java 平台上可用的),但既然我这个系列叫做《从零开始写个编译器吧》,那显然如果我用现成的工具,那是犯规行为。

因此,我还要写一个 Compiler-compiler 出来才行。

那么,让我先贴一张图,以描述我将会写出的 Compiler-compiler 的工作原理吧。

Compiler-compiler 会将 tao 语言的定义编译成某种数据结构,而这种数据结构是 Parser 初始化的参数。Parser 只有获得了这种数据结构才能正常工作。

当 Parser 初始化之后,它会读取 Tokenizer 生成的 Token 序列,并同时通过解释 Compiler-compiler 生成的数据结构,最后生成 Syntax Tree。

至此,在编写 Parser 的章节中,我必须完成如下三个任务。

定义 tao 语言的语法细节,并挑选一个合适的形式描述出来。

编写一个 Compiler-compiler,它能编译 tao 语言的定义,并生成某种数据结构。

编写一个 Parser,它通过解释 Compiler-compiler 生成的数据结构,将 Token 序列编译成 Syntax Tree。

编译器入门 语法分析器 java_从零开始写个编译器吧 - Parser 语法分析器相关推荐

  1. 自己写编译器词法分析c语言,从零开始写个编译器吧 - 开始写词法分析器(3)...

    上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧. 这章将结束词法分析的部分. 在之前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我 ...

  2. python 神经网络工具_神经网络15分钟入门!使用python从零开始写一个两层神经网络...

    本篇是该系列的第三篇,建议在阅读本篇文章之前先看前两篇文章. 在本文中将使用python实现之前描述的两层神经网络,并完成所提出的"象限分类"的问题. 需要注意的是,虽然标题叫做神 ...

  3. 从零开始写个编译器吧 - 程序流控制

    目前为止我们创建的文件列表: |- com.taozeyu.taolan.analysis|- FirstSetConstructor|- LexicalAnalysis|- LexicalAnaly ...

  4. 从零开始写个编译器吧 - 单词化简述(Tokenization)

    2019独角兽企业重金招聘Python工程师标准>>> 实际上,所谓的源代码,我们可以将其视为一段长长的字符串.所谓字符串,即是字符的有序集.但是,字符本身作为编译器的输入单位,粒度 ...

  5. Java终结符_从零开始写个编译器吧 - TerminalSymbol.java 与 NonTerminalSymbol.java

    首先是 TerminalSymbol.java 即终结符. package com.taozeyu.taolan.analysis; import java.util.HashSet; import ...

  6. 从零开始写个编译器吧 - tao 语言的文法定义(下)

    目前为止我们创建的文件列表: |- com.taozeyu.taolan.analysis|- FirstSetConstructor|- LexicalAnalysis|- LexicalAnaly ...

  7. 动手写的Python的HTML语法分析器(面向对象)

    动手写的Python的HTML语法分析器(面向对象) 主要包括4个文件,util.py文件主要负责截取每个块. rules.py文件定义两个类,超类Rule和分别对应的子类,子类定义了不同的划分块的要 ...

  8. java的lr语法编译器,编译器开发--- 自己动手用Java写编译器

    课程目录 1.用java实现一个简易编译器1-词法解析入门.mp4 2.用java实现一个简易编译器2-语法解析.mp4 3.语法解析改进及代码生成.mp4 4.输入系统及分词系统概述.mp4 5.输 ...

  9. 学了编译原理能否用 Java 写一个编译器或解释器?

    16 个回答 默认排序​ RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...

最新文章

  1. 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
  2. C#中DataTable添加外部行数据
  3. Java-利用Spring提供的Resource/ResourceLoader接口操作资源文件
  4. 数学建模国赛 常考赛题类型(模拟退火算法、粒子群算法、遗传算法)
  5. golang 数组 最后一个_Golang 速览
  6. 删除 索引 外键 mysql_MySQL无法删除外键约束中所需的索引
  7. crntos7启动php命令_CentOS7设置php-fpm开机自启动
  8. 第七十四期:国内SaaS企业终于活成了自己讨厌的样子!
  9. Linux系统间文件双向同步搭建Unison版
  10. TIME_WAIT太多解决思路和方法
  11. Unity AssetBundle 爬坑手记
  12. 用create table 命令建立表
  13. VS2019 配置OpenGL
  14. c语言调用数学函数根号,不调用库函数求根号x的计算方法(二分/三分/牛顿迭代法)...
  15. Hello JSP!——指令元素之page篇(最后有疑问求解,感激不尽)
  16. JAVA毕设项目基于vue框架的疫情防控知识在线答题系统设计与实现(java+VUE+Mybatis+Maven+Mysql)
  17. 方框加对勾怎么输入_word里如何往方框中加对号?带方框的对号怎么弄,原来是这样的...
  18. 【平衡二叉樹】超市促銷
  19. 【C语言】定义一个函数,求长方体的体积
  20. 分享一种简易的直流电机正反转限位电路

热门文章

  1. Java中 List、Set、Map遍历方式以及性能比较
  2. Android在代码中设置drawableLeft(Right/Top/Bottom)
  3. 男女之间应该保留多少隐私
  4. 第二十一届国际C语言混乱代码大赛结果公布
  5. C语言目录操作 (Linux/Unix)
  6. OpenGL开发库的详细介绍
  7. 解决:Caused by: java.lang.UnsupportedOperationException: null
  8. SHT知识库操作要点
  9. P4718 【模板】Pollard-Rho算法
  10. 1566:基础练习 十六进制转八进制