跳转至

Project 1

Start up

参照 Project Zero,学习如何使用 git。

初始代码位于 https://github.com/sqlab-sustech/CS323-Compilers-2025F-Projects,git clone 后,切换到 project1-base 分支,然后创建属于你自己的分支,随后切换到你自己的分支下。

$ git clone https://github.com/sqlab-sustech/CS323-Compilers-2025F-Projects
$ cd CS323-Compilers-2025F-Projects
$ git checkout project1-base
$ git branch -C my-compiler
$ git checkout my-compiler

将该文件夹在 IDEA 中打开,目录结构应如下所示:

alt text

注意: 我们移除了 pom.xml,并且不再使用 Maven 进行依赖配置。

在最左上角的 "CS323-Compilers-2025F-Projects" 处右键,点击 "Open Module Settings" 打开 Project Structure 设置,切换到 Modules -> Dependencies,确认依赖列表中存在 "antlr-4.13.2-complete.jar" 文件。

如果没有,则点击加号添加 JAR libs/antlr-4.13.2-complete.jar

alt text

随后,在 Splc.g4 中加入一条 Lexer Rule:

INT     : 'int';

右键 Splc.g4,打开 "Configure ANTLR":

  • Output Directory: src/main/java
  • Package for the generated code: generated.Splc

设置完成后,在右键菜单中执行 "Generate ANTLR Recognizer",在 src/main/java/generated/Splc 下应该会多出一个 Splc 类。

这时,运行 Main 类,你应该不会遇到 Java 的编译和运行时错误。(ANTLR 会报错,如果你的 Lexer Rules 还不完整)

Splc.g4

在 Project1 中,Splc.g4 的开头第一行是 lexer grammar Splc;,你可能会疑惑为什么这与课上其他例子(如 grammar Calc1;)不符。

这是因为在 Project1 中我们还没有接触到 Parser Rules ,这一行声明表示该文件仅包含 Lexer Rules,ANTLR 也只会生成一个 Lexer 类,并且它直接叫 Splc 而不是 SplcLexer

public class Splc extends Lexer {
    // ...
}

ANTLR JAR & Source Code ZIP

我们在 Project 初始代码中提供了两个文件:libs/antlr-4.13.2-complete.jarlibs/antlr4-4.13.2.zip

前者是 Java 运行时所需的 JAR 包,而后者是 ANTLR 的源代码。

同学们可能会有查看 ANTLR Runtime 里面具体代码的需求;若不携带源代码,IDEA 会调用反编译器对 JAR 包进行反编译;而直接提供源代码 zip 包可以让 IDEA 直接显示源代码,其中携带了更加完整的注释等信息。

方便复制

INT    : 关键字 : int 
CHAR   : 关键字 : char 
STRUCT : 关键字 : struct 
RETURN : 关键字 : return 
IF     : 关键字 : if 
ELSE   : 关键字 : else 
WHILE  : 关键字 : while

ASSIGN: 赋值运算符 = 
PLUS  : 加号 + 
MINUS : 减号 - 
STAR  : 乘号 * 
DIV   : 除号 / 
MOD   : 取模符号 % 
LT    : 小于号 <
LE    : 小于等于号 <=
GT    : 大于号 >
GE    : 大于等于号 >=
EQ    : 等于号 == 
NEQ   : 不等号 !=  
AND   : 逻辑与 &&
OR    : 逻辑或 ||
NOT   : 逻辑非 ! 
INC   : 自增符号 ++ 
DEC   : 自减符号 --
DOT   : 成员访问符 . 
ARROW : 指针访问符 ->
AMP   : 取地址符  &

SEMI  : 分号 ; 
COMMA : 逗号 , 
LPAREN: 左括号 ( 
RPAREN: 右括号 ) 
LBRACE: 左花括号 {
RBRACE: 右花括号 } 
LBRACK: 左方括号 [ 
RBRACK: 右方括号 ]