1

我想你寫一些簡單的編譯器,檢測未聲明的變量,並做一些額外的東西。問題是,我不能在我的野牛文件中使用「$$」,它說「$$'$$'沒有聲明類型」。這裏是我的flex和野牛文件的相關部分:從flex返回屬性到野牛

flx file: 

int[ \t\n]+matrix {yylval.type_id.Type = 4;return tINTMATRIXTYPE; } 

bison file: 

%} 

%union semrec 
{ 
struct 
{ 
    int Type; 
    char *id; 
}type_id; 
} 

%start prog 



%% 
prog: stmtlst 
; 

stmtlst : stmt 
    | stmt stmtlst 
; 

tmt : decl //baktım 
    | asgn 
    | if 
; 

decl : type vars '=' expr ';' 
; 

type : tINTTYPE  
    | tINTVECTORTYPE  
    | tINTMATRIXTYPE {$$.Type=$1.Type;} 
    | tREALTYPE   
    | tREALVECTORTYPE  
    | tREALMATRIXTYPE  
; 




%% 

寫作$ 1.型號野牛文件的工作,但$$類型不起作用。 任何人都可以幫忙嗎?謝謝

回答

1

您需要明確告訴野牛每個令牌是什麼類型(終端和非終端),你計劃分配一個值。它也看起來像你沒有任何你的標記聲明。

%type <Type> type 

讓你開始。但是現在您必須確保$$爲所有其他類型(tINTTYPE等)設置。

這裏有一個簡單的例子,應該給你如何野牛工作的一般要點:http://www.gnu.org/software/bison/manual/bison.html

+0

是的,這工作。謝謝! – yrazlik 2013-04-10 15:58:25

+0

flex/bison是有趣且功能強大的小工具,但首先要弄清楚它們可能非常棘手。如果你還有其他問題,肯定會發布。出於好奇,這個項目的背景是什麼? – Josh 2013-04-10 16:01:20

+0

謝謝,實際上ii還有一個問題。關於你的問題,項目的背景是,我們爲基本的數學操作編寫了掃描儀和語義分析器。我們在上一步中做了句法問題,現在我們必須檢測語義錯誤。 1)未聲明的變量2)矩陣或向量與整數,實數等比較。我的另一個問題是,我可以做這樣的事情:%token tIDENT,但我不能做以下幾點: %類型變量。我的意思是,如果它是一個令牌,那麼我可以將它與2個屬性相關聯,但是如果它是我不能的類型。 – yrazlik 2013-04-10 17:25:36