山东大学软件工程应用与实践——PIG代码分析(七)

2021SC@SDUSC

总览

本篇暂停对QueryParserDriver 类的分析,对一些该类所调用的类进行分析,以便更好对QueryParserDriver 类进行分析。本次对PigParserNode类进行分析,该类主要是对在生成抽象语法树时对宏文件的处理的一些方法的说明以及对于宏文件本身的说明,也会对PigMacro类的分析开始一些初步了解。
宏文件(macro),计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。

代码分析

宏的说明

  • Excel 办公软件自动集成了“VBA”高级程序语言,用此语言编制出的程序就叫“宏”。使用“VBA”需要有一定的编程基础和耗费大量的时间,因此,绝大多数的使用者仅使用了Excel的一般制表功能,很少使用到“VBA”。
  • 解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏这一术语也常常被用于许多类似的环境中,它们是源自宏展开的概念,这包括键盘宏和宏语言。绝大多数情况下,使用“宏”这个词的使用暗示着将小命令或动作转化为一系列指令。
  • 宏的用途在于自动化频繁使用的序列或者是获得一种更强大的抽象能力--但这常常是一回事。
  • 计算机语言如C或汇编语言有简单的宏系统,由编译器或汇编器的预处理器实现。C的宏预处理器的工作只是简单的文本搜索和替换,使用附加的文本处理语言如M4,C程序员可以获得更精巧的宏。
  • Lisp类语言如Common Lisp和Scheme有更精巧的宏系统: 宏的行为如同是函数对自身程序文本的变形,并且可以应用全部语言来表达这种变形。一个C宏可以定义一段语法的替换,然而一个Lisp的宏却可以控制一节代码的计算。
  • 获得了控制代码的执行顺序(见惰性计算和非限制函数)的能力,使得新创建的语法结构与语言内建的语法结构不可区分。例如,一种Lisp 方言有 cond 而没有if ,就可以使用宏由前者定义后者。Lisp 语法的去部主要扩展,比如面向对象的CLOS 系统,可以由宏来定义。

PigParserNode类的多种初始化

初始化的属性包含token对象t,string对象filename,以及int对象lineOffset,其中Token对象t是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。filename为此节点所属的脚本文件名,lineOffset为宏主体起始行号。首先判断令牌是否为空以及起始行号是否大于零,如果非空且大于零则记录下起始行号。

public PigParserNode(Token t, String fileName, int lineOffset) {
    
    
        super(t);
        if (t != null && lineOffset > 0) {
    
    
            t.setLine(t.getLine() + lineOffset);
        }
        this.fileName = fileName;
    }

该初始化的属性类型为两个token型一个string型,其中第二个token型记录了宏主体起始行号。

public PigParserNode(Token t, String fileName, Token start) {
    
    
        this(t, fileName, 0);
        this.startLine = start.getLine();
    }

该初始化的属性为节点型,继承节点后,将节点属性初始化为节点的属性,包括此节点所属的脚本文件;宏调用堆栈;宏主体起始行号。

public PigParserNode(PigParserNode node) {
    
    
        super(node);
        this.fileName = node.getFileName();
        this.invokStack = node.invokStack;
        this.startLine = node.startLine;
    }

PigMacro类的初始化

PigMacro类定义了多个私有变量,String fileName; String name;String body;List params;private List rets;private Map<String, PigMacro> seen; private Set macroStack;private PigContext pigContext;private long idx = 0。其中idx记录的是脚本中此宏的起始行号。初始化方法中params表示可变参数。

PigMacro(String name, String file, List<String> params,
            List<String> returns, String body, Map<String, PigMacro> seen) {
    
    
        this.name = name;
        this.params = (params == null) ? new ArrayList<String>() : params;
        this.rets = (returns == null) ? new ArrayList<String>() : returns;
        this.fileName = file;
        this.body = body;
        this.seen = seen;
        this.macroStack = new HashSet<String>(); 
        LOG.debug("Macro '" + name + "' is defined");
    }

总结

本次代码分析主要是对宏文件有了比较多的了解,同时对于PigParserNode类进行分析,了解到,该类几乎没有任何的方法,主要负责的是记录token对象以及此节点所属的脚本文件;宏调用堆栈;宏主体起始行号等宏文件相关属性的了解。希望下一次的代码分析对PigMacro类进行分析时了解到更多的对于pig在处理宏文件时进行的操作。

猜你喜欢

转载自blog.csdn.net/qq_45822693/article/details/121337644