ANTLR4开发实用操作(一):文件读入

前言

ANTLR是一款强大的语言解析工具,包含语法分析器、词法分析器等。可以用来实现语言解析器、编译器、配置文件读取器等等。也可以用来实现自己的编程语言。感谢Terence Parr教授多年研究的成果,为语言开发进行了大量的基础工作。关于ANTLR的介绍网上不少,但以简单范例居多,antlr内部复杂的原理、部件、逻辑关系等信息非常少。
由于在工作中需要进行一款解释器开发,虽然看完了两本教程,但结合到自己的实际场景开发,还是有些瞎子摸象的困惑。经过不断的摸索、爬坑,积累了一点经验,实在是感觉艰辛,故作此文,如能对广大朋友们有所帮助,也便不枉费了我的艰苦投入。

版本及工具准备

现在antlr的最新版是4.7.2。可以从https://github.com/antlr/antlr4 下载到源代码和工具包。
开发我用的是visual studio 2019 community,安装了跨平台,支持linux开发。
开发语言C++。
远程环境ubuntu 16.04.6 LTS。
由于我用了C++语言,需要配置antlr生成C++源代码,这里用github上的命令,做成sh脚本即可。

#!/bin/bash
set -o errexit
java -cp $CLASSPATH org.antlr.v4.Tool -Dlanguage=Cpp -listener -visitor -o generated/ -package antlrCplr XLexer.g4 XParser.g4

脚本参数-Dlanguage=Cpp指定生成cpp源文件,-o generated/指定生成的源文件都放在当前目录的子目录generated底下。如果没有目录,则会创建目录。 -package antlrCplr 指将生成的类打包放在命名空间antlrCplr 中。
生成成功后,大概是这样

在这里插入图片描述
在这里插入图片描述

信息输入

环境配置什么的,其实应该单独写一篇的,还有很多很多配置,挺麻烦的。扯得有点远了。。。言归正传。
antlr可以解析文法,肯定是需要输入才能解析的。antlr提供了多种输入方式,可以直接输入字符串,也可以读文件。
先来两个样例:

字符串输入

ANTLRInputStream input(u8"? = ? + \"?\";(((x * π))) * µ + ∰; a + (x * (y ? 0 : 1) + z);");

文件流输入

std::istream iss(&in);
ANTLRInputStream input(iss);

可以看出,antlr使用了一个类ANTLRInputStream 来进行文本输入。

ANTLRInputStream

位于runtime/src/ANTLRInputStream.h中,定义为

class ANTLR4CPP_PUBLIC ANTLRInputStream : public CharStream

该类拥有3个构造函数,分别是

    ANTLRInputStream(const std::string &input = "");
    ANTLRInputStream(const char data_[], size_t numberOfActualCharsInArray);
    ANTLRInputStream(std::istream &stream);

可以接受字符串类型、字节数组类型、输入流类型的方式。如果采用输入流方式,这个类内部将其转换为字符串进行处理。

    virtual void load(const std::string &input);
    virtual void load(std::istream &stream);

load函数也有2个实现,输入流转换为字符串,就是在这里实现的。第二个函数会调用第一个函数,将输入字符/文本存储在类内部的变量UTF32String _data;中。

这个流的实例,会给词法分析器的作为输入,词法分析器在此基础上,解析词法流。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ANTLR(全名为ANother Tool for Language Recognition)是一个用于构建语法分析器的工具,它支持多种编程语言,包括C++。在使用ANTLR时,可以通过编写ANTLR语法规则来描述待编译语言的语法结构,并生成对应的解析器代码。 首先,需要安装ANTLR工具,并确保已经安装了支持C++的开发环境。接下来,我们可以编写ANTLR语法规则,定义待编译语言的词法和语法,并使用ANTLR生成相应的解析器代码。 ANTLR语法规则使用一种类似BNF的语法,可以定义终结符和非终结符,以及它们之间的关系和动作。例如,可以定义如下的ANTLR语法规则来描述一个简单的算术表达式的语法: ``` grammar SimpleExpression; compilationUnit: expression EOF; expression: term ( '+' term | '-' term )*; term: factor ( '*' factor | '/' factor )*; factor: NUMBER | '(' expression ')' ; NUMBER: [0-9]+; WS: [ \r\n\t]+ -> skip; ``` 然后,使用ANTLR工具生成C++的解析器代码。可以通过以下命令来生成解析器代码: ``` antlr4 -Dlanguage=Cpp SimpleExpression.g4 ``` 生成的C++解析器代码可以包含解析树或抽象语法树的构造和遍历方法,以及对应的语义动作等。生成的解析器代码可以被包含在项目中,可以通过调用相应的解析方法来解析输入的待编译代码。 使用生成的解析器代码,可以构建一个完整的编译器,包括词法分析、语法分析、语义分析和代码生成等步骤。可以根据具体的需求,逐步完善编译器的功能。 总之,使用ANTLR4和C++可以开发一个编译器,通过定义语法规则和生成解析器代码,实现对待编译语言的词法和语法分析,并可以进一步扩展和完善编译器的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值