antlr4学习笔记1-语法结构
2014-11-14 15:36
387 查看
antlr的语法结构如下
(来自于官网)
文件名必须是以.g4结尾,能够指定options, imports, token specifications和任何顺序的动作。
基础语法规则如下
ruleName : alternative1 | ... | alternativeN ;
规则名必须以一个小写字母开头,而词法分析规则必须以一个大写字母开头。
一个没有前缀的grammar连着的名字包含了词法和语法分析器,如果仅仅需要词法或者语法分析器的命名,则如下:
只有词法分析器能够包含模式说明。
语法导入
语法导入可以让我们把一个语法分开导入逻辑和重用模块,antlr对待导入程序像面向对象中的父类程序一样。导入包的语法规则继承所有父类的rules,
and named actions。主要语法规则中有同名的则会复写方法。
一个导入的例子。
其中MyElang继承了ELang的各个方法,但是复写了expr规则。
被导入的程序对于antlt来说会是一整个程序,并不知道哪一部分是被导入的,哪一部分是原来的。所以我们要尽量避免导入的语法规则和我们定义的语法规则命名是有重复,包括tokensets,不然就会被覆写掉而出现错误。
antlr对于所有的导入语法规则采用了深度优先方式,如下图。
不是所有种类的grammar都能包含其他种类的语法:
词法分析语法能够导入词法。
语法能够导入语法。
连接的语法能够导入词法或者语法分析。
主语法分析规则优先级高于导入的语法规则。(即源程序中对于定义的词法分析和导入的词法分析有冲突时,保留源程序中的词法分析定义)
tokens内容
tokens主要用于语法规则中要用的类型定义。基本形式
tokens { Token1, ..., TokenN }
在语法层次的动作
在语法文件的最高层利用外部文件来阐述说明命名的动作,目前仅有两种
对于组合的语法结构,插入的动作都是词法和语法分析器共有的,如果想要他们特有,需要这样写
/** Optional javadoc style comment */ | |
① | grammar Name; |
options {...} | |
import ... ; | |
tokens {...} | |
@actionName {...} | |
rule1 // parser and lexer rules, possibly intermingled | |
... | |
ruleN |
文件名必须是以.g4结尾,能够指定options, imports, token specifications和任何顺序的动作。
基础语法规则如下
ruleName : alternative1 | ... | alternativeN ;
规则名必须以一个小写字母开头,而词法分析规则必须以一个大写字母开头。
一个没有前缀的grammar连着的名字包含了词法和语法分析器,如果仅仅需要词法或者语法分析器的命名,则如下:
parser grammar Name; | |
... |
lexer grammar Name; | |
... |
语法导入
语法导入可以让我们把一个语法分开导入逻辑和重用模块,antlr对待导入程序像面向对象中的父类程序一样。导入包的语法规则继承所有父类的rules,
tokensspecifications,
and named actions。主要语法规则中有同名的则会复写方法。
一个导入的例子。
其中MyElang继承了ELang的各个方法,但是复写了expr规则。
被导入的程序对于antlt来说会是一整个程序,并不知道哪一部分是被导入的,哪一部分是原来的。所以我们要尽量避免导入的语法规则和我们定义的语法规则命名是有重复,包括tokensets,不然就会被覆写掉而出现错误。
antlr对于所有的导入语法规则采用了深度优先方式,如下图。
不是所有种类的grammar都能包含其他种类的语法:
词法分析语法能够导入词法。
语法能够导入语法。
连接的语法能够导入词法或者语法分析。
主语法分析规则优先级高于导入的语法规则。(即源程序中对于定义的词法分析和导入的词法分析有冲突时,保留源程序中的词法分析定义)
tokens内容
tokens主要用于语法规则中要用的类型定义。基本形式
tokens { Token1, ..., TokenN }
在语法层次的动作
在语法文件的最高层利用外部文件来阐述说明命名的动作,目前仅有两种
header和
members,在识别类定义之前,把前者的代码注入生成的识别类文件中,把后者的代码注入到识别类定义中,如fields和members。
对于组合的语法结构,插入的动作都是词法和语法分析器共有的,如果想要他们特有,需要这样写
@parser::name或者
@lexer::name。
相关文章推荐
- Delphi 2010学习笔记(2)---单元文件的结构与语法---2011-01-18
- Objective-C基础学习笔记(一)-程序整体语法结构
- js学习笔记一-语法结构
- PHP学习笔记(二) 了解PHP的基本语法以及目录结构
- PHP学习笔记——list()函数的语法结构
- 数据库学习笔记之SQL查询的基本语法结构
- Learn Objective‐C,学习笔记01 语法结构
- Objective-C基础学习笔记(一)-程序整体语法结构
- Java学习笔记三:Java语法_结构
- 微信小程序开发学习笔记004--微信小程序语法结构
- Javascript学习笔记(二)Javascript核心之语法结构
- Python学习笔记(三)基本语法和流程结构
- PL/SQL学习笔记一之语法结构!!!
- Delphi 2010学习笔记(1)---工程文件的结构与语法---2011-01-18
- PHP学习笔记(二) 了解PHP的基本语法以及目录结构
- go学习笔记(14)-基本语法-结构
- shell脚本学习笔记之常见语法结构用法
- 亲密接触PHP之PHP语法学习笔记1
- OPAL学习笔记 - 构架核心类静态结构
- EJB学习笔记--体系结构