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