标签为“yacc”的日记

Yacc简单介绍

Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语 法解析器。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例,Yacc 文件有 .y 后缀。编译行如下调用 Yacc 编译器:

       $ yacc <options>
<filename ending with .y>

在进一步阐述以前,让我们复习一下什么是语法。在上一节中,我们看到 Lex 从输入序列中识别标记。 如果你在查看标记序列,你可能想在这一序列出现时执行某一动作。 这种情况下有效序列的规范称为语法。Yacc 语法文件包括这一语法规范。 它还包含了序列匹配时你想要做的事。

为了更加说清这一概念,让我们以英语为例。 这一套标记可能是:名词, 动词, 形容词等等。为了使用这些标记造一个语法正确的句子,你的结构必须符合一定的规则。 一个简单的句子可能是名词+动词或者名词+动词+名词。(如 I care. See spot run.)

所以在我们这里,标记本身来自语言(Lex),并且标记序列允许用 Yacc 来指定这些标记(标记序列也叫语法)。

Lex简单介绍

Lex 是一种生成扫描器的工具。扫描器是一种识别文本中的词汇模式的程序。 这些词汇模式(或者常规表达式)在一种特殊的句子结构中定义,这个我们一会儿就要讨论。


一种匹配的常规表达式可能会包含相关的动作。这一动作可能还包括返回一个标记。
当 Lex
接收到文件或文本形式的输入时,它试图将文本与常规表达式进行匹配。
它一次读入一个输入字符,直到找到一个匹配的模式。
如果能够找到一个匹配的模式,Lex
就执行相关的动作(可能包括返回一个标记)。
另一方面,如果没有可以匹配的常规表达式,将会停止进一步的处理,Lex
将显示一个错误消息。

Lex 和 C 是强耦合的。一个
.lex 文件(Lex 文件具有
.lex 的扩展名)通过 lex 公用程序来传递,并生成 C
的输出文件。这些文件被编译为词法分析器的可执行版本。


1

标签