zoukankan      html  css  js  c++  java
  • 数据结构与算法_语言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
  • 相关阅读:
    OpenCV里面的一些常用函数
    c++ 里面的字符类型转换
    互斥研究
    git 命令
    pipe的操作
    二叉树总结(五)伸展树、B-树和B+树
    二叉树总结(四)平衡二叉树
    二叉树总结(三)二叉搜索树
    [LeetCode]Construct Binary Tree from Preorder and Inorder Traversal
    二叉树总结(一)概念和性质
  • 原文地址:https://www.cnblogs.com/ytwang/p/14190024.html
Copyright © 2011-2022 走看看