语法分析器生成工具 YACC
openkk
13年前
<p>Yacc 代表 Yet Another Compiler Compiler。 Yacc 的 GNU 版叫做 Bison。它是一种工具,将任何一种编程语言的所有语法翻译成针对此种语言的 Yacc 语 法解析器。它用巴科斯范式(BNF, Backus Naur Form)来书写。按照惯例,Yacc 文件有 .y 后缀。编译行如下调用 Yacc 编译器:</p> <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%"> <tbody> <tr> <td class="code-outline"><pre class="displaycode"> $ yacc <options> <filename ending with .y></pre></td> </tr> </tbody> </table> <br /> <p>在进一步阐述以前,让我们复习一下什么是语法。在上一节中,我们看到 Lex 从输入序列中识别标记。如果你在查看标记序列,你可能想在这一序列出现时执行某一动作。这种情况下有效序列的规范称为语法。Yacc 语法文件包括这一语法规范。它还包含了序列匹配时你想要做的事。</p> <p>为了更加说清这一概念,让我们以英语为例。 这一套标记可能是:名词, 动词, 形容词等等。为了使用这些标记造一个语法正确的句子,你的结构必须符合一定的规则。一个简单的句子可能是名词+动词或者名词+动词+名词。(如 I care. See spot run.)</p> <p>所以在我们这里,标记本身来自语言(Lex),并且标记序列允许用 Yacc 来指定这些标记(标记序列也叫语法)。</p> <p>用 Yacc 来创建一个编译器包括四个步骤:</p> <ol> <li>通过在语法文件上运行 Yacc 生成一个解析器。</li> <li>说明语法: <ul> <li>编写一个 .y 的语法文件(同时说明 C 在这里要进行的动作)。</li> <li>编写一个词法分析器来处理输入并将标记传递给解析器。 这可以使用 Lex 来完成。</li> <li>编写一个函数,通过调用 yyparse() 来开始解析。</li> <li>编写错误处理例程(如 yyerror())。</li> </ul> </li> <li>编译 Yacc 生成的代码以及其他相关的源文件。</li> <li>将目标文件链接到适当的可执行解析器库。</li> </ol> <p><strong>项目主页:</strong><a href="http://www.open-open.com/lib/view/home/1325298492499" target="_blank">http://www.open-open.com/lib/view/home/1325298492499</a></p>