yacc(Yet Another Compiler Compiler),是Unix/Linux上一个用来生成编译器的编译器(编译器代码生成器)。yacc生成的编译器主要是用C语言写成的语法解析器(Parser),需要与词法解析器Lex一起使用,再把两部份产生出来的C程序一并编译。yacc本来只在Unix系统上才有,但现时已普遍移植往Windows及其他平台。
分析程序生成器(parser generator)是一个指定某个格式中的一种语言的语法作为它的输入,并为该种语言产生分析过程以作为它的输出的程序。在历史上,分析程序生成器被称作编译-编译程序( compiler- compiler ),这是由于按照规律可将所有的编译步骤作为包含在分析程序中的动作来执行。现在的观点是将分析程序仅考虑为编译处理的一个部分,所以这个术语也就有些过时了。合并 LALR(1) 分析算法是一种常用的分析生成器,它被称作 Yacc( yet another compiler- compiler )。给出 Yacc 的概貌来,将使用Yacc为 TINY 语言开发一个分析程序。
作为 Yacc 对说明文件中的 %token NUMBER 声明的对应。Yacc 坚持定义所有的符号记号本身,而不是从别的地方引入一个定义。但是却有可能通过在记号声明中的记号名之后书写一个值来指定将赋给记号的数字值。
yacc的输入是巴科斯范式(BNF)表达的语法规则以及语法规约的处理代码,Yacc输出的是基于表驱动的编译器,包含输入的语法规约的处理代码部分。
yacc是开发编译器的一个有用的工具,采用LALR(1)语法分析方法。
Yacc最初由AT&T的Steven C. Johnson为Unix操作系统开发,后来一些兼容的程序如Berkeley Yacc,GNU bison,MKS yacc和Abraxas yacc陆续出现。它们都在原先基础上做了少许改进或者增加,但是基本概念是相同的。
由于所产生的解析器需要词法分析器配合,因此Yacc经常和词法分析器的产生器——一般就是Lex——联合使用。IEEE POSIX P1003.2 标准定义了Lex和Yacc的功能和需求。
http://dickey.his.com/byacc/byacc.html Berkeley Yacc 一般认为是目前最好的yacc变种。与bison相比,避免了对特定编译器的依赖。
http://www.informatik.uni-freiburg.de/proglang/software/essence/ Essence,Scheme的LR(1)语法解析器的生成器
http://download.plt-scheme.org/scheme/plt/collects/parser-tools/ 用于DrScheme的语法解析工具
http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/ Coco/R Java和C#的扫描和解析器
http://mhss.nease.net/unix/yacc.html Yacc: 另一个编译器的编译器,Stephen C. Johnson
IBM的快速入门
http://www.ibm.com/developerworks/cn/linux/sdk/lex/
windows下的lex与yacc工具
只所以推荐它是因为它生成的c文件可以在vc++下通过编译。
下载地址 http://www.bumblebeesoftware.com/downloads.htm
下载之后,解压缩,然后安装。打开集成开发环境,点项目Project菜单,在下拉菜单中选LibBuilder,弹出LibBuilder对话框选择属性按钮
弹出compiler properties 对话框,
Name 选择Visual C++ (32-bit)
Directory :msvc32
options:
依次为
vc++版本(Versoin 7(.net))。
是否支持unicode码。
是否把w_char_t作为内建类型。
下边是VC的各种目录:
依次为
Compiler Bin Directory (C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\BIN)
Compiler Bin Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\COMMON7\IDE)
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\INCLUDE)
Compiler Include Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\INCLUDE)
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\LIB)
Compiler Library Directory(C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO .NET 2003\VC7\PLATFORMSDK\LIB)
注意:括号里边的是我自己编译器安装目录,也许你的和我的不一样,需要做相应的调整。
所有的这些设置完成之后点ok。返回LibBuilder。点Build就可以编译vc++使用的lex与yacc的lib库。生成库文件在软件安装目录下的D:\Parser Generator 2\Cpp\Lib\msvc32目录下。
然后我们我们在vc++环境设置中增加包含文件目录D:\Parser Generator 2\Cpp\Include
lib库目录D:\Parser Generator 2\Cpp\Lib\msvc32
具体设置
打开VC++.net集成开发环境。
点工具菜单
下拉菜单中点选项菜单。
弹出框中点左边列表框中的projects,然后点击vc++目录
在显示以下内容目录标签下的列表框中“选包含目录”进行设置,选“库文件”进行设置。
具体设置就是点击列表框下边五个按钮中的第二个按钮,就加入一行,当选择“包含目录”的时候填入D:\Parser Generator 2\Cpp\Include,当选择“库文件”的时候填入D:\Parser Generator 2\Cpp\Lib\msvc32,也可以点右边的浏览按钮进行选择。
这样设置之后我们就可以用vc++编译用Parser Generator 2生成的c文件。具体为
打开Parser Generator 2集成开发环境。
点击Project菜单,点击下拉菜单中的ParseWizard菜单,一路下去建立一个工程。然后点击project菜单下的的Rebuild All。在项目文件夹下就生成了相应c文件与h文件。
用VC++建立一个空控制台工程,然后把用用Parser Generator 2生成的c文件加入工程中。最后引入响应的库文件,就是我们在D:\Parser Generator 2\Cpp\Lib\msvc32目录下生成的lex与yacc库文件。接着编译,如果成功,那么万事大吉。