上下文无关文法介绍
一组终结符,一组非终结符,起始符号,一组推导式
终结符:所有出现在推导式左边的词
非终结符:推导式右边无法再进行推导的词
语法推导
推导过程:用推导式右边的内容去替换左边的非终结符,反复进行,直到不能继续替换。
从初始符号开始,找到最左边的第一个非终结符,然后进行替换,这种推导方式叫 left most derivation,简称LR。--左推导
与之对应,从右边开始替换,叫做right-most derivation。--右推导
推导过程是从最顶端的推导表达式开始进行替换,这种由上到下的推导叫做自顶向下分析。 推导的结果就是语法解析树。
上下文无关
如果一个推导式的右边的某个非终结符又可以推导,推导式包括之前终结符左边的非终结符,那么这种情况就可以称为上下文无关。
典型例子是算术表达式,表达式可以拆解成其自身的组合。
歧义性
如果给定的输入能被语法接受,但左推导和右推导构建的语法推导树不同的话,我们称语法具有歧义性。
消除歧义性的方法是重新定义语法。
错误处理
编译器的目标:
1.检测无效程序
2.翻译有效程序
错误处理的目标: 1.正确报告错误 2.从错误中及时恢复 3.不应该对原有程序有太多效率影响
错误处理的方式
panic mode
遇到错误直接丢弃token,直到重新发现有效的再重新从该点开始。
error productions 补充推导式
由于现在编译的速度已经足够快,所以对错误处理的重视程度不如从前。之前由于编译周期长,因此在编译过程中更倾向于暴露所有错误一次修复,而现在更偏向于一次修复一个bug.
编译原理只在乎结构,不在乎语言。