目前AI领域很多开源框架都朝着低门槛的方向发展,以keras为例,极大地简化了tensorflow的使用。我们的项目同样面临这个问题,为了降低使用门槛,需要使用解析器把易于常人理解的配置转化为复杂的后端执行代码。在调研过程中,遇到了有很多表达式解析工具,如ik-expression、aviator等,最后我学习spark-sql的时候了解了spark2.0底层的sql解析器使用了ANTLR ,后来发现ANTLR 是一款优秀的工业级语法分析器,所以决定用到我们的项目中。
基本概念
- 语言:一门语言是一个有效语句的集合,语句(sentence)由词组组成,词组(phrase)由子词组组成,子词组(subphrase)又由更小的词组组成,依次类推;
- 语法:语法定义了语言的语义规则,语法中的每条规则定义了一种词组结构;
- 语义树或语法分析树:代表了语句的结构,其中的每个子树的根节点都使用一个抽象的名字给包含的元素命名。即子树的根节点对应了语法规则的名字。树的叶子结点是语句的符号或者词法的符号;
- 词法符号:词法符号是一门语言的基本词汇符号,他们可以代表像是“标志符”这样的一类符号,也可以代表一个单一的运算符,或者代表一个关键字;
- 词法分析器或者词法符号生成器:将字符聚集为单词或者符号(token)的过程称为词法分析(lexical analysis)或者词法符号化(tokenzing)。我们可以把输入文本转换为词法符号的程序称为词法分析器(lexer)。词法符号包含至少两部分信息:词法符号类型和词法符号对应的文本;
- 语法分析器:识别语言的程序叫做语法分析器(parser)或者句法分析器(syntax analyzer)。句法(syntax)是指约束语言中的各个组成部分之间关系的规则。语法(grammar)是一系列规则的集合,每条规则表述出一种词汇结构。语法分析器通过检查语句的结构是否符合语法规则的定义来验证该语句在特定语言中是否合法;
- 递归下降的语法分析器:这事自顶向下的语法分析器的一种实现,每条规则都对应语法分析器中的一个函数;
- 前向预测:语法分析器使用前向预测来进行决策,具体方法是:将输入符号与每个备选分支的起始符号进行比较;
- 解释器:如果一个程序能够分析计算或者“执行”语句,我们就称之为“解释器”(interpreter),例子有计算器、读取配置文件的程序或者python解释器;
- 翻译器:如果一个程序能够将一门语言的语句转换为另一门语言的语句,我们称之为翻译器(translator),这样的例子包括java到C#的转换器和普通编译器;