2009-10-28 113 views
5

處理項目中多個Flex/Bison解析器的最佳方式是什麼?多個flex/bison解析器

我寫了一個解析器,現在我需要第二個在同一個項目中。到目前爲止,在parser1.y的第三部分,我插入了main(..)方法,並從那裏調用yyparse

我想獲得是一種有兩個不同的解析器(parser1.yparser2.y),並能夠從外部函數中使用它們什麼(假設在main.cppmain)。

我應該使用哪些預防措施導出yyparse函數.y以外的文件以及我應該如何處理兩個解析器?

PS。我使用g ++編譯而不是C++版本的Flex和Bison,我想這樣保持它(所以避免在對象中封裝解析器)。

回答

7

請注意,Bison提供了'-p zz'選項來爲符號添加'zz'而不是'yy'。

同樣,Flex提供了'-P zz'選項來爲符號添加'zz'而不是'yy'。它使用'-p'進行性能報告。 '可惜他們並不一致。

+0

當我這樣做時,我的詞法分析器和解析器有很多對YYTYPE和YYSTYPE等的引用,編譯失敗。爲什麼沒有被轉換?我究竟做錯了什麼??我不想要一個可重入的解析器,我只想要一個調用兩個解析器之一的解析器,然後程序退出。 – TimeHorse 2017-01-07 01:26:18

+0

@TimeHorse:考慮到回答這個問題和你的評論/問題之間的時間差異,我想你應該問一個新問題,用兩個小詞法/文法例子來解釋你遇到的問題(一個MCVE - [MCVE ])並顯示您正在使用的構建過程以及您收到的錯誤消息。如果你沒有機會提供這些信息,你會得到一個新的問題,我無法給出答案。盡一切辦法回來,在這裏留下評論,讓我看看你的新問題;考慮在你的這個問題中加入一個鏈接。 – 2017-01-07 01:49:22

10

除了萊弗勒的答案,我想在這裏提供另一種方法:

.lex文件,你可以使用%option prefix="PREFIX",並在.y文件,你可以使用%define api.prefix PREFIX,它做同樣的事情爲合格到Bison的-p PREFIX和到Flex的-P PREFIX。默認前綴yy的首要後

通知,您可以通過對原始yy*並訪問內部名稱的覆蓋PREFIX*,而顯然對於外部名稱,你必須使用你的PREFIX*訪問它們。

+0

請注意,在現代野牛版本中,您需要執行'%define api.prefix {PREFIX}',否則您會收到警告 – 2015-06-08 01:43:34

5

如果使用野牛3.0或更好,然後看看%define api.prefix {foo_},它取代所有yyYY前綴與foo_FOO_

查看Documentation about Multiple Parsers

在Bison 2.6和3.0之間,曾經沒有大括號:%define api.prefix foo_

-1

除了已經陳述的內容之外,如果您使用'%define api.prefix {PREFIX}',它也會將yytext重命名爲PREFIXtext和PREFIXparse yytext & yyparse。不要忘記前綴周圍的{}
這同樣適用於lex中的'%option prefix =「PREFIX」',您的詞法分析器將被重命名爲PREFIXlex。