yacc 命令
用途
从与上下文无关的语法规范所组成的输入生成 LALR(1) 语法分析程序。
语法
亚克 [ -b 前缀 ] [ -C ] [ -d ] [ -我 ] [ -恩数字 ] [ -尼姆数字 ] [ -恩尔数字 ] [ -p 前缀 ] [ -s ] [ -t ] [ -v ] [ -是 路径 ] 语法
描述
yacc 命令将与上下文无关的语法规范转换成一组表格,执行 LALR(1) 分析算法的简单自动机会用到该组表格。 语法可能是有歧义的;此时,使用指定的优先规则来解决语法的二义性。
必须用 C 语言编译器编译输出文件 y.tab.c,以生成 yyparse 函数。 这个函数必须 由 yylex 词法分析器,main 子例程以及 yyerror 错误处理子例程(必须提供这些子例程)装入。 lex 命令 对创建可供 yyparse 子例程使用的词法分析器很有用。 简化版本 的 main 和 yyerror 子例程通过 yacc 库 liby.a 可以得到。 而且,yacc 能够用来生成 C++ 输出。
可以用 -DYACC_MSG 选项编 译 yacc 生成的 C 文 件(y.tab.c)来包含使用消息工具必需的代码。 当在编译时使用该选项,由 yyparse 子例程和 YYBACKUP 宏生成的错误消息 会从 yacc_user.cat 目录中抽取。
这允许在非英语语言环境中以不同于英语的语言接收错误消息。 如果找不到目录或打不开目录,yyparse 和 YYBACKUP 子 例程显示缺省英文消息。
yacc 命令 受 LANG、LC_ALL、 LC_CTYPE 和 LC_MESSAGES 环境变量影响。
标志
| 项 | 描述 |
|---|---|
| -b 前缀 | 使用 Prefix 取代 y 作为所有输出 文件名的前缀。 代码文件 y.tab.c,头文件 y.tab.h(在 -d 指定时创建)和描述文件 y.output( 在 -v 指定时创建) 分别更改为 Prefix.tab.c、Prefix.tab.h 和 Prefix.output。 |
| -C | 为和 C++ 编译器配合使用而生成 y.tab.C 文件以取代 y.tab.c 文件。 要使用输入输出的 I/O 流库,定义宏 _CPP_IOSTREAMS。 |
| -d | 生成文件 y.tab.h。 这包含将 亚克分配的令牌代码与您的令牌名称相关联的 #define 语句。 这允许除了 y.tab.c 的源文件通过包含头文件来访问标记代码。 |
| -l | 不包含 y.tab.c中的任何 #line 构造。 仅在完全调试语法和相关操作后使用此选项。 |
| -恩数字 | 将标记名和非终端名数组的大小更改为 Number。 缺省值为 8000。 有效值应该大于 8000。 |
| -尼姆数字 | 将内存状态数组大小更改为 Number。 缺省值为 40000。 有效值应该大于 40000。 |
| -恩尔数字 | 更改内部缓冲区大小以处理大型语法。 缺省值为 2000。 有效值应该大于 2000。 |
| -p 前缀 | 使用 Prefix 取代 yy 作为 所有由 yacc 命令创建的文件外部名的前缀。 受影响的外部名称包括: 耶恰尔, 伊勒瓦尔, yydebug, yyparse (), yylex ()和 yyerror ()。 (以前, -p 用于指定备用解析器; 现在,可以使用 -是路径 来指定备用解析器。) |
| -s | 将 yyparse 函数分解成几个更小的函数。 由于该函数的大小多少和它的语法成比例,这样有可能 yyparse 函数变得太大无法编译、优化或有效地执行。 |
| -t | 编译运行时的调试代码。 缺省方式下,在编译 y.tab.c 时不包含这些代码。 然而,运行时调试代码是由预处理器宏 YYDEBUG 控制的。 如果 YYDEBUG 有非零值,C 编译器(cc)包含调试代码,而不管是否
使用 -t 标志。 如果不想将调试代码包含在编译器中,YYDEBUG 的值应该为 0。 在不编译这个代码的情况下,yyparse 子例程将会有更快的执行速度。 -t 标志会导致对调试代码的编译,但实际上它不打开调试方式。 要获取调试输出,必须通过添加 C 语言声明来设置 yydebug 变量。int yydebug=1到 亚克 语法文件的声明部分,或者通过设置 yydebug 到 Dbx。 |
| -v | 准备文件 y.output。 它包含可读的语法分析表描述和由于文法二义性而生成的冲突报告。 |
| -是 路径 | 使用由 Path 而不是缺省的 /usr/lib/yaccpar 文件来指定的解析器原型。 (以前,-p 用来指定备用解析器。) |
退出状态
本命令返回以下退出值:
| 项 | 描述 |
|---|---|
| 重大安全事件数量 | 成功完成。 |
| >0 | 发生错误。 |
示例
- 以下命令:
从 grammar.y 文件提取 yacc 规则,并 将输出置于 y.tab.c。yacc grammar.y - 以下命令:yacc -d grammar.y与示例 1 的作用相同,但它也产生 y.tab.h 文件,对于 grammar.y 文件中定义的每个标记,该文件 包含 C 风格的 #define 语句。
文件
| 项 | 描述 |
|---|---|
| y.output | 包含可读的语法分析表描述和由于语法二义性而生成的冲突报告。 |
| y.tab.c | 包含输出文件。 |
| y.tab.h | 包含标记名的定义。 |
| yacc.tmp | 临时文件。 |
| yacc.debug | 临时文件。 |
| yacc.acts | 临时文件。 |
| /usr/ccs/lib/yaccpar | 包含 C 程序的解析器原型。 |
| /usr/ccs/lib/liby.a | 包含运行时程序库。 |