博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
从零开始写个编译器吧 - tao 语言的文法定义(下)
阅读量:5973 次
发布时间:2019-06-19

本文共 1882 字,大约阅读时间需要 6 分钟。

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

|- 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
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
banList = new ArrayList<>();NonTerminalSymbol ban(TerminalSymbol...args) { for(TerminalSymbol node:args) { banList.add(node); } return this;}

这个方法可以纪录被 ban 掉的一组非终结符,纪录这些东西有什么用,将在随后的章节介绍。

转载地址:http://eddox.baihongyu.com/

你可能感兴趣的文章
Linux下Python设置vim和交互模式下自动补全
查看>>
阿里巴巴开源项目:分布式数据库同步系统otter(解决中美异地机房)
查看>>
测试mysql绑定变量功能
查看>>
常见路由命令
查看>>
go的错误处理
查看>>
apache2.4.4的安装过程
查看>>
php5.3安装oracle的扩展oci8与pdo_oci
查看>>
Java多线程
查看>>
发送超长短信的协议格式
查看>>
A query was run and no Result Maps were found for the Mapped Statement
查看>>
摆正测试员在软件项目中的位置
查看>>
Bambook 稍后阅读 V1.01 发布
查看>>
安装第三方库出现 Python version 2.7 required, which was not found in the registry
查看>>
【Quartz】Integration with Spring
查看>>
f5课堂:云计算和虚拟化助力灾难恢复
查看>>
老五视角:***频来袭 关注与计算安全与保障
查看>>
小结:Windows Phone 理念、界面、配置、应用
查看>>
js获取<s:radio>的值
查看>>
我的友情链接
查看>>
Windows 2003sp2 AD到Windows 2008R2 AD的升级
查看>>