手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

yacc(1)

名称

yacc - 用来生成编译器的编译器

用法概要

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 使用的词法分析器非常有用。

选项

支持以下选项:

–b file_prefix

使用 file_prefix 而非 y 作为所有输出文件的前缀。代码文件 y.tab.c、头文件 y.tab.h(在指定 –d 时创建)和说明文件 y.output(在指定 –v 时创建)将分别更改为 file_prefix.tab.cfile_prefix.tab.hfile_prefix.output

–d

生成文件 y.tab.h 和将 yacc 用户分配的“令牌代码”与用户声明的“令牌名称”关联的 #define 语句。通过这种关联,除 y.tab.c 之外的源文件可以访问令牌代码。

–l

指定在 y.tab.c 中生成的代码不包含任何 #line 结构。只有语法和关联的操作经过完全调试后才能使用该选项。

–p sym_prefix

使用 sym_prefix 而非 yy 作为 yacc 生成的所有外部名称的前缀。受影响的名称包括函数 yyparse()yylex()yyerror() 以及变量 yylvalyycharyydebug。(在本部分的其余地方,引用提及的这六个符号时使用其缺省名称只是为了表示起来方便。)本地名称也会受 –p 选项的影响。但是,–p 选项不会影响 yacc 生成的 #define 符号。

–P parser

使用该选项,用户可以指定自己选择的解析器而非 /usr/share/lib/ccs/yaccpar。例如,可以指定:

example% yacc -P ~/myparser parser.y
–Q[y|n]

–Qy 选项可以将版本时间戳信息放入 y.tab.c。这样一来,用户便可了解构建文件的 yacc 版本。–Qn 选项(缺省设置)不写入版本信息。

–t

缺省情况下,编译运行时调试代码。运行时调试代码始终在条件编译控制下在 y.tab.c 中生成。缺省情况下,编译 y.tab.c 时不包括该代码。无论是否使用 –t 选项,运行时调试代码都受预处理程序符号 YYDEBUG 的控制。如果 YYDEBUG 值不为零,则包括调试代码。如果其值为 0,则不包括该代码。生成时不带运行时调试代码的程序大小较小且执行速度稍快。

–v

准备文件 y.output,其中包含解析表的说明以及因语法不明确引起的冲突的相关报告。

–V

在标准错误输出中显示 yacc 的版本信息。

操作数

必须指定以下操作数:

file

文件的路径名,该文件包含要为其创建解析器的指令。

示例

示例 1 访问 yacc 库

yacc 库的访问权限可以使用 cc 的库搜索操作数获取。要使用 yaccmain,请执行以下命令:

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) 值。

退出状态

将返回以下退出值:

0

成功完成。

>0

出现错误。

文件

y.output

生成的解析器的状态转换

y.tab.c

生成的解析器的源代码

y.tab.h

生成的解析器的头文件

yacc.acts

临时文件

yacc.debug

临时文件

yacc.tmp

临时文件

yaccpar

C 程序的解析器原型

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
developer/base-developer-utilities
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

lex(1)attributes(5)environ(5)standards(5)

诊断

归约-归约冲突和移位-归约冲突的数目在标准错误输出中报告。更详细的报告可以在 y.output 文件中找到。同样,如果某些规则无法从起始符号访问,也会报告该实例。

附注

由于文件名固定不变,因此在给定时间给定目录中最多只能有一个 yacc 进程处于活动状态。

建议用户避免在任何标识符名称中使用 $