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

2021SC@SDUSC

总览

Pig基于Antlr进行语法解析,生成逻辑执行计划。逻辑执行计划基本上与Pig Latin中的操作步骤一一对应,以DAG形式排列。parser存在Pig使用 Anltr生成词法分析器和语法分析器(QueryLexer.g和QueryParser.g分别是Pig Latin使用的词法文件和语法文件),以及校验用户输入合法性(AstValidator)。

  • parser时序图
    在这里插入图片描述

antlr

什么是antlr

  • Antlr 是一个基于 Java 开发的功能强大的语言识别工具,Antlr 以其简介的语法和高速的运行效率在这类工具中出类拔萃。
  • ANTLR 语言识别的一个工具 (ANother Tool for Language Recognition ) 是一种语言工具,它提供了一个框架,可以通过包含 Java, C++, 或 C# 动作(action)的语法描述来构造语言识别器,编译器和解释器。 计算机语言的解析已经变成了一种非常普遍的工作,在这方面的理论和工具经过近 40 年的发展已经相当成熟,使用 Antlr 等识别工具来识别,解析,构造编译器比手工编程更加容易,同时开发的程序也更易于维护。
  • 和大多数语言识别工具一样,Antlr 使用上下文无关文法描述语言。最新的 Antlr 是一个基于 LL(*) 的语言识别器。在 Antlr 中通过解析用户自定义的上下文无关文法,自动生成词法分析器 (Lexer)、语法分析器 (Parser) 和树分析器 (Tree Parser)。
  • 识别和处理编程语言是 Antlr 的首要任务,编程语言的处理是一项繁重复杂的任务,为了简化处理,一般的编译技术都将语言处理工作分为前端和后端两个部分。其中前端包括词法分析、语法分析、语义分析、中间代码生成等若干步骤,后端包括目标代码生成和代码优化等步骤。
    Antlr 致力于解决编译前端的所有工作。使用 Anltr 的语法可以定义目标语言的词法记号和语法规则,Antlr 自动生成目标语言的词法分析器和语法分析器;此外,如果在语法规则中指定抽象语法树的规则,在生成语法分析器的同时,Antlr 还能够生成抽象语法树;最终使用树分析器遍历抽象语法树,完成语义分析和中间代码生成。整个工作在 Anltr 强大的支持下,将变得非常轻松和愉快。
  • 当需要文本处理时,首先想到的是正则表达式,使用 Anltr 的词法分析器生成器,可以很容易的完成正则表达式能够完成的所有工作;除此之外使用 Anltr 还可以完成一些正则表达式难以完成的工作,比如识别左括号和右括号的成对匹配等。

antlr的使用

文法定义

  • 在 Anltr 中,算法的优先级需要通过文法规则的嵌套定义来体现,加减法的优先级低于乘除法,表达式 expr 的定义由乘除法表达式 multExpr 和加减法算符 (’+’|’-’) 构成;同理,括号的优先级高于乘除法,乘除法表达式 multExpr 通过原子操作数 atom 和乘除法算符 (’*’|’/’) 构成。
  • 词法的定义,在 Antlr 中语法定义和词法定义通过规则的第一个字符来区别, 规定语法定义符号的第一个字母小写,而词法定义符号的第一个字母大写。算术表达式中用到了 4 类记号 ( 在 Antlr 中被称为 Token),分别是标识符 ID,表示一个变量;常量 INT,表示一个常数;换行符 NEWLINE 和空格 WS,空格字符在语言处理时将被跳过,skip() 是词法分析器类的一个方法。
  • Antlr 支持多种目标语言,可以把生成的分析器生成为 Java,C#,C,Python,JavaScript 等多种语言,默认目标语言为 Java,通过 options {language=?;} 来改变目标语言。

运行antlr

  • 完成文法定义之后,即可以运行 Antlr,为我们生成需要的词法分析器和语法分析器。

antlr生成文件

Anltr 生成的词法分析器和语法分析器,除了校验表述式输入合法性之外,没有更多的用处。如果需要对表达式做进一步的处理,对表达式的运算结果求值,使用 Antlr 可以有两种选择,第一,直接在我们之前的 Expr 文法中嵌入动作,加入 Java 代码片段;第二,使用 Antlr 的抽象语法树语法,在语法分析的同时将用户输入转换成中间表示方式:抽象语法树,后续在遍历语法树的同时完成计算。

QueryLexer.g

词法文件,可以校验表述式输入合法性。PIG使用了Antlr 的抽象语法树语法,在语法分析的同时将用户输入转换成抽象语法树,可以对表达式作进一步处理。

  • 例:
foreach_plan_complex : LEFT_CURLY nested_blk RIGHT_CURLY-> ^( FOREACH_PLAN_COMPLEX nested_blk )

QueryParser.g

语法文件,可以校验表述式输入合法性。PIG在语法文件中嵌入动作,加入Java代码,对表达式做进一步处理。

  • 例:创造给定节点的深度副本
private static Tree deepCopy(Tree tree) {
    
    
    Tree copy = tree.dupNode();
    for (int i = 0; i < tree.getChildCount(); i++) {
    
    
        Tree child = deepCopy(tree.getChild(i));
        child.setParent(copy);
        copy.addChild(child);
    }
    return copy;
}

总结

本次分析主要对词法文件和语法文件的生成以及使用进行分析,对antlr所生成语法文件的过程以及antlr本身进行了一定了解。

猜你喜欢

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