2013-11-24 40 views
0

有5條規則。我必須在初始化或雙重聲明中檢查不兼容的類型。我知道我需要在符號表中。我知道$ i。和其他所有東西。但我沒有任何想法如何實現代碼。對不起我的英語,我不是母語。我需要使用flex/bison進行語義檢查

1)prog: 
    PROGMY IDENT ';' decls BEGINMY stats ENDMY '.' ; 

2) decl: 
    CONSTMY IDENT '=' NUM ';' {} 
    | 
    VARMY VARFULL {} 
    | 
    error ';' ; 

3) VARFULL: 
    MYPEREMEN ':' MYTYPE ';' {} 
    | 
    VARFULL MYPEREMEN ':' MYTYPE ';' 

4) MYTYPE : 
    MYINT  {} //int 
    | 
    MYBOOL  {} //bool 
    ; 

5) MYPEREMEN : 
    IDENT  {} 
    | 
    MYPEREMEN ',' IDENT {} 

    ; 

回答

0

野牛採用以下模式:

// declarations 
%% 
non-terminal : rule { c/c++ action } 
%% 
// your functions 

所以要闡述一下以前的答案:

prog: 
    PROGMY IDENT ';' decls BEGINMY stats ENDMY '.' 
    { your code; } 
    ; // bison (not C/C++) terminal semi-colon 

作爲一個單獨的說明,因爲解析器是緩慢的,你可能需要使用「內聯」爲代碼功能儘可能合理。以前對要編寫什麼代碼的評論是正確的。也就是說,如果要將符號插入符號表中,則需要發現該符號是否存在,如果不存在,則插入它。

1

bison在減少規則時執行與規則相關的語義操作。因此,通常你所做的就是將代碼放入與聲明相關聯的動作中,以檢查符號是否已經存在於符號表中,然後將其添加到符號表中。符號表本身是一個全局變量。所以,你可能有這樣一個規則:

declaration: type IDENT { 
     if (symbol_exists(symbol_table, $2)) 
      Error("duplicate symbol %s", $2); 
     else 
      AddSymbolWithType(symbol_table, $2, $1); } 

或者,你可以把錯誤檢查到功能AddSymbolWithType,讓你的語法文件清潔。