文法
在计算机科学中,文法是编译原理的基础,是描述一门程序设计语言和实现其编译器的方法(文法是用于描述语言的语法结构的形式规则)。
1个文法 G 是一个四元组 G = (VN , VT , S, P), 其中
VN :非终结符的有限集合
VT :终结符的有限集合
S: 起始符号
P :产生式(推导式)的集合。用终结符替代非终结符的规则。形如F —>a
文法的分类
0型文法(无限制文法 / 短语结构文法)
1型文法(上下文有关文法)
2型文法(上下文无关文法)
3型文法(正规文法)
这几类文法的差别在于对产生式施加不同的限制。多数程序设计语言使用的是2型文法(上下文无关文法)。
2型文法(上下文无关文法)
G = ({a,b} , {T,F} , S, P) 中,
终结符为a,b
非终结符为T,F
起始符为S
推导式为P。
注意:G的四元组中的顺序不是一定的,VN 与 VT 可能会互换。一般来说,终结符都是小写字母(或数字,部分终结符还包括+,-,*)。终结符以题干说明为准。
符号表
符号表:在计算机科学中,符号表是一种用于语言翻译器(例如编译器和解释器)中的数据结构。
在符号表中,程序源代码中的每个标识符都和它的声明或使用信息绑定在一起,比如其数据类型、作用域以及内存地址。
符号表是贯穿编译 / 解释 全部过程的。符号表的作用如下:
① 收集符号属性;(词法分析)
② 上下文语义的合法性检查的依据;(语法分析)
③ 作为目标代码生成阶段地址分配的依据;(语义分析)
实现符号表的常用数据结构
• 一般的线性表:如:数组,链表,等
• 有序表:查询较无序表快,如可以采用折半查找
• 二叉搜索树
• Hash表
符号表也会用于追溯软件的动态错误原因。因为符号表是贯穿编译 / 解释 全部过程的,参与动态执行。例如,腾讯Bugly是通过Android、IOS上传的符号表文件追溯软件崩溃的原因。