目前为止我们创建的文件列表:

|- 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 语言的文法定义(下)相关推荐

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

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

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

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

  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. mysql c测试程序_Linux平台下从零开始写一个C语言访问MySQL的测试程序

    Linux 平台下从零开始写一个 C 语言访问 MySQL 的测试程序 2010-8-20 Hu Dennis Chengdu 前置条件: (1) Linux 已经安装好 mysql 数据库: (2) ...

  7. 一步一步教你从零开始写C语言链表(超详细)

    STM32 HAL开发完全指南 写文章 一步一步教你从零开始写C语言链表(超详细) 杨源鑫 嵌入式系统工程师.物联网创业合伙人,业务经理兼产品经理 285 人赞同了该文章 为什么要学习链表? 链表主要 ...

  8. rust 手动关闭子线程_从零开始写 OS (9) —— 内核线程

    上一篇 小源:从零开始写 OS (8) -- 创建页表​zhuanlan.zhihu.com 本章代码对应 commit :de86ae6e1e8bdfe3388530f82b2081fe29e40b ...

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

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

最新文章

  1. C++中模块(Dll)对外暴露接口的方式
  2. python中的EVAL函数的定义和用法!
  3. Nature封面:人类还在看提词器,AI的辩论能力却出现了重大进展
  4. 一个数字可以在不损失精度的情况下达到的JavaScript的最高整数值是多少?
  5. 与 Josh Bloch 探讨 Java 未来
  6. 【Android应用开发】分享一个录制 Android 屏幕 gif 格式的小技巧
  7. docker mysql镜像连接不上_Mysql安装-Docker版
  8. Hacker:编写高级语言脚本可破解各个云盘的下载速度限制
  9. python去除数组缺失值_动态数组的应用,VBA中如何利用动态数组去除重复值的第二讲...
  10. 一段java并发编程代码
  11. 在Angular单个的单元测试里,调用多次detectChange,会重复执行ngAfterViewInit hook吗
  12. FLEX APIs、Libs、Components
  13. 求n的阶乘java_Java 求n的阶乘
  14. 贪心 区间覆盖最小值
  15. SQLServer的本月统计和本周统计
  16. SAP MM 用客户寄售库存管理方式来管理周转箱等可回收物料
  17. RGB色彩模式划分为0~255,是按照什么标准进行划分的?
  18. php可以发短信的代码,php实现短信发送代码
  19. ubuntu yah3c 自动认证可执行脚本
  20. SAP ABAP 数据字典教程 SE11:表、锁定对象、视图和结构 -03

热门文章

  1. Python操作MySQL(二) ORM篇
  2. 存储网络与存储系统架构分析
  3. 神奇的仙丹,性感的Elixir
  4. Win10系列:JavaScript动画3
  5. 生成32位字母数字的随机数
  6. Velocity 语法学习
  7. jeecms v3.x标签教程之[@cms_comment_page]
  8. 将字符串转换成System.Drawing.Color类型
  9. 20060516: 实现圆角div效果
  10. AJPFX关于JDK,JRE,JVM的区别与联系