2011-06-24 120 views
1

我正試圖學習Flex & Bison。我已閱讀材料,並理解它在理論層面的工作原理。然而,我似乎甚至沒有實現最基本的東西,而沒有打到心理障礙。 (注意:我沒有采取任何編譯器課程或類似的東西......這是我第一次接觸到這些東西)。我想,一旦我看到這個超級基本的東西被實現,我就可以更容易地繼續前進和理解。使用Flex&Bison

基本上,我所要做的就是編寫一個程序,看到type my_type /// some text將調用my_type的函數「set_text」,並將文本設置爲該註釋之後的內容。相反,我的Bison語法將會調用函數my_type.set_text(some text);我意識到如果不使用Flex和Bison,我可以輕鬆完成這個任務,但重點在於學習。

我已經有了正確設置的文件......我需要實現的是令牌傳遞(來自Flex)和採取的行動(來自Bison)。

我的Flex令牌傳遞至今:

"\/"{3}    { return COMMENT; } 

我野牛令牌到目前爲止

%token COMMENT 

抓住,這就是認真所有我可以拿出。我知道我還需要什麼......我無法弄清楚如何去做。我知道我需要:
一)通過類型和my_type的東西
b)將拿出一個「規則」在野牛來處理這些東西,調用該函數正確的功能

任何幫助嗎?我已經離開了嗎?

UPDATE(關於如何做到這一點的進一步思考): 也許我的野牛文件應該包括像

commented_variable:       {($2).set_text($4);} 
    IDENTIFIER NAME COMMENT COMMENT_TEXT      

的規則。因此我的Flex文件需要通過它的令牌?我在正確的軌道上嗎?

+0

另外,我很抱歉,如果這似乎是錯誤的論壇中發佈此我找不到任何網站更適合。讓我知道如果你認爲另一個堆棧交換網站會是一個更好的選擇! –

回答

1

讓我建議一些東西。 儘管單獨使用flex的起始條件來處理COMMENT和​​ 並不是不可能,但是我認爲一次處理它們更容易。
bison源就會像下面的(虛構的代碼):

%union { 
    name_type *name; 
    char const *comment; 
} 
%token <name> NAME 
%token <comment> COMMENT 
%% 
commented_variable: IDENTIFIER NAME COMMENT {$2->set_text($3);} 

從詞彙角度來看,您IDENTIFIERNAME似乎沒有什麼區別。 所以我把它們排列在用戶代碼(不是詞法上)。 flex來源將是這樣的:

"///".*     { 
         yylval.comment = strdup(yytext + 3); 
         return COMMENT; 
         } 
[A-Za-z_][A-Za-z_0-9]* { 
         name_type *n = lookup_name(yytext); 
         if (n) { 
          yylval.name = n; 
          return NAME; 
         } 
         return IDENTIFIER; 
         } 

然而,上述代碼仍然需要適當name_typelookup_name,和荷蘭國際集團free指針從strdup返回。
如果您沒有太多的經驗flex/bison,我會建議首先確認詞法分析器 足夠。 例如,我建議確認預計令牌認可 用簡單的代碼一樣
int main() { while (yylex()) {} }

"///".*     printf("comment %s\n", yytext); 
[A-Za-z_][A-Za-z_0-9]* printf("symbol %s\n", yytext); 

同樣,對於bison代碼,我建議先解決語法 問題像移/減少衝突,並確認該語法 用簡單的代碼一樣正確識別:

commented_variable: IDENTIFIER NAME COMMENT { puts("OK"); } 
0

既然你實際上使用文字分隔符下面,我就用「評論」爲任何你有以上。也就是說,你在更新中加入的是非常正確的想法。

+0

你能解釋一下嗎?我不確定你的意思。 –