NAME 名字
Yacc - 一个生成 LALR(1) 文法分析器的程序
SYNOPSIS 总览
yacc [ -dlrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename
DESCRIPTION 描述
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)实现起来是容易,高效和可靠的。
可得到下面的参数:
- -b file_prefix
- -b 选项改变的是为输出的文件名准备的前缀,这个字符串用 file_prefix 指定,缺省的前缀是 y.。
- -d
- -d -d 选项导致多写一个 y.tab.h 头文件。(包含一些词法定义)
- -l
- 如果没有指定 -l 选项,则 yacc 将在生成的代码中插入 #line 宏命令 (directive)。 #line 宏命令用于让 C 编译器把在生成的 C 代码中的错误与用户的原始 yacc 代码联系起来。如果指定了 -l 选项,yacc 将不插入 #line 宏命令。用户指定的 #line 宏命令还是将被保留的。
- -p symbol_prefix
- -p 选项改变的是为 Yacc生成的符号(symbols)准备的前缀,这个字符串用 symbol_prefix 指定,缺省的前缀是 yy。
- -r
- -r 选项导致 yacc 生成生成分开的代码和表文件。代码文件名是 y.code.c,表文件名是 y.tab.c。
- -t
- -t 选项更改 Yacc 生成的预处理宏命令,这样调试语句就会被结合到编译后的代码中。
- -v
- -v 选项导致在文件 y.output 中写出可被人阅读的对生成的分析器的描述。
如果设置了环境变量TMPDIR,TMPDIR 所指定的字符串将被用作生成临时文件的路径名。
FILES 相关文件
y.code.c
y.tab.c
y.tab.h
y.output
/tmp/yacc.aXXXXXX
/tmp/yacc.tXXXXXX
/tmp/yacc.uXXXXXX
DIAGNOSTICS 诊断
如果有些规则永不归约,在标准错误输出上报告这些规则的数目。如果有任何 LALR(1) 冲突,在标准错误输出上报告这些冲突的数目。
译注:规则永不归约通常出现在文法有二义性规则的时候,术语叫归约-归约冲突。LALR(1) 冲突术语上叫移进-归约冲突,解决的方法一种是 Lisp 风格的语言的括号总动员,一种是 C 风格的语言的优先级排座次,还有一种是结构化的解决方法例如 Fortran77 的IF...ENDIF 及 Algol68 的if...fi。C 风格语言的一个标志就是至少有一个从 Algol60 至今死不改悔的移进-归约冲突--都是else(悬挂)惹的祸。只要你清楚并让用户知道,有移进-归约冲突可以是正常的,不象归约-归约冲突那样必须避免。
#p#
NAME
yacc - an LALR(1) parser generator
SYNOPSIS
[-dlrtv ] [-b file_prefix ] [-o output_filename ] [-p symbol_prefix ] filename
DESCRIPTION
Yacc reads the grammar specification in the file filename and generates an LR(1) parser for it. The parsers consist of a set of LALR(1) parsing tables and a driver routine written in the C programming language. Yacc normally writes the parse tables and the driver routine to the file y.tab.c
The following options are available:
- -b file_prefix
- Change the prefix prepended to the output file names to the string denoted by file_prefix The default prefix is the character y
- -d
- Cause the header file y.tab.h to be written.
- -l
- If the -l option is not specified, will insert #line directives in the generated code. The #line directives let the C compiler relate errors in the generated code to the user's original code. If the -l option is specified, will not insert the #line directives. Any #line directives specified by the user will be retained.
- -o output_filename
- Cause to write the generated code to output_filename instead of the default file, y.tab.c
- -p symbol_prefix
- Change the prefix prepended to yacc-generated symbols to the string denoted by symbol_prefix The default prefix is the string yy
- -r
- Cause to produce separate files for code and tables. The code file is named y.code.c and the tables file is named y.tab.c
- -t
- Change the preprocessor directives generated by so that debugging statements will be incorporated in the compiled code.
- -v
- Cause a human-readable description of the generated parser to be written to the file y.output
If the environment variable TMPDIR is set, the string denoted by TMPDIR will be used as the name of the directory where the temporary files are created.
FILES
- y.code.c
- y.tab.c
- y.tab.h
- y.output
- /tmp/yacc.aXXXXXXXXXX
- /tmp/yacc.tXXXXXXXXXX
- /tmp/yacc.uXXXXXXXXXX
DIAGNOSTICS
If there are rules that are never reduced, the number of such rules is reported on standard error. If there are any LALR(1) conflicts, the number of conflicts is reported on standard error.