Yacc

Yacc
原始作者斯蒂芬·约翰逊(Stephen C. Johnson)
存储库
  • www.tuhs.org/cgi-bin/utree.pl?file=v6%2FUSR%2FSource%2Fyacc
写在C
作业系统Unix类似于Unix计划9Inferno
平台跨平台
类型命令
执照计划9:麻省理工学院许可证

YACC另一个编译器组合商)是Stephen C. Johnson开发的UNIX操作系统的计算机程序。它是一个从左到右的左右最右边的推导(LALR)解析器,生成了LALR解析器编译器的一部分,试图使源代码对源代码具有句法意义),基于正式的语法,以类似于符号的符号编写。 Backus – Naur形式(BNF)。 YACC作为BSD和AT&T Unix的标准实用程序提供。基于GNULinux分布包括野牛,是向前兼容的YACC更换。

历史

在1970年代初,贝尔实验室/ AT&T计算机科学家斯蒂芬·C·约翰逊 Stephen C.是一项艰巨的任务。结果,他由他的同事在贝尔实验室Al Aho的同事执导,唐纳德·诺斯(Donald Knuth)LR解析方面的工作,这是YACC的基础。 YACC受到TMG编译器编译器的影响并获得了其名称。

YACC最初是用B编程语言编写的,但很快就由艾伦·斯奈德(Alan Snyder)重写。它是第3版UNIX的一部分,并在1975年发布了YACC的完整描述。

约翰逊使用YACC创建了便携式C编译器Bjarne Stroustrup还试图使用YACC创建C ++的正式规范,但“被C的语法击败”。尽管发现它不适合对语言的形式规范,但Stroustrup确实使用YACC实施CFRONT ,这是C ++的首次实现。

在2008年的一次采访中,约翰逊反映了“ YACC对UnixC的传播所做的贡献是我最自豪的”。

描述

YACC的输入是一种语法,其中包含其规则附加的C代码段(称为“动作”)。它的输出是C中的Shift-Reduce解析器,一旦识别出该规则,就会立即执行与每个规则相关联的C片段。典型的动作涉及解析树木的建造。使用约翰逊的例子,如果打电话节点(标签,左,右)用指定的标签和儿童构建一个二进制解析树节点,然后是规则

expr : expr '+' expr  { $$ = node('+', $1, $3); }

识别求和表达式并为它们构建节点。特殊标识符$$$ 13美元是指解析器堆栈中的物品。

YACC仅生产一个解析器(短语分析仪),在无扫描仪解析的情况下可以单独使用,但是,完整的句法分析通常需要外部词汇分析仪才能进行令牌化阶段(单词分析),然后进行解析阶段。恰当的。词汇分析仪生成器(例如LexFlex )为此目的广泛使用。 IEEE POSIX P1003.2标准定义了LEX和YACC的功能和要求。

AT&T YACC的某些版本已成为开源。例如,源代码可与计划9的标准分布一起使用。

影响

YACC和类似程序(在很大程度上重新实现)非常受欢迎。 YACC本身曾经在大多数UNIX系统上作为默认解析器发电机可用,尽管此后已被最近的,很大程度上兼容的程序所取代,例如Berkeley YaccGNU Bison ,GNU Bison, Mks Yacc和Abraxas PcyAcc。作为Sun OpenSolaris项目的一部分,包括原始AT&T YACC的更新版本。每个YACC都提供了轻微的改进和其他功能,但是概念和基本语法保持不变。

在最初用YACC实施的语言中,有AWKC ++EQNPIC 。 YACC还在UNIX上用于实施便携式C编译器,以及用于诸如Fortran 77RatforAPLBCM4等的编程语言的解析器。

YACC还已重写其他语言,包括OcamlRatforMLAdaPascalJava ,Python, PythonRubyGoCommon LispErlang

也可以看看