2012-12-08 187 views
1

我是詞法分析和解析器生成的新手,我試圖直接從編譯wikipedia的野牛示例開始。這是一個可重入解析器的例子。野牛版本之間的差異

我試着編譯2個版本的bison:2.5和2.6.5。前者編譯和執行完美,但後者在解析器頭文件中包含類型yyscan_t,該頭文件在詞法分析器頭文件(Lexer.h)中聲明(我認爲這是重入式要素所必需的)。因此,它不Parser.y

編譯生成Parser.c下面是2.6.5在Parser.h產生額外的部件,它是不存在的2.5:

#ifdef YYPARSE_PARAM 
#if defined __STDC__ || defined __cplusplus 
int yyparse (void *YYPARSE_PARAM); 
#else 
int yyparse(); 
#endif 
#else /* ! YYPARSE_PARAM */ 
#if defined __STDC__ || defined __cplusplus 
int yyparse (SExpression **expression, yyscan_t scanner); // this line 
#else 
int yyparse(); 
#endif 
#endif /* ! YYPARSE_PARAM */ 

我打上引起問題的線路。有什麼想法嗎?

編輯:我需要做的是確保yyscan_t在由bison生成的頭文件中聲明。

+0

的'yyscan_t'來源於聲明'%的lex-PARAM {yyscan_t掃描}''中Parser.y',所以應該在'Parser.c'存在無論是哪個版本的野牛使用,只要它是一個足夠新的支持'%lex-param'(2.5和2.6.5都應該是這樣) –

+0

你在Parser.c中引用的文本是bison 2.5,它是工作正常。我沒有安裝野牛2.6.5來檢查那裏發生了什麼。 –

+0

@ChrisDodd是的,你是對的。我猜這個問題是它在''Lexer.h''中聲明的,它不會被''Parser.h''自動包含。 – hosolmaz

回答

3

事實上,自2.6版以來的野牛將前面提到的代碼塊插入標題部分。

您需要通過移動%code {...}(或%{...%})部分的子部分來告訴bison在此塊之前插入yyparse函數參數的所有聲明與標籤的新代碼段「要求」,因此它在頭部的頂部插入,在你的YY文件:

%code requires { 
typedef void*     yyscan_t; 
} 

看到野牛fraking手冊:

http://www.gnu.org/software/bison/manual/html_node/_0025code-Summary.html

http://www.gnu.org/software/bison/manual/html_node/Prologue-Alternatives.html#Prologue-Alternatives

希望幫助