# 基于JAVA实现的Tiger编译器
# 一、项目要求及完成情况
- 正确的词法/语法分析,给出对应的文法文件
- 输出正确的抽象语法树(testcases中50个测试文件,testcase-result中对应的抽象语法树)
- 错误处理功能
- 提示错误类型(词法错误、语法错误、语义错误等)、出错位置等(词法错误,语法错误ANTLR默认行为,部分语义错误:变量作用域及基本类型检查)
- 错误修复(ANTLR默认行为 single-token insertion and single-token deletion)
- 发挥想象力,使编译器尽善尽美(实现了变量作用域检查和基本类型检查)
- Project文档
- 使用语法(文法类型,有无改动语法、如何改动等),错误处理说明等(对实现的变量作用变量作用域检查和基本类型检查的错误处理代码进行了介绍)
- 对本项目语法的使用工具的体会(ANTLR简述部分)
# 二、项目总览
使用ANTLR工具,为Tiger构造一个编译器前端,将输入的Tigger语言转化为抽象语法树,实现了变量作用域检查和简单的Type Checking。
# 三、ANTLR简述
[ANTLR](www.antlr.org)(ANother Tool for language Recognition),作者Terence Parr(University of San Francisco)。
ANTLR是一个可以接受含有语法描述的语言描述符并且生成程序能够识别这些语言所产生的句子。作为一个翻译程序的 一部分,你可以给你的语法附上简单的操作符和行为并且告诉ANTLR如何构造AST并且如何输出它们。ANTLR知道如何使用Java,C++,C#或者Python来生成它们。
注意到词法错误和语法错误ANTLR有默认的处理行为。
> Here is how ANTLR uses those ideas together in a nutshell: parsers perform single-token insertion and single-token deletion upon mismatched token errors if possible. If not, parsers gobble up tokens until they find a token that could reasonably follow the current rule and then return, continuing as if nothing had happened.
>
![](http://www.writebug.com/myres/static/uploads/2021/10/19/e7a45e2824089ea053644ad2bfb3edfe.writebug)
如上图所示,把源文件转化成AST,需要一个Lexer和Parser。Lexer把源文件读入,分成一个个token。然后Parser读入Lexer产生的token生成AST。在ANTLR提供了Lisenter和Visitor两种方式来遍历抽象语法树。本项目利用这些接口来实现变量声明检查。和基本的类型检查。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/f00d6f7ea863af052f8d516af422baa6.writebug)
# 四、AST的生成
ANTLR是一个比较成熟的工具,[The Definitive ANTLR 4 Reference](http://pragprog.com/book/tpantlr2/the-definitive-antlr-4-reference) 详细介绍了工具的使用说明。为了生成AST,需要完成grammer定义文件Tiger.g4 下面定义的语法,基本与[官方语法文档](https://www.lrde.epita.fr/~akim/ccmp/tiger.html)指定的语法相同。 为了简化之后的Type Checking,把Ojbect相关的new class等语法去掉了。
```sh
java org.antlr.v4.Tool Tiger.g4
```
然后会产生TigerLexer.java, TigerParser.java, Tiger.tokens , TiegerLexder.tokens, TigerListener.java, TigerBaseLisetener.java。
其中TigerLexer.java是ANTLR根据g4为我生成的Lexer,TigerParser.java是对应的Parser,TigerListener.java是前面提到的Listener方式的抽象语法树的接口,TigerBaseListener.java是这个接口的一个基本实现。我们的实现通过继承TigerBaseListener来重载中间的放来实现期望的行为。
```sh
java org.antlr.v4.runtime.misc.TestRig Tiger program -tree test.in # 输出文本信息
java org.antlr.v4.runtime.misc.TestRig Tiger program -gui test.in # 生成图形
```
## 4.1 TigerLexer.java节选
```java
// Generated from Tiger.g4 by ANTLR 4.2.1
import org.antlr.v4.runtime.Lexer;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.TokenStream;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.misc.*;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class TigerLexer extends Lexer {
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache();
public static final int T__39=1, T__38=2, T__37=3, T__36=4, T__35=5, T__34=6, T__33=7, T__32=8, T__31=9, T__30=10, T__29=11, T__28=12, T__27=13, T__26=14, T__25=15, T__24=16, T__23=17, T__22=18, T__21=19, T__20=20, T__19=21, T__18=22, T__17=23, T__16=24, T__15=25, T__14=26, T__13=27, T__12=28, T__11=29, T__10=30, T__9=31, T__8=32, T__7=33, T__6=34, T__5=35, T__4=36, T__3=37, T__2=38, T__1=39, T__0=40, INTEGER=41, STRING=42, ID=43, COMMENT=44, LINE_COMMENT=45, WS=46;
public static String[] modeNames = {
"DEFAULT_MODE"
};
...
```
## 4.2 TigerParser.java节选
```java
// Generated from Tiger.g4 by ANTLR 4.2.1
import org.antlr.v4.runtime.atn.*;
import org.antlr.v4.runtime.dfa.DFA;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.misc.*;
import org.antlr.v4.runtime.tree.*;
import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
@SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"})
public class TigerParser extends Parser {
protected static final DFA[] _decisionToDFA;
protected static final PredictionContextCache _sharedContextCache = new PredictionContextCache();
public static final int
T__39=1, T__38=2, T__37=3, T__36=4, T__35=5, T__34=6, T__33=7, T__32=8, T__31=9, T__30=10, T__29=11, T__28=12, T__27=13, T__26=14, T__25=15, T__24=16, T__23=17, T__22=18, T__21=19, T__20=20, T__19=21, T__18=22, T__17=23, T__16=24, T__15=25, T__14=26, T__13=27, T__12=28, T__11=29, T__10=30, T__9=31, T__8=32, T__7=33, T__6=34, T__5=35, T__4=36, T__3=37, T__2=38, T__1=39, T__0=40, INTEGER=41, STRING=42, ID=43, COMMENT=44, LINE_COMMENT=45, WS=46;
public static final String[] tokenNames = {
"<INVALID>", "']'", "'&'", "'in'", "'of'", "','", "'['", "'-'", "'*'", "'while'", "'('", "':'", "'<'", "'<='", "'var'", "'array'", "'nil'", "'to'", "'{'", "'break'", "'let'", "'else'", "'}'", "'do'", "')'", "'function'", "'.'", "'+'", "'for'", "'<>'", "'='", "';'", "'if '", "'>'", "'type'", "':='", "'then'", "'/'", "'>='", "'|'", "'end'", "INTEGER", "STRING", "ID", "COMMENT", "LINE_COMMENT", "WS" };
...
```
## 4.3 Tiger.g4语法文件
```
/**
May,28 2014
author: whimsycwd
compiler project
*/
grammar Tiger;
program : exp
| decs
;
exp : 'nil' #Nil
| INTEGER #Integer
| STRING #String
| type_id '[' exp ']' 'of' exp #Array
| type_id '{' ( ID '=' exp (',' ID '=' exp )* )? '}' #Record
//| 'new' type_id #New
| lvalue #LeftValue
| ID '(' ( exp (',' exp)*)? ')' #Call
| '-' exp #UnaryMinus
| exp ('*' | '/') exp #Mul
| exp ('+' | '-') exp #Add
| exp ('<>' | '=' | '>=' | '<=' | '>' | '<') exp #Cmp
| exp ('&' | '|') exp #Logical
| '(' exps ')' #ParenExprs
| lvalue ':=' exp #Assign
| 'if ' exp 'then' exp ('else' exp)? #IfStmt
| 'while' exp
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
正确的词法/语法分析,给出对应的文法文件 输出正确的抽象语法树(testcases中50个测试文件,testcase-result中对应的抽象语法树) 错误处理功能 提示错误类型(词法错误、语法错误、语义错误等)、出错位置等(词法错误,语法错误ANTLR默认行为,部分语义错误:变量作用域及基本类型检查) 错误修复(ANTLR默认行为 single-token insertion and single-token deletion)
资源推荐
资源详情
资源评论
收起资源包目录
基于JAVA实现的Tiger编译器【100012929】 (219个子文件)
TigerParser.class 20KB
RefPhase.class 8KB
TigerBaseListener.class 8KB
TigerLexer.class 7KB
TigerListener.class 5KB
TigerParser.class 4KB
DefPhase.class 3KB
TigerLexer.class 3KB
CheckSymbols.class 2KB
TigerParser$RecordContext.class 1KB
TigerParser$TyfieldsContext.class 1KB
TigerParser$FuncDecContext.class 1KB
BaseScope.class 1KB
TigerParser$VarDecInnerContext.class 1KB
TigerParser$ForStmtContext.class 1KB
TigerParser$CallContext.class 1KB
TigerParser$ArrayContext.class 1KB
TigerBaseListener.class 1KB
TigerParser$ExpsContext.class 1KB
TigerParser$DecsContext.class 1KB
TigerParser$TyContext.class 1KB
TigerParser$ProgramContext.class 1KB
TigerParser$ArrayContext.class 1KB
TigerParser$WhileStmtContext.class 1KB
TigerParser$TypeDecContext.class 1KB
TigerParser$LogicalContext.class 1KB
TigerParser$IfStmtContext.class 1KB
TigerParser$MulContext.class 1KB
TigerParser$AddContext.class 1KB
TigerParser$CmpContext.class 1KB
TigerParser$DotVarContext.class 1KB
TigerParser$LETContext.class 1KB
TigerParser$BracketVarContext.class 1KB
Symbol.class 1KB
Type.class 1016B
TigerParser$AssignContext.class 1005B
TigerParser$ProgramContext.class 968B
TigerParser$VarDecNothingContext.class 955B
TigerParser$LeftValueContext.class 935B
TigerParser$ParenExprsContext.class 932B
TigerParser$Type_idContext.class 901B
TigerParser$UnaryMinusContext.class 879B
TigerParser$SimpleVarContext.class 872B
TigerParser$IntegerContext.class 858B
TigerParser$StringContext.class 852B
TigerParser$BreakContext.class 679B
TigerParser$NilContext.class 669B
TigerParser$LvalueContext.class 612B
TigerParser$VardecContext.class 611B
TigerParser$ExpContext.class 602B
TigerParser$DecContext.class 602B
TigerListener.class 589B
FunctionSymbol.class 537B
VariableSymbol.class 325B
GlobalScope.class 289B
LocalScope.class 286B
TypeSymbol.class 277B
Scope.class 257B
TypePhase.class 193B
.DS_Store 15KB
.DS_Store 6KB
Tiger.g4 3KB
Tiger.g4 2KB
Tiger.g4 268B
add.in 177B
error.in 94B
test.in 93B
for.in 86B
nil.in 83B
func.in 46B
t.in 16B
t.in0 45B
t.in1 4B
t.in2 85B
t.in3 6B
t.in4 15B
t.in5 77B
antlr-4.2.1-complete.jar 1.24MB
TigerParser.java 45KB
TigerBaseListener.java 11KB
TigerListener.java 10KB
TigerLexer.java 10KB
RefPhase.java 8KB
TigerParser.java 5KB
DefPhase.java 3KB
TigerLexer.java 3KB
CheckSymbols.java 2KB
TigerBaseListener.java 2KB
TypePhase.java 2KB
Symbol.java 1KB
TigerListener.java 947B
BaseScope.java 900B
VariableSymbol.java 667B
FunctionSymbol.java 342B
Scope.java 340B
TypeSymbol.java 225B
GlobalScope.java 174B
LocalScope.java 155B
Type.java 113B
LICENSE 1KB
共 219 条
- 1
- 2
- 3
资源评论
神仙别闹
- 粉丝: 4131
- 资源: 7483
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java开发的日程管理FlexTime应用设计源码
- SM2258XT-BGA144-4BGA180-6L-R1019 三星KLUCG4J1CB B0B1颗粒开盘工具 , EC, 3A, 94, 43, A4, CA 七彩虹SL300这个固件有用
- GJB 5236-2004 军用软件质量度量
- 30天开发操作系统 第 8 天 - 鼠标控制与切换32模式
- spice vd interface接口
- 安装Git时遇到找不到`/dev/null`的问题
- 标量(scalar)、向量(vector)、矩阵(matrix)、数组(array)等概念的深入理解与运用
- 数值计算复习内容,涵盖多种方法,内容为gpt生成
- 标量(scalar)、向量(vector)、矩阵(matrix)、数组(array)等概念的深入理解与运用
- 网络综合项目实验12.19
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功