- 三目运算、算术运算、关系运算、逻辑运算等拆分
- 支持JSON解析并计算,用于管理端配置各种规则,后端计算
- 支持自定义函数、作用域、生存期
- 异常策略
- 表达式校验
- 字面量、关键字、标识符、操作符、比较符、保留字、空白字符
- 正则文法、有限自动机[FSA(DFA、NFA)]、状态迁移
- 上下文无关文法、BNF、递归下降算法、左递归、优先级、结合性
- 二义性、推导
- 表达式语句、赋值语句、控制语句、循环语句、块
- 作用域、生存期、类型推导(Type Inference)、类型检查(Type Checking)、类型转换(Type Conversion)、引用消解
- 文法:是一组规则,用以描述如何将文本流转化为语法树
- 词法分析:将程序分析为一个个Token的过程,可以使用有限自动机实现
- 语法分析:将程序的结构识别出来,并形成便于计算机处理的抽象语法树,可以使用递归下降算法实现
- 语义分析:将消除语义模糊,生成一些属性信息,让计算机能够依据这些信息生成目标代码
- 词法原理:就是依据构造好的有限自动机,在不同的状态中迁移,从而解析出Token
- 语义分析的本质:就是针对上下文相关的情况做处理
- 上下文无关文法:一个有穷的非终结符(或变元)的集合、一个有穷的终结符的集合、一个有穷的产生式集合、一个起始非终结符(变元)。符合这四个特点的文法规则就是上下文无关文法。两种描述形式:一种是巴科斯范式(BNF),另一种是巴科斯范式的一种扩展形式(EBNF),它更利于自动化生成语法分析器。其中,产生式、终结符、非终结符、开始符号是巴科斯范式的基本组成要素。
- BNF:巴科斯范式,antlr和yacc工具
- EBNF:扩展巴科斯范式, 在BNF基础上混合类似正则的写法
- 优先级:通过在语法推导中的层次来决定的,优先级越低的,越先尝试推导。一般从低到高,赋值运算 -> 逻辑运算 -> 关系运算 -> 算数运算 -> 基础表达式,而改变优先级方法可以在 基础表达式 后增加带括号的可选择表达式,如 | ( exp )
- 结合性:操作符计算是从左向右计算还是从右向左计算,就是结合性。如 1+2+3 正常计算属于左结合,而 x=y=10 属于右结合。左结合运算符递归项放在左边,右结合运算符递归项放在右边。
- 二义性:按语法规则能对导出两个语法树,一般修改语法规则解决或者语法分析工具存在类似LL算法解决
- 递归下降算法:属于自顶向下语法分析思想
- LL算法:深度优先算法
- LR算法:深度优先算法
- 左递归:在二元表达式的语法规则中,如果产生式的第一个元素是它自身,那么程序就会无限地递归下去,这种情况就叫做左递归。比如加法表达式的产生式“加法表达式 + 乘法表达式”,就是左递归的
- FSA:分为确定的有限自动机(DFA)和非确定的有限自动机(NFA)
- 优先级自上而下降低
- 默认左结合,而右结合需要使用 运算符<assoc=right>
- 直接左递归可以处理,间接左递归无法处理。如
expr : expr '+' expr // 匹配由“+”运算符连接的子表达式
| expr '*' expr
5CB9
// 匹配由“*”运算符连接的子表达式
| INT // 匹配简单整数
;
expr : expo ; // 通过expo左递归地间接调用expr,无法处理
expo : expr '^'<assoc=right> expr ;
文法,英文叫做Grammar,是形式语言(Formal Language)的一个术语。 所以也有Formal Grammar这样的说法。这里的文法有定义清晰的规则。 比如,我们的词法规则、语法规则和属性规则,使用形式文法来定义的。 我们的课程里讲解了正则文法(Regular Grammar)、上下文无关文法(Context-free Grammar)等不同的文法规则,用来描述词法和语法。 语法分析中的这个语法,英文是Syntax,主要是描述词是怎么组成句子的。一个语言的语法规则,通常指的是这个Syntax。 问题是,Grammar这个词,在中文很多应用场景中也叫做语法。这是会引起混淆的地方。我们在使用的时候要小心一点就行了。 比如,我做了一个规则文件,里面都是一些词法规则(Lexer Grammar),我会说,这是一个词法规则文件,或者词法文法文件。 这个时候,把它说成是一个语法规则文件,就有点含义模糊。因为这里面并没有语法规则(Syntax Grammar)。
正则文法、有限自动机 -> 上下文无关文法 EBNF、自定向下递归下降算法、优先级、结合性、左递归 -> 上限文相关性、类型