编译器构造阅读笔记(3)

153 阅读2分钟

编译器构造阅读笔记(3)

上下文无关语法(Context-Free Grammar, CFG )定义 Micro

CFG 有时候也被称为 BNF (巴科斯-诺尔范式)文法。

通俗来说,CFG 就是一组重写规则或产生式。产生式的形式在于

A -> B C D ... Z

其中,A 被称为 产生式 的左部(Left-Hand Side, LHS),B, C, D … Z 就被称为产生式的右部。

产生式代表了一个规则,也就是左边的内容,可以被右边的内容替换掉。

这让我想到了 m4 宏,它的区别在于,它是下文的某个内容,可以被上文的某个东西替换掉。
(宏也是类似的,相当于用一个精简的东西,指代大量复杂的东西)

在 CFG 中可以出现两种文法的符号,非终结符号和终结的符号。


程序设计语言通常含有可选项或者项列表,为了清晰表示这样的特性,通常利用拓展 BNF 记号。

而可选项序列由方括号 ‘[’ 和 ‘]’ 进行括起,例如,在产生式

-> [ID:] begin end

中,程序有一个可选的记号,可选的项列表用大括号 ‘{’ 和 ‘}’ 括起来。

看来,它们两者还存在着的差别,这里我需要去下下功夫。

拓展 BNF 更加灵活,而且它与普通的 BNF 有着相同的定义能力。

特别地,可以使用下面的转换把 拓展 BNF 映射为标准的形式。

可选序列由产生序列项目新的非终结符进行替换。
在这里插入图片描述

这让我想到了一个重要的事情,因为可选项可以是多个,所以,其实这样就有了“可拓展性”。

比如 ‘printf (commnad, var_1, var_2 , …)’

某种意义上可以就用这种方法表示:

printf ( {var} )

(个人理解,也不知道对还是不对)


CFG 定义一个语言,也就是词法记号序列的集合,能够使用文法推导出的任意词法记号序列都是有效的;反之则是无效的。

事实上,严格来说,从 CFG 推导出的任意词法记号序列,都被认为是语法上面有效的。

注意,词法上有效,不代表语义上面有效。