2010-11-26 46 views
1

讓我來舉個例子。 假設一個文本文件的內容如下:如何編寫Lex和Yacc來解析部分文件

功能FUN1 {
    INT A,B,C;
   功能FUN2 {
        INT d,E;
        char f g;
       功能FUN3 {
            INT H,I;
       }
   }

在上述文本文件,打開支架的數目不匹配閉括號的數目。該文件作爲一個整體不遵循語法。然而,部分函數fun2和fun3遵循語法。通常文本文件非常大。

如果用戶想要解析整個文件,即函數fun1,那麼程序應該輸出一個錯誤,因爲大括號不匹配。但是,如果用戶只想解析部分文件,即函數fun2/fun3,那麼程序不應該因爲大括號匹配而拋出錯誤。

我現在有一個問題 1.有沒有辦法讓Lex和Yacc只加載 部分文件?如果是這樣,那麼它是如何完成的。

回答

2

您使用的是bison/flex還是普通的舊yacc/lex? 我用yacc玩了很久。

兩種工具的技術答案是不同的。

使用flex你必須處理the buffer mechanism。 最終的代碼將會更乾淨。

隨着lex,你將不得不親手做。 至少你必須重新定義輸入和輸出宏。 你也可以嘗試玩yyin和fseek

在解析器側你將不得不面對錯誤管理(yyerrok宏)和error令牌

http://dinosaur.compilertools.net/bison/bison_9.html#SEC81