我是詞法分析和解析器生成的新手,我試圖直接從編譯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生成的頭文件中聲明。
的'yyscan_t'來源於聲明'%的lex-PARAM {yyscan_t掃描}''中Parser.y',所以應該在'Parser.c'存在無論是哪個版本的野牛使用,只要它是一個足夠新的支持'%lex-param'(2.5和2.6.5都應該是這樣) –
你在Parser.c中引用的文本是bison 2.5,它是工作正常。我沒有安裝野牛2.6.5來檢查那裏發生了什麼。 –
@ChrisDodd是的,你是對的。我猜這個問題是它在''Lexer.h''中聲明的,它不會被''Parser.h''自動包含。 – hosolmaz