2011-04-28 25 views
4

我目前正在使用野牛和flex作爲標記器的verilog分析器。我的語法工作正常,現在我的目標是將收集的數據存儲在數據庫中。 (如果你不知道verilog是什麼,它並不重要,但你可以在這裏找到信息:http://www.verilog.com/VerilogBNF.html獲取字符串作爲標記值的Bison/Flex分析器

我目前一直在獲取令牌值。我的語法主要由字符串和一些數字組成。

我瀏覽互聯網和發現,導致我寫恩這樣的規則法有用的東西:

[A-Za-z_]+[A-Za-z0-9_$]* { 
    lline = yylineno;yylval.str = strdup(yytext); 
    return K_IDENTIFIER; 
} 

在我的野牛輸入文件.Y我做了一些調整,這是

#define YYSTYPE char* 
.... 
%union {char* str; 
    double val; 
} 
%token<str>K_IDENTIFIER 
... 
beginning of the grammar rules 

現在,當我有一個文法規則,其中有一個K_IDENTIFIER,如

module : K_MODULE K_IDENTIFIER list_of_ports_parameters K_POINTVIRG 
{cout << "the value of K_IDENTIFIER is :"<< $2.str << endl;} 
list_of_module_itemsE 
    K_ENDMODULE 

fdsfds

正如你所見,我想打印K_IDENTIFIER的值(這是一個字符串)。這只是幫助我理解背後的機制的一個例子,因爲稍後我將創建一些C++對象並根據我讀的內容填充信息。

如果您需要更多的代碼來查看我的問題,請隨時詢問。 謝謝

+0

我敢肯定你的意思是用GNU-Flex和不Adobe Flex的標記這一點,所以我重申了它。 – JeffryHouser 2011-04-28 13:13:07

+0

是的,謝謝你的錯字修復 – djfoxmccloud 2011-04-28 14:27:11

+0

我清理你的格式有點。如果您有大量代碼,請將其縮進四個空格。這比嘗試使反作用力工作好得多。 – 2011-04-28 20:21:30

回答

6

隨着%union#defineYYSTYPE是沒有必要;這可能是問題的一部分。野牛會自動拾取工會的正確成員,所以你只需要$2參考價值,不$2.str,即:

{ cout << "the value of K_IDENTIFIER is: " << $2 << endl; } 
+1

非常感謝你,這是訣竅!我知道我應該在^^之前註冊堆棧溢出 – djfoxmccloud 2011-04-29 07:13:26

相關問題