2009-11-22 64 views
5

我需要使用flex和野牛來解析一些代碼。野牛YYSTYPE:試圖使用char *

YYSTYPE的默認類型是int,儘管我從來沒有這樣聲明過。這是來自野牛的默認值嗎?

這將幫助我很多傳遞字符串回來。我讀到:How to solve Bison warning "... has no declared type"這看起來很不錯。 (我不需要聯盟的全部力量,只是char *部分,但我可能會使用聯盟,因爲它稍後可能會有所幫助。)

它不適合我。我得到這些錯誤:

y:111.37-38: $1 of `ConstExpression' has no declared type 
y:113.34-35: $1 of `ConstFactor' has no declared type 
y:114.35-36: $1 of `ConstFactor' has no declared type 
y:119.34-35: $1 of `Type' has no declared type 
y:109.23-48: warning: type clash on default action: <str> != <> 
y:115.23-27: warning: type clash on default action: <str> != <> 
[...more of the same snipped...] 

下面是我y語法文件的聲明:

%union { 
    char *str; 
} 

%type<str> ConstExpression ConstFactor Type 

這裏是我的.l文件中的一行:

[a-zA-Z]+[a-zA-Z0-9]* { yylval.str = strdup(yytext); return yident;} 

還有什麼我需要要做什麼來解決錯誤?

+1

你真的認爲人們可以調試你的語法文件,沒有看到它來定義類型的令牌? – 2009-11-22 11:25:03

+6

@Kinopiko,你認真對待這個,是因爲他不僅僅是把他的整個作業都粘貼在裏面,並且說「給我看代碼」?它會殺了你只說:「我需要更多的信息,請發佈整個語法文件」或者其他的? – steveha 2009-11-22 20:01:00

+1

@Kinopiko,當他發佈你所請求的信息時,你會撤銷你的downvote嗎?這看起來很苛刻。 – steveha 2009-11-22 20:01:44

回答

6

其實,我很確定我沒有看到語法就知道什麼是錯的。

有必要聲明終端符號的類型,因爲它們可以並且經常返回語義值。考慮諸如IDNUMBER之類的數據,其中有yyval數據。但yacc沒有辦法知道它是否只是一個'x'或更多,並且規則中的默認操作是:$$ = $1

例如,下面的語法使其通過yacc很好,但嘗試刪除一個更多個符號從下面的%type

%union { 
    char *s; 
} 

%type <s> r1 r2 'x' 

%% 

r1: r2; 

r2: 'x' { printf("%s\n", $1); }; 
3

,你可能只需要在YACC文件

%token<str> yident 
+0

我認爲這是正確的 - 如果你在lex文件中返回一個char *,你不會使用%type,這是用於野牛類型... – alternative 2010-08-19 18:30:06