AIX命令参考大全,卷 6,v - z - yacc 命令

[ 页的底部 | 上一页 | 下一页 | 目录 | 索引 | 法律条款 ]

AIX命令参考大全,卷 6,v - z

yacc 命令

用途

从与上下文无关的语法规范所组成的输入生成 LALR(1) 语法分析程序。

语法

yacc-b Prefix ] [ -C ] [  -d ] [ -l ] [ -NnNumber ] [  -NmNumber ] [ -NrNumber ] [  -p Prefix ] [  -s ] [  -t ] [  -v ] [ -y Path ] Grammar

描述

yacc 命令将与上下文无关的语法规范转换成一组表格,执行 LALR(1) 分析算法的简单自动机会用到该组表格。语法可能是有歧义的;此时,使用指定的优先规则来解决语法的二义性。

必须用 C 语言编译器编译输出文件 y.tab.c,以生成 yyparse 函数。这个函数必须 由 yylex 词法分析器,main 子例程以及 yyerror 错误处理子例程(必须提供这些子例程)装入。lex 命令 对创建可供 yyparse 子例程使用的词法分析器很有用。简化版本 的 mainyyerror 子例程通过 yaccliby.a 可以得到。而且,yacc 能够用来生成 C++ 输出。

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

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

yacc 命令 受 LANGLC_ALLLC_CTYPELC_MESSAGES 环境变量影响。

标志

-b Prefix 使用 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 语句,该语句将 yacc 分配的标记代码 与标记名关联起来。这允许除了 y.tab.c 的源文件通过包含头文件来访问标记代码。
-l y.tab.c 中不包含 任何 #line 构造。只在语法和关联操作全都调试过后才使用这个标记。
-NnNumber 将标记名和非终端名数组的大小更改为 Number。缺省值是 8000。有效值应该大于 8000。
-NmNumber 将内存状态数组大小更改为 Number。缺省值是 40000。有效值应该大于 40000。
-NrNumber 更改内部缓冲区大小以处理大型语法。缺省值是 2000。有效值应该大于 2000。
-p Prefix 使用 Prefix 取代 yy 作为 所有由 yacc 命令创建的文件外部名的前缀。受影响的外部名包 括:yycharyylvalyydebugyyparse( )yylex( )yyerror( )。(以前,-p 被用来指定备用解析器; 现在 -yPath 可以用来指定备用解析器。)
-s yyparse 函数分解成几个更小的 函数。由于该函数的大小多少和它的文法成比例,这样有可能 yyparse 函数变得太大无法编译、优化或有效地执行。
-t 编译运行时的调试代码。缺省方式下,在编译 y.tab.c 时不包含这些代码。然而,运行时调试代码是由 预处理器宏 YYDEBUG 控制的。如果 YYDEBUG 有 非零值,C 编译器(cc)包含调试代码,而不管是否 使用 -t 标志。如果不想将调试代码包含在编译器 中,YYDEBUG 应该值为 0。在不编译这个代码的情况 下,yyparse 子例程将会有更快 的执行速度。

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

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

退出状态

本命令返回以下出口值:

0 成功完成。
>0 发生错误。

示例

  1. 以下命令:

    yacc grammar.y

    grammar.y 文件提取 yacc 规则,并 将输出置于 y.tab.c

  2. 以下命令:
    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 包含运行时程序库。

相关信息

lex 命令。

AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的 Creating an Input Language with the lex and yacc Commands

AIX 5L Version 5.2 General Programming Concepts: Writing and Debugging Programs 中的 Example program for the lex and yacc programs

[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 | 法律条款 ]