Yacc
原始作者 | 斯蒂芬·约翰逊(Stephen C. Johnson) |
---|---|
存储库 |
|
写在 | C |
作业系统 | Unix ,类似于Unix ,计划9 , Inferno |
平台 | 跨平台 |
类型 | 命令 |
执照 | 计划9:麻省理工学院许可证 |
YACC (另一个编译器组合商)是Stephen C. Johnson开发的UNIX操作系统的计算机程序。它是一个从左到右的左右最右边的推导(LALR)解析器,生成了LALR解析器(编译器的一部分,试图使源代码对源代码具有句法意义),基于正式的语法,以类似于符号的符号编写。 Backus – Naur形式(BNF)。 YACC作为BSD和AT&T Unix的标准实用程序提供。基于GNU的Linux分布包括野牛,是向前兼容的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对Unix和C的传播所做的贡献是我最自豪的”。
描述
YACC的输入是一种语法,其中包含其规则附加的C代码段(称为“动作”)。它的输出是C中的Shift-Reduce解析器,一旦识别出该规则,就会立即执行与每个规则相关联的C片段。典型的动作涉及解析树木的建造。使用约翰逊的例子,如果打电话节点(标签,左,右)用指定的标签和儿童构建一个二进制解析树节点,然后是规则
expr : expr '+' expr { $$ = node('+', $1, $3); }
识别求和表达式并为它们构建节点。特殊标识符$$ , $ 1和3美元是指解析器堆栈中的物品。
YACC仅生产一个解析器(短语分析仪),在无扫描仪解析的情况下可以单独使用,但是,完整的句法分析通常需要外部词汇分析仪才能进行令牌化阶段(单词分析),然后进行解析阶段。恰当的。词汇分析仪生成器(例如Lex或Flex )为此目的广泛使用。 IEEE POSIX P1003.2标准定义了LEX和YACC的功能和要求。
AT&T YACC的某些版本已成为开源。例如,源代码可与计划9的标准分布一起使用。
影响
YACC和类似程序(在很大程度上重新实现)非常受欢迎。 YACC本身曾经在大多数UNIX系统上作为默认解析器发电机可用,尽管此后已被最近的,很大程度上兼容的程序所取代,例如Berkeley Yacc , GNU Bison ,GNU Bison, Mks Yacc和Abraxas PcyAcc。作为Sun OpenSolaris项目的一部分,包括原始AT&T YACC的更新版本。每个YACC都提供了轻微的改进和其他功能,但是概念和基本语法保持不变。
在最初用YACC实施的语言中,有AWK , C ++ , EQN和PIC 。 YACC还在UNIX上用于实施便携式C编译器,以及用于诸如Fortran 77 , Ratfor , APL , BC , M4等的编程语言的解析器。
YACC还已重写其他语言,包括Ocaml , Ratfor , ML , Ada , Pascal , Java ,Python, Python , Ruby , Go , Common Lisp和Erlang 。
- 伯克利YACC :由于其性能和缺乏重复使用限制,因此伯克利实施YACC的实施迅速比AT&T YACC本身更加流行。
- LALR解析器:YACC生成的解析器中的基础解析算法。
- 野牛:Yacc的GNU版本。
- Lex (和Flex词汇分析仪),这是一种与YACC(和野牛)结合使用的令牌解析器。
- BNF是用于表达无上下文语法的元语法:这是描述无上下文语言的正式方式。
- Ply(Python Lex-Yacc)是Python中Lex和Yacc的替代实现。