# zero-compiler **Repository Path**: idlezero/zero-compiler ## Basic Information - **Project Name**: zero-compiler - **Description**: No description available - **Primary Language**: Java - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-06 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [TOC] # 编译原理 ## 环境介绍 开发语言使用的是 java 语言,纯属是在下初学编译原理写的试验代码,在下编写这个程序时候使用的 jdk 版本是 openjdk11。 项目中使用了 java8 的特性,因此 jdk8 版本小于 8 的将无法运行此程序。 ## 目录结构 + src * zero - lex - parser - semantic - util + lib 其中src是源代码目录,lex包是和词法有关的部分,parser是语法分析有关的部分,semantic是语义分析有关的部分,util是工具类,里面有判断两个List方法是否相同的相关代码。lib目录保存了第三方的jar包,这部分jar包是用于生成excel文件的,由于SRL(1)分析法生成的goto表和action表太大,用excel保存更方便阅读和debug。 此外,项目的根目录下还有一些文本文件,这部分包括了文法的定义,单词表的定义,以及被分析的代码。其中可以在parser包下的Parser类的静态变量中指定保存文法的文件,在lex的相关类的静态成员中指定单词表文件。 ## 说明(必看) - 请注意 lib 目录下的包,在 IDE 中导入它们,由于 Parser 类中有输出到 excel 的操作,因此请检查 jar 包是否导入以及检查对应操作的路径,这个路径写在了在输出 action 和 goto 表的对应方法中。 - 测试样例所在的文件时 ` test1.txt` 。 - 产生式中的各个元素用空格隔开,箭头用 `@` 表示,参考已有的 `production1.txt` 样例,支持中文。在产生式最前面加上 `//` 即可注释掉这个产生式。 - 在 first 和 follow 集中用 $ 来表示 Eplison。 - 每个项目规范集 ItemSet 都保存了一个哈希map `Map goMap` 用于保存跳转的信息,key表示触发的变量或者终结符,value保存的是下一个状态(即下一个项目规范集的引用)。 - first集,fellow集,goto表和action表,以及求解他们的方法请看 `slr` 包下的 `Parser` 类的成员属性和成员方法。 - 项目规范集族或者状态机的构建请看 slr 包下的 `ItemSetFamily` 类中的方法。 - 在运行语法分析的时候,往从词法分析得到的token序列的末尾插入了 `#` 作为语法分析的哨兵,这个在action表中触发状态跳转的元素中也有这个符号。其目的是防止 S' -> S. 这种最后一步的小圆点在最后一个位置时移进造成的数组越界(这个在最后一步规约成拓广文法的开始符号的时候会出现这种情况)。 - 词法分析与语义分析,请再对应的包下面查找代码。