2011-02-23 64 views
0

我正在嘗試在flex/bison中編寫一個(相對)簡單的配置文件解析器。基本思想是,我的bison語法使用一些C函數將解析的數據組織到一系列C結構中。如果有人認爲有必要回答這個問題,我會很高興發佈我的代碼,只是評論。yacc/bison動作的範圍是什麼?

我遇到的問題涉及bison操作中的程序範圍。舉例來說,如果我有這樣的:

set 
      : NTOK name { 
          section *sec 
          init_s(sec, $2); 
          add_s(cf, sec); 
         } 

不應該sec在語法使用更高規則可用?當我試圖再次將它作爲參數再次調用時,我得到了error: 'sec' undeclared。任何人都可以啓發我嗎?

+1

看看生成的代碼。 – 2011-02-23 22:19:07

+0

我應該尋找什麼?不知道我明白。 – Pygmalion 2011-02-23 22:23:00

+1

請不要編輯問題的答案。對答案進行投票與接受投票的權力相結合,可以更好地爲以後來的人分類。 – dmckee 2011-02-23 22:51:39

回答

4

針對bison中的操作生成的所有代碼都在其自己的範圍內(IIRC,生成的代碼將其包裝在大括號中以強制執行此操作)。如果你想讓全局數據可用於其他動作,你需要在某處明確聲明一個全局變量(可能在flexbison腳本的頂部?),然後寫入該變量。這背後的基本原理是,如果某個操作中的每個變量都是隱式全局的,或者至少可以被其他操作讀取,那麼當您意圖創建新數據時,意外回收垃圾數據將非常容易。

+0

謝謝!這完全回答了我的問題。感謝您也包括解決方法。 – Pygmalion 2011-02-23 22:24:24

0

此問題通常通過將types分配給令牌和規則來解決。您還可以將自己的parameters附加到解析器功能。

%union { 
    char* name; 
    section* sec; 
} 

%parse-param {whatever_type cf} 

%token <name> name 
%type <sec> set 

%% 

set  : NTOK name { 
          init_s(&$$, $2); 
          add_s(cf, $$); 
         } 
     ; 

other_rule: set name {do_something_other($1 $2);} 
      ;