antlr4学习笔记1-语法结构

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。










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值