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