Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/a1exwang/decaf
Alex's Decaf Compiler
https://github.com/a1exwang/decaf
Last synced: 22 days ago
JSON representation
Alex's Decaf Compiler
- Host: GitHub
- URL: https://github.com/a1exwang/decaf
- Owner: a1exwang
- License: mit
- Created: 2015-10-24T05:38:02.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2015-10-24T06:17:37.000Z (about 9 years ago)
- Last Synced: 2023-03-01T20:37:15.237Z (almost 2 years ago)
- Language: Java
- Homepage:
- Size: 453 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Alex's Decaf Compiler
https://github.com/a1exwang/decaf
## Stage 1: Lexer and Parser### Lexer
需要添加的token有以下, 由于JFlex从上到下依次匹配正则表达式并创建token, 所以应注意, 关键字需要写在identifier之前
"++" { return operator(Parser.INC); }
"--" { return operator(Parser.DEC); }
"|||" { return operator(Parser.GUARD_SEPERATOR); }
"fi" { return keyword(Parser.FI); }
"do" { return keyword(Parser.DO); }
"od" { return keyword(Parser.OD); }
...
同时在Parser中需要添加对应的token常量.### Parser
解决移进冲突主要有两种方式. 一是通过添加语法规则, 二是使用BYACC提供的优先级.
通过阅读代码可以知道, 原来Decaf语言中除了Expr外均使用方法一解决冲突, Expr使用方法二解决
冲突.所以虽然文档中要求了自增操作符等操作符只能和Identifier连用, 但是我们在这里对所有的操作符, 都使用Expr, 而不是Identifier,
这样就可以方便地用优先级来解决冲突, 然后再在以后的语义分析中, 解决非Identifier的Expr和操作符连用的问题.对Parser的修改如下:
1. 添加了一下的语法规则
Expr:...
...
| INC Expr
{
$$.expr = new Tree.Unary(Tree.PREINC, $2.expr, $1.loc);
}
| DEC Expr
...
| NUMINSTANCES '(' IDENTIFIER ')'
{
$$.expr = new Tree.NumInstances($3.ident, $1.loc);
}
...
Stmt:
...
| GuardStmt // 这里GuradStmt既可以是if又可以是while, 这两种共享同一种树节点, 用type来区分
...
// 在这里实现了两种GuardStmt
GuardStmt : IF GuardClauses FI
...
| DO GuardClauses OD
...
// 考虑到两种GuardStmt除了关键字外, 结构是完全相同的, 所以这里统一为GuardClauses
GuardClauses : GuardClauses GUARD_SEPERATOR Expr ':' Stmt
...
| Expr ':' Stmt
...2. 同时在Tree中添加了对应的语法分析树节点类型.
// 在Unary中加入了++和--操作符
// numinstances
public static class NumInstances extends Expr { ... }// 三元操作符, 用来表示 : ?
public static class Ternary extends Expr {
public Expr left;
public Expr middle;
public Expr right;
...
}// Guard语句
public static class GuardClause extends Tree { ... }
public static class Guard extends Tree {
public enum Type {
Condition,
Loop
} // 用来区分Guard语句的类型
Type type;
List clauses; // Guard内部的各个条件语句
...
}3. 下一步备注
1. 检测Expr和Identifier语法正确, 语义不正确的情况