您的位置:首页 > 其它

antlr4学习笔记1-语法结构

2014-11-14 15:36 387 查看
antlr的语法结构如下

/** 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,
tokens
specifications,
and named actions。主要语法规则中有同名的则会复写方法。

一个导入的例子。



其中MyElang继承了ELang的各个方法,但是复写了expr规则。

被导入的程序对于antlt来说会是一整个程序,并不知道哪一部分是被导入的,哪一部分是原来的。所以我们要尽量避免导入的语法规则和我们定义的语法规则命名是有重复,包括tokensets,不然就会被覆写掉而出现错误。

antlr对于所有的导入语法规则采用了深度优先方式,如下图。



不是所有种类的grammar都能包含其他种类的语法:

词法分析语法能够导入词法。

语法能够导入语法。

连接的语法能够导入词法或者语法分析。

主语法分析规则优先级高于导入的语法规则。(即源程序中对于定义的词法分析和导入的词法分析有冲突时,保留源程序中的词法分析定义)

tokens内容

tokens主要用于语法规则中要用的类型定义。基本形式

tokens { Token1, ..., TokenN }

在语法层次的动作

在语法文件的最高层利用外部文件来阐述说明命名的动作,目前仅有两种
header
members,在识别类定义之前,把前者的代码注入生成的识别类文件中,把后者的代码注入到识别类定义中,如fields和members。


对于组合的语法结构,插入的动作都是词法和语法分析器共有的,如果想要他们特有,需要这样写
@parser::
name或者
@lexer::
name。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: