词法分析器从语法分析器得到一个由词法单元组成的串,并验证串能够由源语言的文法生成,构造一棵语法分析树。前端
常见的方法能够分为自顶向下和自底向上方法。语法分析器的输入都是按照从左向右扫描的。正则表达式
语法错误的处理有2中策略:算法
程序中可能出现不一样层次的错误模块化
语法分析器中错误处理程序的目标:函数
发现错误丢弃输入中的符号,直到找到同步词法单元(synchronizing token)。同步词法单元一般是界限符号,如 } ;设计
对于某错误,在余下的输入中进行局部校订,多是将余下的某个前缀替换成另外一个串,使语法分析器能够继续分析。如将逗号替换成分号,添加分号。递归
经过预测常见的错误,在文法添加中添加一个特殊的产生式,来处理错误结构。token
上下文无关文法包含终结符,非终结符,一个开始符号和一组产生式组成。编译器
经过推导构建语法分析树。同步
二义性:若是一个文法能够为某个句子生成多棵语法分析树,那么就有二义性。
加减乘除优先级就是用来实现消二义性规则的。
为何使用正则表达式来定义一个语言的词法语法?
理由:
设计文法须要消除二义性。如if else,在then和else以前添加语句,必须是"已匹配的"。
提取左公因子是一种文法转换方法。经过改写产生式来退后这个决定,当输入足够多的时候,作出选择。
本质上是为输入串构造语法分析树。从根节点按先序建立各个节点,能够看作寻找输入串的最左推导的过程。
对于有些文法,构造一个向前看k个字符的预测分析器,这类文法被称为LL(K)文法类,根据FIRST和FOLLOW集合,构造预测分析表。
FIRST和FOLLOW是文法G相关的2个函数,能够根据下一个输入符号来选择应用哪一个产生式。
LL(1)文法,经过构造出预测分析器,既不须要回溯的递归降低语法分析器。
第一个L表示从左向右扫描输入,第二个L表示产生最左推导,1表示每次扫描一个字符
构造一个非递归的预测分析器,显示的维护一个栈结构;递归是隐式的维护栈,这样的语法分析器能够模拟最左推导的过程。
从叶子节点向上到达根节点,一般方法使用移入-归约
LR文法类是最大的,能够构造出相应的移入-归约语法分析器的文法类。可是手工构造LR语法分析器的工做量特别大。
自底向上语法分析的过程当作将一个串w"归约"为文法开始符号的过程。
在归约过程当中,一个与某产生式体匹配的特定子串被替换成该产生式的非终结符号。
归约就是推导步骤的反向操做。推导步骤是将句型中非终结符号替换成该符号的产生式的体。
使用一个栈来保存文法符号,用一个输入缓冲区存放将要进行语法分析的其它符号。
冲突问题:即便知道了栈中全部的内容,和接下来k个输入符号,仍然没法判断是应该移入仍是归约操做,活着有多个归约的可能,没法正确选择。(如if if than else)
L表示从左向右扫描,R表示反向构造一个最右推导序列,k表示语法分析的时候向前看k个输入符号。
LR语法分析器是表格驱动的。
LR语法分析器包含:一个输入,一个输出,一个栈,一个语法分析表。
语法分析表包含:分析动做函数ACTION,和转换GOTO函数。
输入:一个串w,一个LR语法分析表,这个表描述了文法G的ACTION函数和GOTO函数。
输出:若是w在L(G)中,输出w自底向上的语法分析过程当中的归约步骤;不然error
方法:栈中的内容老是一个可行前缀,LR分析器首先构造各个可行前缀的有效项的项集(称为LR状态),有效项集合引导语法分析器作出移入-归约决定。
关键字
SLR:简单LR分析器。
规范LR分析器,增长了一个向前看的符号集,能够避免SLR中出现的分析动做的冲突,状态会比同一文法的SLR状态更多。
LALR:向前看的LR分析器。
二义性文法:使用二义性文法,添加附加信息,如算数符号的优先级,解决移入和归约的冲突。