Manpages

NAME

Yacc − 一 个 生 成 LALR(1) 文 法 分 析 器 的 程 序

SYNOPSIS 总 览

yacc [ -dlrtv ] [ -b file_prefix ] [ -p symbol_prefix ] filename

DESCRIPTION 描 述

Yacc 从 filename 所 指 定 的 文 件 中 读 出 文 法 (grammar)定 义 , 并 为 之 生 成 一 个 LR(1) 分 析 器 。 分 析 器 是 由 一 系 列 LALR(1)分 析 表 和 用 C 语 言 写 的 驱 动 例 程 组 成 。 通 常 把 分 析 表 和 驱 动 例 程 写 到 文 件 y.tab.c 中 。

译 注 : 余 在 翻 译 有 关 编 译 原 理 的 东 西 时 , 总 是 区 别 语 法 (Syntax)和 文 法 (grammar)。 驱 动 例 程 指 的 是 自 动 生 成 的 yyparse 函 数 和 相 关 函 数 的 源 代 码 。 Yacc和 Lex 自 动 生 成 的 常 量 、 变 量 、 结 构 , 函 数 等 的 名 称 通 常 以 yy 为 前 缀 , 目 的 是 不 与 用 户 自 己 的 C 程 序 定 义 的 名 称 冲 突 。 LALR(1)文 法 的 分 析 是 通 过 在 堆 栈 上 通 过 移 进 (shift)和 归 约 (reduce)实 现 的 , 任 何 经 过 良 好 设 计 的 语 言 (例 如 Lisp,C,Perl,C++,Java), 用 LALR(1)实 现 起 来 是 容 易 , 高 效 和 可 靠 的 。

可 得 到 下 面 的 参 数 :

-b file_prefix

-b 选 项 改 变 的 是 为 输 出 的 文 件 名 准 备 的 前 缀 , 这 个 字 符 串 用 file_prefix 指 定 , 缺 省 的 前 缀 是 y.。

-d

-d -d 选 项 导 致 多 写 一 个 y.tab.h 头 文 件 。 (包 含 一 些 词 法 定 义 )

-l

如 果 没 有 指 定 -l 选 项 , 则 yacc 将 在 生 成 的 代 码 中 插 入 #line 宏 命 令 (directive)。 #line 宏 命 令 用 于 让 C 编 译 器 把 在 生 成 的 C 代 码 中 的 错 误 与 用 户 的 原 始 yacc 代 码 联 系 起 来 。 如 果 指 定 了 -l 选 项 , yacc 将 不 插 入 #line 宏 命 令 。 用 户 指 定 的 #line 宏 命 令 还 是 将 被 保 留 的 。

-p symbol_prefix

-p 选 项 改 变 的 是 为 Yacc生 成 的 符 号 (symbols)准 备 的 前 缀 , 这 个 字 符 串 用 symbol_prefix 指 定 , 缺 省 的 前 缀 是 yy。

-r

-r 选 项 导 致 yacc 生 成 生 成 分 开 的 代 码 和 表 文 件 。 代 码 文 件 名 是 y.code.c, 表 文 件 名 是 y.tab.c。

-t

-t 选 项 更 改 Yacc 生 成 的 预 处 理 宏 命 令 , 这 样 调 试 语 句 就 会 被 结 合 到 编 译 后 的 代 码 中 。

-v

-v 选 项 导 致 在 文 件 y.output 中 写 出 可 被 人 阅 读 的 对 生 成 的 分 析 器 的 描 述 。

如 果 设 置 了 环 境 变 量 TMPDIR, TMPDIR 所 指 定 的 字 符 串 将 被 用 作 生 成 临 时 文 件 的 路 径 名 。

FILES 相 关 文 件

y.code.c
y.tab.c
y.tab.h
y.output
/tmp/yacc.aXXXXXX
/tmp/yacc.tXXXXXX
/tmp/yacc.uXXXXXX

DIAGNOSTICS 诊 断

如 果 有 些 规 则 永 不 归 约 , 在 标 准 错 误 输 出 上 报 告 这 些 规 则 的 数 目 。 如 果 有 任 何 LALR(1) 冲 突 , 在 标 准 错 误 输 出 上 报 告 这 些 冲 突 的 数 目 。

译 注 : 规 则 永 不 归 约 通 常 出 现 在 文 法 有 二 义 性 规 则 的 时 候 , 术 语 叫 归 约 -归 约 冲 突 。 LALR(1) 冲 突 术 语 上 叫 移 进 -归 约 冲 突 , 解 决 的 方 法 一 种 是 Lisp 风 格 的 语 言 的 括 号 总 动 员 , 一 种 是 C 风 格 的 语 言 的 优 先 级 排 座 次 , 还 有 一 种 是 结 构 化 的 解 决 方 法 例 如 Fortran77 的 IF...ENDIF 及 Algol68 的 if...fi。 C 风 格 语 言 的 一 个 标 志 就 是 至 少 有 一 个 从 Algol60 至 今 死 不 改 悔 的 移 进 -归 约 冲 突 --都 是 else(悬 挂 )惹 的 祸 。 只 要 你 清 楚 并 让 用 户 知 道 , 有 移 进 -归 约 冲 突 可 以 是 正 常 的 , 不 象 归 约 -归 约 冲 突 那 样 必 须 避 免 。

[中 文 版 维 护 人 ]

mhss

推 荐 : 编 译 原 理 及 实 践 /(美 )Kenneth C. Louden著 . -北 京 : 机 械 工 业 出 版 社 , 2000.3 ¥ 39。 实 践 出 真 知 , 无 有 捷 径 。 读 byacc 的 源 程 序 是 艰 苦 的 事 情 , 但 能 澄 清 一 些 似 是 而 非 的 认 识 , 亲 历 编 程 的 精 真 妙 明 的 境 界 , 虽 无 大 的 实 际 利 益 , 毕 竟 是 聊 胜 于 无 。 在 娑 婆 世 界 中 , 一 个 完 整 的 美 梦 是 十 分 珍 贵 的 。 仁 者 , 何 妨 一 试 。

推 荐 : 编 译 原 理 /吕 映 芝 等 著 . -北 京 : 清 华 大 学 出 版 社 ,1998.1 ¥ 21。 余 见 到 LL(2) 感 到 很 欣 慰 。 余 以 为 是 改 进 消 除 左 递 归 和 提 取 左 因 子 的 算 法 就 可 以 解 决 的 事 情 , 故 不 应 是 学 术 问 题 。 余 不 懂 学 术 , 若 妄 言 之 , 大 人 有 大 量 , 请 海 涵 了 。

[中 文 版 最 新 更 新 ]

2000/11/13

《 中 国 Linux论 坛 man手 册 页 翻 译 计 划 》 :

http://cmpp.linuxforum.net