`

ANTLR学习笔记一:概念理解

阅读更多

 

ANTLR学习笔记一:概念理解

 

一、什么是ANTLR。

ANTLR是ANother Tool for Language Recognition的缩写,

意为“另一种语言识别工具”,读作Antler。

它是一种解析器程序的代码生成器(作用类似于YACC),

使用LL(*)方法,即从输入字符串的左到右,

用候选项的最左符号匹配输入(即与所有以终结符开头的候选项匹配),

每次向前(右)看n个符号(好像计算机下棋那样)。

 

二、ANTLR的特点

ANTLR作为一种编译器的制作工具,具有很多有用的功能和特点。

1. 使用语法(.g文件)作为输入,生成语言识别器的代码。

2. 支持生成各种语言的代码(只需修改与实现语言相关的部分)。

3. 自身用Java实现。

4. 使用上下文无关语法。

(即语法的所有产生式/规则的左侧总是非终结符,

简单说就是,一个被识别的非终结符无论放在什么地方,

都可以用已有的方式推导)

5. 语法基于EBNF(扩展的巴科斯范式)。

这意味着,在ANTLR中既可以使用BNF元语言符号

冒号(:)表示推导,

竖线(|)表示或,

也可以使用扩展的元语言符号如

星号(*)表示出现0次或以上。

问号(?)表示出现0次或1次。

加号(+)表示出现1次或以上。

关于EBNF更多介绍可以参考这里:

http://hi.baidu.com/helloweenpad/blog/item/f5b6f701a2694e16738b655e.html

6. 可以生成多种解析器(通过标注来指定),包括:

文法解析器(常用于把符号保存为AST的非线性结构中)。

词法解析器(把输入切割成线性结构的符号)。

树解析器(输入是树结构数据,即AST,抽象语法树)。

组合词法解析器(文法和词法解析同时进行)。

它比同类工具更易于使用。

7. 如果不嵌入源代码,所生成的代码将只检查输入是否可以被识别(即语法检查)。

如果嵌入源代码,可以对识别的语法元素执行相应的动作。

利用嵌入的代码可以获取符号表或中间语言指令(即解析器或编译器)。

8. 丰富的参考资料。官方收集了很多语法源文件。

见http://www.antlr.org/grammar/list

9. 有相关的辅助开发工具和Eclipse插件。

10. 更详细请参考官方网站

http://www.antlr.org/

或英文wiki

http://en.wikipedia.org/wiki/ANTLR

 

三、什么是上下文无关语法和巴科斯范式

ANTLR的语法是基于EBNF的上下文无关语法。

在形式语言的范畴中,上下文无关语法是较弱的文法

(有些语法可以被上下文相关语法描述,

但不能被上下文无关语法描述)。

另外还有更弱的右线性文法(即正则语法)

由于这些特点,普遍使用上下文无关语法来编写计算机语言的

文法解析器(即递归推导),

用更弱的正则语法编写词法解析器来切割符号(即非递归推导)。

在形式上上下文无关语法被写成四元式,即

终结符集合、非终结符集合、(单个)开始符、产生式集合(有限)。

其中非终结符表示可以再分的语法元素,用大写字母表示;

终结符表示不可以再分的元素,用小写字母表示

(有时可以直接写出终结符的字符串内容,或用引号引用,如用-或"-"直接表示减号)

开始符属于非终结符,表示语法推导的开始,一般用S表示。

产生式表示一系列的可选择推导(一般右边个数比左边的个数多)

如果多个产生式的左边相同,可以用竖线(|)合并为一条产生式,

合并后用或分割的符号称为候选式。

巴科斯范式是上下文无关语法的描述语言。

通常只列出产生式和开始符S。

在ANTLR中(习惯上?)词法符号用全大写,文法符号用全小写,

开始符一般放在开头(开始符会变成public方法,被外部程序调用)。

作为终结符的运算符可以用单引号引用,直接写在产生式右边。

 

四、什么是LL(k)

一种递归下降的分析方法。

第一个L表示从左往右。

第二个L表示最左匹配。

k表示向前看k个符号。

所谓向前看,是指向右看k个符号的内容,但不读入。


分享到:
评论
1 楼 ggwang 2014-10-27  
总结得很简练清晰啊,学习了!

相关推荐

    The Definitive ANTLR4Reference 学习笔记

    The Definitive ANTLR4Reference 学习笔记 The Definitive ANTLR4Reference 学习笔记

    antlr-2.7.7.jar.zip

    标签:antlr-2.7.7.jar.zip,antlr,2.7.7,jar.zip包下载,依赖包

    antlr4-runtime-4.2-API文档-中文版.zip

    Maven坐标:org.antlr:antlr4-runtime:4.2; 标签:antlr、antlr4、runtime、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    The+Definitive+ANTLR+4+Reference 学习笔记word

    The+Definitive+ANTLR+4+Reference 学习笔记word The+Definitive+ANTLR+4+Reference 学习笔记word

    antlr4-runtime-4.7-API文档-中文版.zip

    Maven坐标:org.antlr:antlr4-runtime:4.7; 标签:antlr、runtime、antlr4、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的...

    antlr-2.7.7.jar

    antlr-2.7.7

    antlr-3.5-API文档-中文版.zip

    Maven坐标:org.antlr:antlr:3.5; 标签:antlr、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和...

    antlr4-runtime-4.7-API文档-中英对照版.zip

    Maven坐标:org.antlr:antlr4-runtime:4.7; 标签:antlr、runtime、antlr4、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译...

    antlr4-calculator:ANTLR4计算器示例和说明

    ANTLR4计算器示例ANTLR4计算器示例和解释我该如何设置? 该项目使用Java 11,但是如果需要可以在pom.xml进行更改使用Maven安装软件包(请参阅pom.xml ) 这会通过ANTLR4自动生成所需的类要基于语法手动更新/重新生成...

    antlr4读书笔记七八章

    antlr4读书笔记七八章,antlr4读书笔记七八章,antlr4读书笔记七八章

    antlr4-solidity:优化的antlr4

    通常,由于以下一个或多个原因,这些功能未包含在参考版本中。 实现的复杂性:优化后的fork的许多功能是为了满足将ANTLR 4用于大规模商业应用过程中发现的特定问题而开发的。 在某些情况下,该功能的实现极其复杂...

    antlr4-tool:具有完整TypeScript支持的有用的Antlr4工具

    antlr4-工具总览该项目的目的和意图是为 JavaScript目标创建并生成Typescript声明文件。 允许生成的具有完整ES5浏览器支持的Antlr解析器和词法分析器。 如果需要,此工具还允许纯JavaScript实现。要求Java Runtime ...

    antlr-3.5-API文档-中英对照版.zip

    Maven坐标:org.antlr:antlr:3.5; 标签:antlr、jar包、java、API文档、中英对照版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持...

    gradle-antlr4-plugin:Gradle插件添加了对ANTLR4的支持

    ANTLR4 Gradle插件这是一个Gradle插件,为Gradle添加了对ANTLR4的支持。 我知道已经有一些声称可以做到这一点的插件,但是,我对此并不满意。 现有的插件有一些我想念的功能: 正确放置生成的源文件。 src/main/...

    antlr4-calculator:简单的antlr4计算器

    生成ANTLR文件antlr4 Calculator.g4 -no-listener -visitor -o app 复制访客实现cp *.java app 编译javac app/*.java 跑 输入控制台cd app && java Run a = 1+2 b = a^2 c = a + b * (a - 1) a + b + c 结果应...

    antlrcs, ANTLR 3 StringTemplate 3和 StringTemplate 4的C# 端口.zip

    antlrcs, ANTLR 3 StringTemplate 3和 StringTemplate 4的C# 端口 ANTLR 3 C# 目标 这里知识库包含 3个主要项目的C# 版本,其中有些项目具有多个生成构件:ANTLR 3Antlr3: ANTLR 3的代码生成器Antlr3.Runtime: ANTLR...

    antlr-runtime-3.4-API文档-中文版.zip

    Maven坐标:org.antlr:antlr-runtime:3.4; 标签:antlr、runtime、jar包、java、API文档、中文版; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码...

    antlr4-c3:基于ANTLR4的语法分析器的语法不可知代码完成引擎

    抽象的在过去的几年中,已经有很多要求获得ANTLR的支持以创建代码完成实现的请求,但是到目前为止,这已成为一项仅具有自定义解决方案的孤立任务。 该库旨在以更通用的方式为代码完成实现提供通用的基础结构,以便...

    antlr-runtime-3.5-API文档-中文版.zip

    Maven坐标:org.antlr:antlr-runtime:3.5; 标签:antlr、runtime、jar包、java、中文文档; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构...

    antlr4-cpp:ANTLR 4 的 C++ 目标,包括模板和运行时

    ANTLR 4 的实验性 C++ 14 目标 这个 ANTLR 4 目标是一个非常早期的正在进行中的工作,最初创建用于学习和实践 C++ 11 和 14 中的新功能的开发。开发过程尚未确定,但我们欢迎来自社区的任何意见时间。构建状态操作...

Global site tag (gtag.js) - Google Analytics