编译器中的语法定义
1 术语
- 上下文无关文法
一种广泛使用的方法来描述语法。比如C语言,C++,Java等都转成这种表达方法来描述。
上下文无关文法不仅可以描述一个语言的语法,还可以指导程序的翻译过程。
- 后缀表达式
将运算符放在运算分量之后。比如9+5
-2的后缀表达式为95+2-
。首先记住这个简单的结论,先不要考虑95是9和5还是95。
- 词法单元(token)
词法分析器使得翻译器可以处理多个字符处理的构造。比如标识符,标识符由多个字符组成,但是在语法分析阶段被当作一个单元进行处理。例如
count + 1
标识符被当作一个单元。
词法分析器允许表达式中出现数值、标识符和空白字符
2 语法定义
一个典型的if-else
语句可由下述构造规则表达
stmt -> if(expr) stmt else stmt
其中
变量名 | 全称 |
---|---|
stmt | statement |
expr | expression |
比如
if(i==0){
return 1;
}
else{
return 2;
}
涉及术语
- 产生式(production)
stmt -> if(expr) stmt else stmt
- 终结符号(terminal)
if, (), {}
- 非终结符号(nonterminal)
expr, stmt
3 文法定义
3.1 上下文无关文法
上下文无关文法(context-free grammar)由四部分构成
-
终结符号集合:也被称为”词法单元“
-
非终结符号集合:也称为”语法变量“
-
产生式集合
假设产生式为
stmt1 -> if(expr) stmt2 else stmt3
其
产生式集合
包括产生式头
或左部
:stmt1
- 箭头:
->
,读作”可以具有以下形式“ 产生式体
或右部
:if(expr) stmt2 else stmt3
-
指定一个非终结符号为开始符号
3.2 词法单元和终结符号
在语法分析中,词法单元
就是终结符号
词法单元由2部分组成:名字
和属性
。词法单元是语法分析器进行语法分析时使用的抽象符号。
在编译器中有一个符号表专门保存词法单元的附加信息。可以通过引用指向符号表的指针来访问词法单元。
3.3 产生式举例
产生式规则:
非终结符作为头部,如果多个产生式的头部一样,则可以合并,用|
进行分割
比如9-5+2
、3-1
或7
list -> list + digit
list -> list - digit
list -> digit
digit -> 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0
通过替换可知
list -> list + digit
可替换为 list -> digit + digit
,而digit+digit
即digit
,可推出list -> digit
,所以list->list+digit
和list->digit
的头部是一致的
因此可得出下面的文法产生式
list -> list + digit | list - digit | digit
该文法的终结符号为
+ - 0 1 2 3 4 5 6 7 8 9