野牛一個循環,這樣,我得到這個代碼:實現使用BNF
calclist: /* nothing */ matches at beginning of input
| calclist exp EOL { printf("= %d\n", $1); } EOL is end of an expression
;
據解釋說:
前兩個規則,定義符號calcset,實現循環 讀取由換行符終止的表達式並打印其值。 calclist的定義使用了一個共同的兩規則遞歸慣用法來實現一個序列或列表:第一個規則是空的,並且與 沒有任何關係;第二個將項目添加到列表中。第二個 規則中的操作在$ 2中打印exp的值。
從書「Flex和野牛」。有人可以告訴我這樣的語法意味着一個循環嗎?我可以理解exp
中的遞歸(稍後寫,但我不包括,因爲它在這裏不相關)。然而,看看這樣的語法,我只能想到第一條規則沒有匹配任何東西來保持解析器不處理任何東西,因此,直到從標準輸入流中提供第一個符號並啓動第二個規則,纔會有無限循環。但是,我不明白第二條規則。它怎麼能達到exp
部分?當它遇到calclist
時,它會保持遞歸嗎?
啊我明白了。 calclist1 exp EOL => calclist2。我認爲Bison會從左向右處理輸入流,這意味着它會一直進入'calclist - > calclist - > calclist',並且永遠不會到達'exp'段。現在我認爲,右邊的規則是讓Bison匹配來自輸入流的模式,但不是從左到右的處理,不是嗎?因爲我們可以定義:'exp:exp exp'+'',這顯然是匹配的模式,但不是實際的代碼。通常,'exp'的例子是這樣寫的:'exp:exp + exp',因此我認爲這是實際的實現。 – Amumu 2012-01-11 02:58:51