yacc [-dltVv] [-b file_prefix] [-Q [y | n]] [-P parser] [-p sym_prefix] file
yacc 命令可将上下文无关的语法转换为一组表,以便简单自动地执行 LALR(1) 解析算法。语法可以不明确。可以使用指定的优先级规则消除不明确性。
输出文件 y.tab.c 必须由 C 编译器编译才能生成函数 yyparse()。该程序必须以词法分析器程序 yylex() 以及 main() 和错误处理例程 yyerror() 装入。这些例程必须由用户提供。lex(1) 命令对于创建可供 yacc 使用的词法分析器非常有用。
支持以下选项:
使用 file_prefix 而非 y 作为所有输出文件的前缀。代码文件 y.tab.c、头文件 y.tab.h(在指定 –d 时创建)和说明文件 y.output(在指定 –v 时创建)将分别更改为 file_prefix.tab.c、file_prefix.tab.h 和 file_prefix.output。
生成文件 y.tab.h 和将 yacc 用户分配的“令牌代码”与用户声明的“令牌名称”关联的 #define 语句。通过这种关联,除 y.tab.c 之外的源文件可以访问令牌代码。
指定在 y.tab.c 中生成的代码不包含任何 #line 结构。只有语法和关联的操作经过完全调试后才能使用该选项。
使用 sym_prefix 而非 yy 作为 yacc 生成的所有外部名称的前缀。受影响的名称包括函数 yyparse()、yylex() 和 yyerror() 以及变量 yylval、yychar 和 yydebug。(在本部分的其余地方,引用提及的这六个符号时使用其缺省名称只是为了表示起来方便。)本地名称也会受 –p 选项的影响。但是,–p 选项不会影响 yacc 生成的 #define 符号。
使用该选项,用户可以指定自己选择的解析器而非 /usr/share/lib/ccs/yaccpar。例如,可以指定:
example% yacc -P ~/myparser parser.y
–Qy 选项可以将版本时间戳信息放入 y.tab.c。这样一来,用户便可了解构建文件的 yacc 版本。–Qn 选项(缺省设置)不写入版本信息。
缺省情况下,编译运行时调试代码。运行时调试代码始终在条件编译控制下在 y.tab.c 中生成。缺省情况下,编译 y.tab.c 时不包括该代码。无论是否使用 –t 选项,运行时调试代码都受预处理程序符号 YYDEBUG 的控制。如果 YYDEBUG 值不为零,则包括调试代码。如果其值为 0,则不包括该代码。生成时不带运行时调试代码的程序大小较小且执行速度稍快。
准备文件 y.output,其中包含解析表的说明以及因语法不明确引起的冲突的相关报告。
在标准错误输出中显示 yacc 的版本信息。
必须指定以下操作数:
文件的路径名,该文件包含要为其创建解析器的指令。
yacc 库的访问权限可以使用 cc 的库搜索操作数获取。要使用 yacc 库 main,请执行以下命令:
example% cc y.tab.c -ly
lex 库和 yacc 库都包含 main。要访问 yacc main,请执行以下命令:
example% cc y.tab.c lex.yy.c -ly -ll
这样可以确保首先搜索 yacc 库,以便使用其 main。
以前的 yacc 库包含两个通常由应用程序程序员编码的简单函数。这两个库函数类似于以下代码:
#include <locale.h> int main(void) { extern int yyparse(); setlocale(LC_ALL, ""); /* If the following parser is one created by lex, the application must be careful to ensure that LC_CTYPE and LC_COLLATE are set to the POSIX locale. */ (void) yyparse(); return (0); } #include <stdio.h> int yyerror(const char *msg) { (void) fprintf(stderr, "%s\n", msg); return (0); }
有关影响 yacc 执行的环境变量 LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH 的说明,请参见 environ(5)。
yacc 可以将 EUC 主代码集和补充代码集中的字符作为一个令牌的符号进行处理。EUC 代码只能是带引号的单字符终端符号。对于这些一个令牌的符号,yacc 要求 yylex() 返回宽字符 (wchar_t) 值。
将返回以下退出值:
成功完成。
出现错误。
生成的解析器的状态转换
生成的解析器的源代码
生成的解析器的头文件
临时文件
临时文件
临时文件
C 程序的解析器原型
有关下列属性的说明,请参见 attributes(5):
|
lex(1)、attributes(5)、environ(5)、standards(5)
归约-归约冲突和移位-归约冲突的数目在标准错误输出中报告。更详细的报告可以在 y.output 文件中找到。同样,如果某些规则无法从起始符号访问,也会报告该实例。
由于文件名固定不变,因此在给定时间给定目录中最多只能有一个 yacc 进程处于活动状态。
建议用户避免在任何标识符名称中使用 $。