数据结构与算法_语言Antrl4

前言

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