欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Antlr语法

程序员文章站 2022-04-13 14:10:44
...
// 1.注释
/**
* 注释有 单行,多行,Javadoc注释 三种
*/
// 语法声明,关键字 grammar
// 不带前缀的语法声明是混合语法,可以同时包含词法规则和文法规则
// 若要创建一份只允许文法规则出现的语法,使用声明 parser grammar Name; 纯词法的语法声明,使用 lexer grammar Name;

grammar ZC;
/*
多行注释
*/

// 2.标识符
// 词法符号名 和 词法规则名 以 大写字母开头
// 文法规则 以 小写字母开头
// 首字母之后的字符可以是大小写字符、数字和下划线

// 文法规则名
// expr 是 文法规则名
// : 表示后面是具体的文法规则
// 这个文法由 ID 词法 或 STRING 词法组成
expr : ID | STRING | ;

// 3 文法规则
// 3.1 语法分析器由一系列文法规则组成,这些规则既可以位于文法语法中,也可以位于混合语法中
// 规则中可以包含由|分隔的备选分支。
stat : retstat | 'break' ';' | 'continue' ';';
retstat : ID;

// 3.2 备选分支是一组可以为空的规则元素列表。例如,下列规则中的空备选分支使得整条规则成为了可选的
stat2 : retstat | ;

// 3.3 备选分支的标签
// 可以使用#给最外层的备选分支添加标签,以获得更加精确的语法分析器监听器事件
// 一条规则中的备选分支要么全部带上标签,要么全部不带标签
// ANTLR为每个标签生成一个规则上下文类
stat3 : 'return' e ';' # Return
    | 'break' ';' # Break
    ;
e   : e '*' e # Mult
    | e '+' e # Add
    | INT     # Int
    ;

// 4.规则元素
// 规则元素指明了语法分析器在特定的时间需要完成的任务
// 规则元素可以是一条规则、一个词法符号 或者 一个字符串常量
// T 匹配词法符号T,词法符号以大写字母开头
// 'str' 匹配字符串常量
// r 匹配规则r,像函数一样调用该规则,文法规则以小写字母开头
// r[<<args>>] 匹配r,并像函数调用一样传入一组参数
// {<<action>>} 在备选元素之后,后一个备选元素之前执行的代码动作.
// {<<p>>}? 执行语义判定<<p>>.
// . 匹配任意除文件结束符之外的语法符号.
// ~(INT|ID)匹配除INT或ID之外的任意词法符号

// 5.子规则
// 一条规则可以包含称为子规则的备选分支块
// 子规则和规则相似,只是缺少名字并被包裹在圆括号内。在子规则的括号内,可以包含一个或者多个备选分支
// 存在四种类型的子规则(其中x、y、z代表语法元素)
// (x|y|z) 匹配该子规则内的任意备选分支 一次
// (x|y|z)? 匹配该子规则内的任意备选分支 一次 或 不匹配任何东西
// (x|y|z)* 匹配该子规则内的任意备选分支 0~多次
// (x|y|z)+ 匹配该子规则内的任意备选分支 1~多次
// 在子规则仅包含一个备选分支时,可以忽略子规则两侧的括号

// 6.捕获异常
// 当在一条规则中发生语法错误时,ANTLR会捕获该异常,报告错误,并试图从中恢复(可能通过消费更多的词法符号来完成此过程),然后从规则中返回。
// 每条规则都包裹在一个try/catch/finally语句中

// 7.规则属性定义
// 与规则和动作相关的语法元素。规则可以像编程语言中的函数一样,包含参数、返回值以及局部变量
// ANTLR会将你定义的所有变量收集起来并存储到规则上下文对象中

// 8.起始规则和文件结束符


// 词法符号 和 词法规则名
// 词法的语法 由 词法规则组成,并且可被分解为多个模式
// 词法规则的定义方式和文法规则非常相似,除了一些例外:词法规则不能包含参数、返回值或者局部变量。
// 词法规则名必须以大写字母开头,以和文法规则名区分开。

// ID 词法 表示: 只要不是 逗号 \n \t 中的一个字符就行
// 1.词法模式
// 词法模式 允许你将词法规则按照上下文分组
// 2.词法规则元素
// 词法规则元素总结
// 'str' 匹配指定的字符或字符序列,如'while'或'='
// [char set]匹配字符集中的一个字符.如 [x-y]从x到y的字符集合(包含x和y). \n,\r,\b,\t,\,-, Unicode字符.
// 3.递归词法规则
// ANTLR词法规则可以是递归的

ID : ~[,\n\r"]+ ;
// STRING词法
STRING : '"' ('""'|~'"')* '"' ;
INT: '1';

// antlr关键字: import、fragment、lexer、parser、grammar、returns、locals、throws、catch、finally、mode、options、tokens

// 1.语法导入
// 语法导入允许你将语法分解成可复用的逻辑单元
// 一个语法会从其导入的语法中继承所有的规则、词法符号声明和具名的动作
// 位于“主语法”中的规则将会覆盖其导入的语法中的规则,以此来实现继承机制
// 可以将import看作是一种智能的、不会引入本文件中已经定义过的规则的引入语句(include statement)
// 在处理一份主语法的过程中,ANTLR工具将所有被导入的语法加载到一起,然后将其中的规则、词法符号类型以及具名动作合并到主语法中

// 2.词法符号声明
// tokens区域存在的意义在于,它定义了一份语法所需,但却未在本语法中列出对应规则的词法符号

// 文法规则
// 语法分析器由一系列文法规则组成,这些规则既可以位于文法语法中,也可以位于混合语法中
// Java程序通过调用ANTLR自动生成的、与预期的起始规则相对应的函数来启动语法分析器
// 规则最基本的形式是规则名后面紧接着一个备选分支,然后是一个分号
expr2 : ID | STRING | ;





相关标签: ANTLR