编译器的前端工具(一)

编译器前端工具有很多,比如 Lex(以及 GNU 的版本 Flex)、Yacc(以及 GNU 的版本 Bison)、JavaCC 等等。你可能会问了:“那为什么我学Antlr,不选别的工具呢?”

主要有两个原因:

第一个原因是 Antlr 能支持更广泛的目标语言,包括 Java、C#、JavaScript、Python、Go、C++、Swift。无论你用上面哪种语言,都可以用它生成词法和语法分析的功能。而我们就使用它生成了 Java 语言和 C++ 语言两个版本的代码。

第二个原因是 Antlr 的语法更加简单。它能把类似左递归的一些常见难点在工具中解决,对提升工作效率有很大的帮助。这一点,你会在后面直观地感受到。而我们今天的目标就是了解 Antlr,然后能够使用 Antlr 生成词法分析器语法分析器。在这个过程中,我还会借鉴成熟的词法和语法规则。接下来,我们先来了解一下 Antlr 这个工具。

初识 Antlr

Antlr 是一个开源的工具,支持根据规则文件生成词法分析器语法分析器,它自身是用 Java 实现的。你可以下载 Antlr 工具,并根据说明做好配置。同时,你还需要配置好机器上的 Java 环境(可以在Oracle 官网找到最新版本的 JDK)。因为我用的是 Mac,所以我用 macOS 平台下的软件包管理工具 Homebrew 安装了 Antlr,它可以自动设置好 antlr 和 grun 两个命令(antlr 和 grun 分别是 java org.antlr.v4.Tooljava org.antlr.v4.gui.TestRig 这两个命令的别名)。

这里需要注意的是,你要把 Antlr 的 JAR 文件设置到 CLASSPATH 环境变量中,以便顺利编译所生成的 Java 源代码。GitHub上还有很多供参考的语法规则,你可以下载到本地硬盘随时查阅。

用 Antlr 生成词法分析器

你可能对 Antlr 还不怎么熟悉,所以我先利用之前已经比较熟悉的那些词法规则,让 Antlr 生成一个新的词法分析器,然后再借鉴一些成熟的规则文件,把词法分析器提升到更加专业、实用的级别。

Antlr 通过解析规则文件来生成编译器。规则文件以.g4 结尾,词法规则和语法规则可以放在同一个文件里。不过为了清晰起见,我们还是把它们分成两个文件,先用一个文件编写词法规则。


lexer grammar Hello;  //lexer关键字意味着这是一个词法规则文件,名称是Hello,要与文件名相同

//关键字
If :               'if';
Int :              'int';

//字面量
IntLiteral:        [0-9]+;
StringLiteral:      '"' .*? '"' ;  //字符串字面量

//操作符
AssignmentOP:       '=' ;    
RelationalOP:       '>'|'>='|'<' |'<=' ;    
Star:               '*';
Plus:               '+';
Sharp:              '#';
SemiColon:          ';';
Dot:                '.';
Comm:               ',';
LeftBracket :       '[';
RightBracket:       ']';
LeftBrace:          '{';
RightBrace:         '}';
LeftParen:          '(';
RightParen:         ')';

//标识符
Id :                [a-zA-Z_] ([a-zA-Z_] | [0-9])*;

//空白字符,抛弃
Whitespace:         [ \t]+ -> skip;
Newline:            ( '\r' '\n'?|'\n')-> skip;

很直观地看到,每个词法规则都是大写字母开头,这是 Antlr 对词法规则的约定。

而语法规则是以小写字母开头的。其中,每个规则都是用我们已经了解的正则表达式编写的。接下来,我们来编译词法规则,在终端中输入命令:

antlr Hello.g4

这个命令是让 Antlr 编译规则文件,并生成 Hello.java 文件和其他两个辅助文件。你可以打开看一看文件里面的内容,太累了,后面的有空再写~~~~~~~~

猜你喜欢

转载自blog.csdn.net/weixin_44659309/article/details/106234771