ANTLR
ANTLR学习笔记。
大桔骑士v
微软程序员,B站账号:大桔骑士v
展开
-
【ANTLR学习笔记】5:使用监听器构建翻译程序,在g4文件中定制语法分析过程
1 使用监听器构建翻译程序这里对应书上4.3节,需求是把Java类中的方法都抽取出来生成接口文件,并且保留方法签名中的空白字符和注释。要保留空白符和注释就只能用解析源代码的方式了,不能从字节码文件获取。1.1 监听器类import antlr.JavaBaseListener;import antlr.JavaParser;import org.antlr.v4.runtime.TokenStream;// 监听器类,实现ANTLR生成的默认监听器public class ExtractIn原创 2020-05-26 23:20:30 · 1421 阅读 · 0 评论 -
【ANTLR学习笔记】4:语法导入和访问者(Visitor)模式
这节以四则运算语句的解析为例学习语法导入和Visitor模式。相比笔记1,这里的语法更通用,允许加减乘除、圆括号、整数出现,并且允许赋值表达式。1 四则运算解析1.1 语法规则文件从下面的文件中可以看到,整体是要匹配若干条语句,每条语句都是以NEWLINE换行符结束的。然后语句可以是表达式语句、赋值语句、空语句。表达式的语法规则定义比较自然,因为这里没有手动消除左递归,ANTLR4可以自己消除直接左递归(文件中13/14行分支expr左侧直接调用自身),这是相比其它工具的一大优势,让语法编写更简单易原创 2020-05-25 15:56:31 · 9795 阅读 · 0 评论 -
【ANTLR学习笔记】3:数组初始化列表的解析和翻译
这节跟着书上第三章学习解析例如{val,val,{val,val},val}这样的数组初始化列表,其中每个val都是一个无符号整数。它可以用来将Java中static short[] data = {1,2,3};转化成等价的Unicode字符串形式:static String data = "\u0001\u0002\u0003";因为Java中的char就是unsigned short,可以用Unicode字符(四个16进制表示的16位字符)来表达。这样转换的目的是使数组初始化不受编译出的原创 2020-05-24 19:00:31 · 1766 阅读 · 0 评论 -
【ANTLR学习笔记】2:基本工作流程和歧义处理方法
1 解析的整体流程首先是词法分析器处理字符序列(对应CharStream类),生成Token流(对应TokenStream类,这是连接词法分析和语法分析过程的桥梁)传给语法分析器,语法分析器再用它检查语法正确性,然后解析得到语法树(叶子结点对应TerminalNode类,非叶子结点对应RuleNode类)。在词法分析之后,不仅要标记一个个Token,还需要记录这些Token对应的具体内容(比如知道是一个变量,也要记录变量名是什么)。ANTLR的做法是不去记录这个字符串,而是像上图一样,首先为字符流记录原创 2020-05-24 10:16:26 · 1054 阅读 · 0 评论 -
【ANTLR学习笔记】1:在IDEA中生成简易加减表达式的解析器
ANTLR可以支持生成多种编程语言为载体的Lexer和Parser,可以自动处理LL(*)文法(注意不是LR文法,这里ANTLR实际上是Another Tool for Language Recognition的缩写),目前先在IDEA中用最方便的插件学习一下生成Java版本的。IDEA中的配置首先在IDEA中安装插件,从File->Setting->Plugins搜索并安装ANT...原创 2020-03-27 10:33:35 · 2719 阅读 · 1 评论