2010-10-27 67 views
3

我在BNF遇到了一些麻煩。我不知道什麼似乎是做事的標準方式(如果有的話),以及是否有類似char或int或其他內置類型。寫BNF時{和}之間有什麼關係?

但是,我的主要問題是瞭解花括號中的BNF部分是如何工作的。
鑑於這樣的:

exp : term       {$$ = $1;} 
| exp '+' term     {$$ = $1 + $3;} 
| exp '-' term     {$$ = $1 - $3;} 
; 

(這是輕而易舉地從什麼地方偷來的,是YACC/C)

什麼是大括號的東西實際上是在說?我也看到了類似的東西快樂的分析器生成器也一樣困惑。

+0

這是功課嗎? – jcolebrand 2010-10-27 21:37:23

+0

哦,這實際上不是BNF。 – 2010-10-27 21:44:15

+0

@drachenstern:雖然這個問題主要是因爲我在看BNF而被問到,因爲我必須爲Happy編寫一些東西來爲編譯器任務創建一個玩具語言的解析器,但它本身並不是一個家庭作業問題。我不明白當我使用谷歌搜索時我正在看的東西,因此問。所以這不是家庭作業,但它與我的學位課程有關。即使那樣,我也不是要求某人爲我工作,我是在解釋之後。 – Squidly 2010-10-27 22:01:12

回答

2

您需要區分一般BNF(和EBNF)和Yacc語法。 BNF中大括號的含義因方言而異;它通常意味着'選擇其中一種選擇',或者它可能與重複相關,或者兩者兼而有之。在EBNF(ISO 14977:1996)中,'{...}'表示重複零次或多次,'{...} - '表示重複一次或多次(以及爲什麼這是' - '而不是'+'是神祕的)。 IETF使用RFC-5234,其BNF方言根本不使用「{}」。

但是,在Yacc語法中,大括號包含了匹配規則(用專業術語減少)時要執行的操作。因此,'{$$ = $1;}'操作意味着'將'term'匹配的值賦值爲減少'exp :: = term'(使用BNF的另一個變體)的結果。

2

花括號內的東西實際上是C代碼,當相應的規則被解析時執行。 $符號是用yacc解析的實際值替換的佔位符:$$是您希望計算的結果,而$1$n表示規則右側的符號值。

例如,規則exp '+' term { $$ = $1 + $3; }$1exp$3term,所以這個說,當這條規則被解析,加expterm得到結果。

相關問題