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

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

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

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

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

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

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

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

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

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

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

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

40c9602b162142e3f2c68051e1c8ddcf.png

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

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453615.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring-data-jpa常用方法

转载于:https://www.cnblogs.com/summary-2017/p/7904926.html

Java线程生命周期

当你需要使用Java线程在多线程环境下进行编程时,理解Java的线程周期与线程的状态是非常重要的。通过实现Runnale接口或者继承Thread类,我们可以创建线程,为了启动一个线程,我们需要创建一个Thread对象,并且调用它的sta…

转,JSON解析2

JSON 使用讲解 这篇文章讲解了,JSON的介绍以及使用GSON解析。今天,我们就在Android项目中使用两种方式解析JSON数据。如果你对JSON,还不熟悉,那么请看JSON 使用讲解。 一.搭建服务以及制造JSON数据。 1.服务器选择的Tomcat&#x…

js顺序加载

2019独角兽企业重金招聘Python工程师标准>>> js想要顺序加载&#xff0c;分开js代码块&#xff0c;jsp页面在加载的时候&#xff0c;是顺序加载&#xff0c;遇到<script></script>代码块&#xff0c;先加载完成&#xff0c;然后继续往下&#xff0c;遇到…

2-05 使用固态存储SSD或PCIe卡

在大量并发的情况下&#xff0c;才能体现固态磁盘的吞吐量&#xff0c;在大并发下提供良好随机io的性能&#xff0c;这正是关系型数据库所需要的&#xff0c;相对应机械磁盘&#xff0c;固态磁盘更容易损坏&#xff08;第三点是固态磁盘的缺点&#xff09;&#xff0c;由于固态…

面试问题汇总 精选 分析 解答 职业规划 part 3

《剑指Offer——名企面试官精讲典型编程题》已经出版 非常感谢博客上的读者&#xff0c;是大家的关心、支持和鼓励让我有信心写完这本书并最终出版发行&#xff08; china-pub互动网、 亚马逊卓越网、 淘宝网、 京东网、 当当网上有售&#xff09;。网友们的鼓励让我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入门Dubbo作为一个RPC框架&#xff0c;其最核心的功能就是要实现跨网络的远程调用。本小节就是要创建两个应用&#xff0c;一个作为服务的提供方&#xff0c;一个作为服务的消费方。通过Dubbo来实现服务消费方远程调用服务提供方的方法。4.1 服务提供方开发开发步骤…

轻松获知数据库事务

标题索引事务作用事务流程隔离级别实例验证事务作用事务是确保数据库系统数据的完整性的功能&#xff0c;如现在互联网行业支付业务&#xff0c;不管服务器出于什么原因异常中断&#xff0c;客户要么支付成功要么支付不成功&#xff0c;支付成功数据库金额即会发生变化&#xf…

Safari支不支持HTML5录音? 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。...

先放结论&#xff1a;Safari支不支持HTML5录音&#xff1f; ——据我调查&#xff0c;不支持。 现在浏览器中最好的解决方案是WebRTC下的 navigator.getUserMedia API。 可是当使用Can I use查看兼容性的时候&#xff0c;我发现 不过这个是有历史原因的&#xff0c;我记得RTC是…

面试问题汇总 精选 分析 解答 职业规划 part 4

程序员做业余项目、记笔记和写博客的重要性【经典】 编程是一种创造过程&#xff0c;业余项目允许程序员在没有截止日期或各种限制的条件下&#xff0c;以探索形式编程。业余项目之所以重要&#xff0c;有以下几个原因。 探索新技术 每天都会不断有新技术出现&#xff0c;而…

NB-IOT连接移动onenet平台流程

1. 先创建账号&#xff0c;然后创建产品 2. 创建设备&#xff0c;用ATCGSN和ATCIMI查询NB-IOT的IMEI和IMSI填写上去。 3. 创建好的设备。 转载于:https://www.cnblogs.com/429512065qhq/p/8359247.html

java ejb jsp 架构_JavaEE架构

B/S 体系结构image.pngJava EE 经典架构image.pngJava EE 13规范JDBCimage.pngJDBC 对象与接口java.sql.DriverManager&#xff1a;用于管理JDBC驱动的服务类&#xff0c;当JDBC驱动加载至内存后&#xff0c;DriverManager会自动注册JDBC驱动&#xff0c;然后通过getConnection…

最大开源代码sourceforge 简介 及视音频方面常用的开源代码

所有的音视频凯源代码在这里&#xff1a;http://sourceforge.net/directory/audio-video/os:windows/&#xff0c;你可以下载分析&#xff0c;视频不懂请发邮件给我&#xff0c;帮你分析。 0.视频项目 0.1 VLC media player VLC 多媒体播放器&#xff08;最初为VideoLAN Clien…

notepad编译java_Notepad++直接编译运行java代码的具体步骤

最近不少朋友表示还不会Notepad直接编译运行java代码的操作步骤&#xff0c;使用下面小编就带来了Notepad直接编译运行java代码的操作方法哦&#xff0c;一起去看看吧。Notepad直接编译运行java代码的具体步骤下载Notepad&#xff0c;找到Plugin Manager。插件--->Plugin Ma…

基于linux 的2048

于 debian 接着写 2048, 的影响&#xff0c;如下面的&#xff1a; 感兴趣的朋友能够在这里&#xff08;http://download.csdn.net/download/kamsau/7330933&#xff09;下载。 版权声明&#xff1a;本文博客原创文章&#xff0c;博客&#xff0c;未经同意&#xff0c;不得转载。…

架构师之路

1. 架构师之路(1)---面向过程和面向对象 1、引言 机算机科学是一门应用科学&#xff0c;它的知识体系是典型的倒三角结构&#xff0c;所用的基础知识并不多&#xff0c;只是随着应用领域和方向的不同&#xff0c;产生了很多的分支&#xff0c;所以说编程并不是一件很困难的…

r语言做断轴_R语言用nls做非线性回归以及函数模型的参数估计

非线性回归是在对变量的非线性关系有一定认识前提下&#xff0c;对非线性函数的参数进行最优化的过程&#xff0c;最优化后的参数会使得模型的RSS(残差平方和)达到最小。在R语言中最为常用的非线性回归建模函数是nls&#xff0c;下面以car包中的USPop数据集为例来讲解其用法。数…

day8-异常处理与网络编程

第1章 异常处理 1.1 什么是异常? 1.1.1 描述 #1 什么是异常&#xff1f; # 异常是错误发生的信号&#xff0c;一旦程序出错&#xff0c;就会产生一个异常&#xff0c;应用程序未处理该异常&#xff0c; # 异常便会抛出&#xff0c;程序随之终止 异常就是程序运行时发生错误的信…

进程(并发,并行) join start 进程池 (同步异步)

一、背景知识 顾名思义&#xff0c;进程即正在执行的一个过程。进程是对正在运行程序的一个抽象。进程的概念起源于操作系统&#xff0c;是操作系统最核心的概念&#xff0c;也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的…

xamarin怎么调用java的_XamarinSQLite教程在Xamarin.Android项目中使用数据库

XamarinSQLite教程在Xamarin.Android项目中使用数据库在Xamarin.Android项目中使用预设数据库的具体操作步骤如下&#xff1a;(1)创建一个Xamarin.Android项目&#xff0c;如AndroidSQLiteDemo。(2)在AndroidSQLiteDemo项目的Resources文件夹下创建一个Raw文件夹。(3)将上一节中…