前言
GPPL 即 「General Purpose Programming Language」,又称通用编程语言
DSL 即「Domain Specific Language」,中文一般译为「领域特定语言」
内部 DSL(Embedded DSL or Internal DSL) ,它是建立在其它宿主语言之上(一般为 GPPL)的特殊 DSL
流畅接口,所以它本身也属于接口封装或库封装的一种模式,目标是极限表达力
包说明
Java Runtime 大多面向应用程序的
org.antlr.v4.runtime
最常用的类和接口(输入流 字符和词法符号缓冲区 词法符号构建
词法分析 语法分析 )
org.antlr.v4.runtime.atn
argumented transition network 自适应词法分析和语法分析策略
org.antlr.v4.runtime.dfa
包含了DFA实现类
Deterministic Finite Automata DFA 将预测结果缓存在确定有限状态自动机,
org.antlr.v4.runtime.misc
各种数据结构以及常用的TestRig类
org.antlr.v4.runtime.tree
基本的语法分析树监听器 遍历器以及访问器机制
org.antlr.v4.runtime.tree.pattern
org.antlr.v4.runtime.tree.xpath
Java Tool
org.antlr.v4
org.antlr.v4.analysis
org.antlr.v4.automata
org.antlr.v4.gui
org.antlr.v4.misc
org.antlr.v4.parse
org.antlr.v4.semantics
org.antlr.v4.unicode
org.antlr.v4.tool
org.antlr.v4.tool.ast
org.antlr.v4.codegen
org.antlr.v4.codegen.model
org.antlr.v4.codegen.model.chunk
org.antlr.v4.codegen.model.decl
org.antlr.v4.codegen.target
接口说明
org.antlr.v4.runtime
Token
CharStreams
CommonToken
CommonTokenStream
关于
public interface Token {
public interface WritableToken extends Token
public class CommonToken implements WritableToken, Serializable {
public interface TokenFactory<Symbol extends Token> {
public class CommonTokenFactory implements TokenFactory<CommonToken> {
public interface IntStream
public interface TokenStream extends IntStream {
public interface CharStream extends IntStream {
public class BufferedTokenStream implements TokenStream
public final class CharStreams 4.7+{ 用来替换 ANTLRFileStream ANTLRInputStream
public interface TokenSource {
public abstract class Lexer extends Recognizer<Integer, LexerATNSimulator> implements TokenSource
public abstract class Parser extends Recognizer<Token, ParserATNSimulator> {
.g4文件
例如: Demo.g4
ANTLR允许把词法分析部分和语法分析写分别写到两个文件中
语法: grammar Demo;
词法: lexer grammar Demo2;
将词法分析放到单独的文件中时文法的名称也要和文件的名称相同,在grammar关键字之前要加入lexer关键字
Demo中要加入一个设置项 tokenVocab 来指定语法文件所需的词法单词是来自Demo2
在 Antlr 中语法定义和词法定义通过规则的第一个字符来区别,
规定语法定义符号的第一个字母小写,而词法定义符号的第一个字母大写
词法符号类型
概念
原始的字符: 标识符 整数 符号和操作符
词法符号化-文本符号化(Tokenizing,有时也叫词法分析,lexical analysis 或 lexing),
把文本分成可管理的符号(token)
词法符号是程序设计语言中有若干字符组成的有意义的最小语法单位。
按照词法符号在程序中的作用可以分为:关键字、标识符,分隔符、运算符和标点符
词法符号-- 词法符号 类型整数值 .tokens 文件存储相应的对应关系
token literal names
token symbolic names
rule names channel names mode names
atn
识别器的数据来源是 IntStream
Recognizer 识别器基类抽象了识别字符序列或词法符号序列的语言结构
生成的词法分析器 是 Lexer 的子类
生成的语法分析器 是 Parser 的子类
Lexer 实现了 TokenSource 接口
使用
01.创建输入流
02.将一个词法分析器指定给该流,创建一个词法符号
03.将词法符号指定给词法分析器,够将词法符号流
04.将语法分析器,并将其指定给该符号流
示例
//对每一个输入的字符串,构造一个 CharStreams 流 input
CharStream input = CharStreams.fromString(expr);
// input 构造词法分析器 lexer,词法分析的作用是产生符号
DemoLexer lexer = new DemoLexer(input);
//用词法分析器 lexer 构造一个记号流 tokens
CommonTokenStream tokens = new CommonTokenStream(lexer);
//再使用 tokens 构造语法分析器 parser,至此已经完成词法分析和语法分析的准备工作
DemoParser parser = new DemoParser(tokens);
// //最终调用语法分析器的规则 r,完成对表达式的验证
ParseTree tree = parser.r();
参考:
https://pypi.org/project/antlr4-python3-runtime/#files
http://jakubdziworski.github.io/java/2016/04/01/antlr_visitor_vs_listener.html