ANTLR教程(三)语法分析
来源:互联网 发布:凡科能在mac上使用么 编辑:程序博客网 时间:2024/05/23 23:05
目录
- 1. 文法产生式
- 1.1. 基于四种模式实现文法产生式
- 1.1.1. 顺序模式
- 1.1.2. 选择模式
- 1.1.3. 记号依赖
- 1.1.4. 递归模式
- 1.2. 消除产生式歧义
- 1.2.1. 定义符号结合性
- 1.2.2. 定义符号优先级
- 1.3. antlr 实际语言例子
- 1.3.1. csv 主要顺序模式
- 1.3.2. json 主要递归模式
- 1.1. 基于四种模式实现文法产生式
- 2. 使用antlr显示语法树方法
- 3. 使用antlr实现语法解析,生成语法树AST
- 3.1. antlr生的语法树相关的数据结构
- 3.2. antlr编译语法文件后自动生成的类
- 3.3. 将antlr生成的类集成起来解析语法,实现应用
- 3.3.1. 打印语法树
- 3.3.2. 代码生成
文法产生式
基于四种模式实现文法产生式
顺序模式
(INT)+
file : (row ‘\n’)* ; */ sequence with a ‘\n’ terminator
row : field (‘,’ field)* ; /* sequence with a ‘,’ separator
field: INT ; // assume fields are just integers
选择模式
field : INT | STRING ;
记号依赖
出现成对终结符级即可
expr: expr ‘(’ exprList? ‘)’ // func call like f(), f(x), f(1,2)
…
;
递归模式
消除产生式歧义
定义符号结合性
expr : expr ‘^’
定义符号优先级
antlr 实际语言例子
csv 主要顺序模式
json 主要递归模式
使用antlr显示语法树方法
- 显示解析到的每个token信息
- 显示lisp形式语法
- 图形形式语法树
产生式非终结符上右键 -》 Test rule 非终结符 -》在弹出的窗口输入产生式
使用antlr实现语法解析,生成语法树AST
antlr生的语法树相关的数据结构
xxxContext数据结构记录了每个文法产生式左边非终结符的信息,通过相应的方法可以获得每个文法产生式右边元素的值
例如:
AssignContext->ID()和->expr()
antlr编译语法文件后自动生成的类
- 词法分析类——ArrayInitLexer.java
词法分析的结果——记号流ArrayInit.tokens
对每一个 token赋值一个 token数字语法分析类——ArrayInitParser.java
每条文法规则的处理方法语法树遍历操作类——ArrayInitListener.java, ArrayInitBaseListener.java
将antlr生成的类集成起来解析语法,实现应用
打印语法树
// import ANTLR's runtime librariesimport org.antlr.v4.runtime.*;import org.antlr.v4.runtime.tree.*;public class Test {public static void main(String[] args) throws Exception {// create a CharStream that reads from standard inputANTLRInputStream input = new ANTLRInputStream(System.in);// create a lexer that feeds off of input CharStreamArrayInitLexer lexer = new ArrayInitLexer(input);// create a buffer of tokens pulled from the lexerCommonTokenStream tokens = new CommonTokenStream(lexer);// create a parser that feeds off the tokens bufferArrayInitParser parser = new ArrayInitParser(tokens);ParseTree tree = parser.init(); // begin parsing at init ruleSystem.out.println(tree.toStringTree(parser)); // print LISP-style tree}}
代码生成
starter/Translate.java// import ANTLR's runtime librariesimport org.antlr.v4.runtime.*;import org.antlr.v4.runtime.tree.*;public class Translate {public static void main(String[] args) throws Exception {// create a CharStream that reads from standard inputANTLRInputStream input = new ANTLRInputStream(System.in);// create a lexer that feeds off of input CharStreamArrayInitLexer lexer = new ArrayInitLexer(input);// create a buffer of tokens pulled from the lexerCommonTokenStream tokens = new CommonTokenStream(lexer);// create a parser that feeds off the tokens bufferArrayInitParser parser = new ArrayInitParser(tokens);ParseTree tree = parser.init(); // begin parsing at init rule // Create a generic parse tree walker that can trigger callbacks ParseTreeWalker walker = new ParseTreeWalker(); // Walk the tree created during the parse, trigger callbacks walker.walk(new ShortToUnicodeString(), tree); System.out.println(); // print a \n after translation}}
阅读全文
0 0
- ANTLR教程(三)语法分析
- 语法分析之antlr学习
- antlr指南 第四章 语法分析
- antlr教程
- ANTLR快餐教程(1)
- ANTLR快餐教程(2)
- ANTLR教程(一)简介
- ANTLR教程(二)词法分析
- 编译原理(三)语法分析
- 实验三:CMM语言语法分析
- 【编译原理】语法分析(三)
- kotlin 语法分析(三) -- 类引用
- Antlr
- antlr
- Antlr
- ANTLR
- Antlr
- 语法分析
- dma
- pycharm保存文件时处理
- python 爬虫爬取所有上市公司公告信息(五)
- C语言中常见的30个简单小程序
- 前后端交互 跨域问题的解决
- ANTLR教程(三)语法分析
- click事件点击一次,执行多次的问题
- C++事务型内存技术规范:第2章(英文)
- 前端学习笔记之观察者模式
- JS基础——实现图片轮播效果础
- HDU
- mysql密码修改与密码丢失的解决方案
- 映射表类(CMap)
- 揭秘家用路由器0day漏洞挖掘技术读书笔记 D-Link DIR-505 my_cgi.cgi溢出漏洞分析