2016-04-25 32 views
0

我在使用Bison編寫的語法定向轉換和解析器之間感到困惑。 (主要的困惑是用Bison編寫的解析器是否由語法指導的翻譯器組成)。我將括號中的上述句子改爲(Bison如何實現語法定向翻譯,是否附加了Eg $$ = $ 1 + $ 3)關於語法定向轉換和野牛解析器的問題

link

在動作C代碼可指通過用構建$ N,它表示第n個分量的值的規則相匹配的部件的語義值。正在構建的分組的語義值是$$。 (野牛翻譯這兩個構造成數組元素的引用時,它會將行動納入解析器文件)的book

而且也是在第5章(語法定位分析)說

語法+語義規則=語法制導翻譯

PRODUCTION   SEMANTIC RULE 
→1 +   {. = 1. ┤| . |′+′} 

當翻譯規則,下面的代碼段尋找一個簡單的解析器從書中Flex and Bison

%% 
E: F default $$ = $1 
     | E ADD F { $$ = $1 + $3; } 
     | E SUB F { $$ = $1 - $3; } 
    ; 
%% 

是在.code equavelent到$$我很困惑。語法導向分析與語義分析相同嗎?我越讀越多,我感到困惑。有人請幫我解決這個問題。

+0

可能重複[語法指導翻譯是什麼意思?](http://stackoverflow.com/questions/15984605/what-does-syntax-directed-translation-mean) –

回答

0

你的理解看起來是正確的,但是被龍書和示例解析器中的例子做了兩件事 - 龍書將表達式轉換爲代碼,而簡單的解析器正在評估表達式,而不是翻譯(所以這實際上是語法導向評估,而不是語法導向翻譯)。

在Dragon書中描述的語義規則中,符號可以具有多個屬性,既可以合成也可以繼承。這就是.code後綴的含義 - 它應用於符號的屬性。野牛另一方面允許每個符號有一個單一的綜合屬性 - 沒有更多,並沒有繼承的屬性。如果你想要多個屬性,你可以將它們集合在一起,並將其用作你的屬性(需要一些謹慎的管理)。如果你想要繼承的屬性,你可以使用$0,甚至更仔細的管理,或者你可以使用全局變量來獲得相同的效果。

野牛片段,將符合您的龍書例如片斷會是這樣的:

E : E ADD F { $$ = AppendCode($1, $3, PLUS); } 

使用的.code屬性單野牛屬性和做的代碼追加操作的功能產生。