从零开始写个编译器吧 - tao 语言的文法定义(下)
目前为止我们创建的文件列表:
|- com.taozeyu.taolan.analysis|- FirstSetConstructor|- LexicalAnalysis|- LexicalAnalysisException|- NonTerminalSymbol|- SignParser|- SyntacticDefine[新]|- TerminalSymbol|- Token
上一章中我们提到了 4 个方法:
node
token
or
sign
它们可以用来描述非终结符和展开式的形式,那么它们又是如何工作的呢?
SyntacticDefine.java 文件中定义了一些 static 方法。static NonTerminalSymbol getNonTerminalSymbol(Exp exp) {return expContainer.get(exp);}private static NonTerminalSymbol node(Exp exp) {return new NonTerminalSymbol(exp);}private static NonTerminalSymbol node() {return new NonTerminalSymbol(null);}private static TerminalSymbol token(Type type, String value) {return new TerminalSymbol(type, value);}private static TerminalSymbol token(Type type) {return new TerminalSymbol(type, null);}
可以看出,这些方法只是稍微封装了一下,具体还要继续追踪 TerminalSymbol.java 和 NotTerminalySymbol.java。
先看看 TerminalSymbol.java 的相关代码:
public final Type type;
public final String value;
final boolean careValue;
TerminalSymbol(Type type, String value) {this.type = type;this.value = value;this.careValue = careValueTypeSet.contains(type);
}
原来只是直接保存成变量罢了。
再看 NotTerminalySymbol.java 的相关代码:
final Exp exp;
Character sign = null;
final ArrayList<Object[]> expansionList = new ArrayList<>();
定义了这些成员变量,其中 expansionList 代表展开式,它由一组 Object[] 组成。
NonTerminalSymbol(Exp exp) {this.exp = exp;
}
NonTerminalSymbol or(Object...args) {expansionList.add(args);return this;
}
NonTerminalSymbol sign(char sign) {this.sign = sign;return this;
}
NotTerminalySymbol 也是把这些定义的东西保存起来,只不过每个方法返回 this,因此允许我连续调用这些方法。
特别的,注意如下代码:
final ArrayList<TerminalSymbol> banList = new ArrayList<>();
NonTerminalSymbol ban(TerminalSymbol...args) {for(TerminalSymbol node:args) {banList.add(node);}return this;
}
这个方法可以纪录被 ban 掉的一组非终结符,纪录这些东西有什么用,将在随后的章节介绍。
从零开始写个编译器吧 - tao 语言的文法定义(下)相关推荐
- 自己写编译器词法分析c语言,从零开始写个编译器吧 - 开始写词法分析器(3)...
上周周末旅游去了,就没更新了,虽然回到海拔0m的地区,不过目前似乎还在缺氧,所以本次就少更点吧. 这章将结束词法分析的部分. 在之前的章节(第7章从零开始写个编译器吧 - 开始写词法分析器(1))中我 ...
- 编译器入门 语法分析器 java_从零开始写个编译器吧 - Parser 语法分析器
Parser(语法分析器)的编写相对于 Tokenizer (词法分析器)要复杂得多,因此,在编写之前可能也会铺垫得更多一些.当然,本系列旨在"写出"一个编译器,所以理论方面只会简 ...
- 从零开始写个编译器吧 - 程序流控制
目前为止我们创建的文件列表: |- com.taozeyu.taolan.analysis|- FirstSetConstructor|- LexicalAnalysis|- LexicalAnaly ...
- 从零开始写个编译器吧 - 单词化简述(Tokenization)
2019独角兽企业重金招聘Python工程师标准>>> 实际上,所谓的源代码,我们可以将其视为一段长长的字符串.所谓字符串,即是字符的有序集.但是,字符本身作为编译器的输入单位,粒度 ...
- Java终结符_从零开始写个编译器吧 - TerminalSymbol.java 与 NonTerminalSymbol.java
首先是 TerminalSymbol.java 即终结符. package com.taozeyu.taolan.analysis; import java.util.HashSet; import ...
- mysql c测试程序_Linux平台下从零开始写一个C语言访问MySQL的测试程序
Linux 平台下从零开始写一个 C 语言访问 MySQL 的测试程序 2010-8-20 Hu Dennis Chengdu 前置条件: (1) Linux 已经安装好 mysql 数据库: (2) ...
- 一步一步教你从零开始写C语言链表(超详细)
STM32 HAL开发完全指南 写文章 一步一步教你从零开始写C语言链表(超详细) 杨源鑫 嵌入式系统工程师.物联网创业合伙人,业务经理兼产品经理 285 人赞同了该文章 为什么要学习链表? 链表主要 ...
- rust 手动关闭子线程_从零开始写 OS (9) —— 内核线程
上一篇 小源:从零开始写 OS (8) -- 创建页表zhuanlan.zhihu.com 本章代码对应 commit :de86ae6e1e8bdfe3388530f82b2081fe29e40b ...
- 学了编译原理能否用 Java 写一个编译器或解释器?
16 个回答 默认排序 RednaxelaFX JavaScript.编译原理.编程 等 7 个话题的优秀回答者 282 人赞同了该回答 能.我一开始学编译原理的时候就是用Java写了好多小编译器和 ...
最新文章
- C++中模块(Dll)对外暴露接口的方式
- python中的EVAL函数的定义和用法!
- Nature封面:人类还在看提词器,AI的辩论能力却出现了重大进展
- 一个数字可以在不损失精度的情况下达到的JavaScript的最高整数值是多少?
- 与 Josh Bloch 探讨 Java 未来
- 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
- docker mysql镜像连接不上_Mysql安装-Docker版
- Hacker:编写高级语言脚本可破解各个云盘的下载速度限制
- python去除数组缺失值_动态数组的应用,VBA中如何利用动态数组去除重复值的第二讲...
- 一段java并发编程代码
- 在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗
- FLEX APIs、Libs、Components
- 求n的阶乘java_Java 求n的阶乘
- 贪心 区间覆盖最小值
- SQLServer的本月统计和本周统计
- SAP MM 用客户寄售库存管理方式来管理周转箱等可回收物料
- RGB色彩模式划分为0~255,是按照什么标准进行划分的?
- php可以发短信的代码,php实现短信发送代码
- ubuntu yah3c 自动认证可执行脚本
- SAP ABAP 数据字典教程 SE11:表、锁定对象、视图和结构 -03