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 子例程通过 yaccliby.a 可以得到。 而且,yacc 能够用来生成 C++ 输出。

可以用 -DYACC_MSG 选项编 译 yacc 生成的 C 文 件(y.tab.c)来包含使用消息工具必需的代码。 当在编译时使用该选项,由 yyparse 子例程和 YYBACKUP 宏生成的错误消息 会从 yacc_user.cat 目录中抽取。

这允许在非英语语言环境中以不同于英语的语言接收错误消息。 如果找不到目录或打不开目录,yyparseYYBACKUP 子 例程显示缺省英文消息。

yacc 命令 受 LANGLC_ALL LC_CTYPELC_MESSAGES 环境变量影响。

标志

表 1. 标志
描述
-b 前缀 使用 Prefix 取代 y 作为所有输出 文件名的前缀。 代码文件 y.tab.c,头文件 y.tab.h(在 -d 指定时创建)和描述文件 y.output( 在 -v 指定时创建) 分别更改为 Prefix.tab.cPrefix.tab.hPrefix.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 命令创建的文件外部名的前缀。 受影响的外部名称包括: 耶恰尔伊勒瓦尔yydebugyyparse ()yylex ()yyerror ()。 (以前, -p 用于指定备用解析器; 现在,可以使用 -是路径 来指定备用解析器。)
-s yyparse 函数分解成几个更小的函数。 由于该函数的大小多少和它的语法成比例,这样有可能 yyparse 函数变得太大无法编译、优化或有效地执行。
-t 编译运行时的调试代码。 缺省方式下,在编译 y.tab.c 时不包含这些代码。 然而,运行时调试代码是由预处理器宏 YYDEBUG 控制的。 如果 YYDEBUG 有非零值,C 编译器(cc)包含调试代码,而不管是否 使用 -t 标志。 如果不想将调试代码包含在编译器中,YYDEBUG 的值应该为 0。 在不编译这个代码的情况下,yyparse 子例程将会有更快的执行速度。

-t 标志会导致对调试代码的编译,但实际上它不打开调试方式。 要获取调试输出,必须通过添加 C 语言声明来设置 yydebug 变量。int yydebug=1亚克 语法文件的声明部分,或者通过设置 yydebugDbx

-v 准备文件 y.output。 它包含可读的语法分析表描述和由于文法二义性而生成的冲突报告。
-是 路径 使用由 Path 而不是缺省的 /usr/lib/yaccpar 文件来指定的解析器原型。 (以前,-p 用来指定备用解析器。)

退出状态

本命令返回以下退出值:

表 2。 退出状态
描述
重大安全事件数量 成功完成。
>0 发生错误。

示例

  1. 以下命令:
    yacc grammar.y
    grammar.y 文件提取 yacc 规则,并 将输出置于 y.tab.c
  2. 以下命令:
    yacc  -d grammar.y
    与示例 1 的作用相同,但它也产生 y.tab.h 文件,对于 grammar.y 文件中定义的每个标记,该文件 包含 C 风格的 #define 语句。

文件

表 3。 文件
描述
y.output 包含可读的语法分析表描述和由于语法二义性而生成的冲突报告。
y.tab.c 包含输出文件。
y.tab.h 包含标记名的定义。
yacc.tmp 临时文件。
yacc.debug 临时文件。
yacc.acts 临时文件。
/usr/ccs/lib/yaccpar 包含 C 程序的解析器原型。
/usr/ccs/lib/liby.a 包含运行时程序库。