2011-07-09 31 views
5

這不是this question的重複,因爲解決方案不是使用解析器!將Yacc/Bison解析器與C++程序連接起來

我有一個野牛解析器,我可以通過做./parser < file_to_parse運行。我想從我的C++程序中調用Bison解析器。我不想要的是做system(./parser < file_to_parse),因爲這會假設解析器是預先編譯的,然後我的整個程序將不會是平臺無關的。

如果我有一個函數:

void foo(file_name) { 
    // call parser on file_name 
} 

那麼如何才能做到這一點?有任何想法嗎?我認爲這是調用yyparse或什麼的情況,但我沒有得到它的任何地方!

謝謝:)。

回答

1

這正是你所做的 - 你調用yyparse()。你寫yylex(),以便你的主程序可以指定它的輸入。推測你現在的yylex()調用getchar()或某個東西來讀取一個字符;相反,你大概需要寫它來從你的主程序指定的某個地方輸入信息。

+0

謝謝歐內斯特..仍在掙扎,但希望我會到那裏。在我的詞法分析器中實際上並沒有yylex()--Flex創建了一個可能執行getchar()的默認操作。我想我需要在詞法分析器中編寫我自己的東西。 – ale

2

您使用的是適用於C++的版本嗎?

我使用的是Alain Coetmeur。

目前,我只有使用flex ++的代碼方便,但它應該告訴你這是怎麼回事。

當你運行flex ++時,它會輸出一個頭文件和一個新類的實現文件來進行解析。將這些添加到您的項目中,然後寫入:

// Construct new instance of parser 
::lex * plex = new lex(); 

// tell parser what file to parse 
plex->yyin = _wfopen(L"C:/Documents and Settings/All Users/Application Data/QuietWake/eCrew/new_rules_to_be_parsed.txt",L"r"); 

// run the parser 
int lex_return = plex->yylex(); 
+0

謝謝。我實際上使用舊的Flex/Bison ..我只知道昨天有C++!..肯定會更好地使用你正在使用的那個。我會試着用我的工具來解決它,如果失敗了,我會看看這些C++的。謝謝+1。 – ale

+0

我建議現在進行更改。新的解析器與舊版本兼容,所以您不會失去對腳本的任何投資。生活將會變得如此簡單。 – ravenspoint

+0

我被卡住了,所以我要做的只是:)。如果有效,將會標記爲解決方案。謝謝。 – ale

1

這是C代碼,但我想這也是C++的指示性案例。
當我們不得不做出一個編譯器在大學裏,我們有在.l文件中像這樣來定義YY_DECL:

 
#define YY_DECL int alpha_yylex(yylval_) void *yylval_; 

int alpha_yylex(yylval_)是功能和void *yylval是參數類型。
很明顯,您需要這樣做才能使解析器知道從哪裏開始,也就是解析應該從哪個函數開始。

您還需要在.y文件中將此函數原型(extern int alpha_yylex(void *yylval_);)外接。
之後,Flex/Bison實用程序將爲您自動生成相關的.c文件。

一般而言,.l用於詞彙規則,.y用於語法規則。因此,如果你需要得到的價值從什麼地方,你必須在.y像這樣(例子)定義工會

%union { 

    union { 
     int Integer; 
     double Double; 
     char Character; 
     char* String; 
    } value; 

} 

然後,根據你的語法和規則,你可以在你.l fileyylval.value.String = strdup(yytext)並根據您的語法規則在您的.y文件中輸入$$.Double = $1.Double + $3.Double

我不記得了很多,因爲它已經有一段時間,我已經做了,但我想你可以試試,你可以參考的文檔或詢問這裏:)

PS:(我有一個好的常見問題解答,但不記得它在哪裏 - >如果我很幸運找到它,xD:D xD將會發布。)

相關問題