yacc [ -dlrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename
Yacc 从 filename 所指定的文件中读出文法(grammar)定义,并为之生成 一个 LR(1) 分析器。分析器是由一系列 LALR(1)分析表和用 C 语言写的 驱动例程组成。通常把分析表和驱动例程写到文件 y.tab.c 中。
译注:余在翻译有关编译原理的东西时,总是区别语法(Syntax)和文法 (grammar)。驱动例程指的是自动生成的 yyparse 函数和相关函数的源代 码。Yacc和 Lex 自动生成的常量、变量、结构,函数等的名称通常以 yy 为前缀,目的是不与用户自己的 C 程序定义的名称冲突。LALR(1)文法的 分析是通过在堆栈上通过移进(shift)和归约(reduce)实现的,任何经过良 好设计的语言(例如 Lisp,C,Perl,C++,Java),用LALR(1)实现起来是容易, 高效和可靠的。
可得到下面的参数:
如果设置了环境变量TMPDIR,TMPDIR 所指定的字符串将被用作生成临时文件 的路径名。
y.code.c
y.tab.c
y.tab.h
y.output
/tmp/yacc.aXXXXXX
/tmp/yacc.tXXXXXX
/tmp/yacc.uXXXXXX
如果有些规则永不归约,在标准错误输出上报告这些规则的数目。 如果有任何 LALR(1) 冲突,在标准错误输出上报告这些冲突的数目。
译注:规则永不归约通常出现在文法有二义性规则的时候,术语叫 归约-归约冲突。LALR(1) 冲突术语上叫移进-归约冲突,解决的方法 一种是 Lisp 风格的语言的括号总动员,一种是 C 风格的语言的优先 级排座次,还有一种是结构化的解决方法例如 Fortran77 的IF...ENDIF 及 Algol68 的if...fi。C 风格语言的一个标志就是至少有一个 从 Algol60 至今死不改悔的移进-归约冲突--都是else(悬挂)惹的祸。 只要你清楚并让用户知道,有移进-归约冲突可以是正常的,不象 归约-归约冲突那样必须避免。
mhss
推荐: 编译原理及实践/(美)Kenneth C. Louden著. -北京: 机械工业出版社, 2000.3 ¥39。 实践出真知,无有捷径。读 byacc 的源程序是艰苦的事情, 但能澄清 一些似是而非的认识, 亲历编程的精真妙明的境界, 虽无大的实际利益, 毕竟是聊胜于无。在娑婆世界中, 一个完整的美梦是十分珍贵的。 仁者, 何妨一试。
推荐: 编译原理/吕映芝等著. -北京: 清华大学出版社,1998.1 ¥21。 余见到 LL(2) 感到很欣慰。余以为是改进消除左递归和提取左因子的 算法就可以解决的事情,故不应是学术问题。余不懂学术,若妄言之, 大人有大量,请海涵了。
2000/11/13
http://cmpp.linuxforum.net