2016-04-29 19 views
-1

我正在寫一個解析器一個相當簡單的語言。該語言將允許描述具有房間的遊戲。房間包含「人物」和「事物」。角色有「選項」,可以讓你與他們互動;選項可以在開始與角色交互後形成允許多個分支的樹。萊克斯/軟硬度:爲什麼我收到「錯誤:請求成員‘STR’的東西不是一個結構或聯合」使用--bison-位置時

我經歷了幾次反覆去了,問了一些問題,並最終得到了我的分析器進行編譯。但是當我在示例輸入上運行它時,我得到了語法錯誤,但沒有指出錯誤發生在哪一行。

我用我的谷歌福,發現應該生成代碼,將讓yylloc充滿了當前的行號旗--bison-位置。

但是,當我打開該標誌,我開始得到 「請求成員'str'的東西不是結構或聯盟」 消息。

隨着標誌關閉,我的解析器編譯,但不告訴我語法錯誤在哪裏。

我怎樣才能獲得位置信息yylloc沒有打破我的工會%和我的{語義代碼...}之間的聯繫?

我的源代碼和使日誌爲: http://apdamien.info/code/GHparser.zip

+1

我們不打算下載任意'.zip'文件。找到一種用最少量代碼重現問題的方法。 –

回答

1

如果你只是想行號信息,然後指定你的(F)法文件%option yylineno並在YACC /野牛文件中聲明extern int yylineno。 flex將自動填入yylineno。如果需要完整的行號/列信息,如yylloc結構,並且您希望它與每個令牌關聯,您可以使用@n在野牛中獲取它,那麼您將需要做很多工作,因爲flex不填寫(或者甚至計算)列號。

所以--bison-bridge不會做你認爲它,它可能是你想要的東西沒有做。也許谷歌讓你想到頁面 Taco Joe的Enchiladas和Flex的誤解而不是appropriate section of the Flex manual,或者它可能只是讓你想到appendix on bison-bridge,你需要仔細閱讀,因爲雖然它的確是--bison-locations更改yylex的調用約定的情況下,重要的區別並沒有被強調得儘可能多。

也許柔性資料員提出,人們會明白,如果他們使用不調整其柔性動作此選項,這將必然產生的編譯器錯誤的假設。

無論如何,重要的一點是:

Note that the macros 'yylval' and 'yylloc' evaluate to pointers.

換句話說,當你指定--bison-bridgeyylval不再是一個全局變量(或--bison-locations這意味着--bison-bridge)。相反,yylex指針被調用到語義值對象,因此yylval的類型爲YYSTYPE*而不是YYSTYPE。這意味着,你需要改變任何使用yylval從柔性動作,例如,

yylval.str = strdup(yytext); 

yylval->str = strdup(yytext); 

(順便說一下,如果你的動作說yylval.str = yytext;,你需要搜索對於諸如「爲什麼我的代幣的字符串值在分析器中發生變化」這樣的問題,或者您可以像上面那樣使用strdup這樣的問題,我會有很多回答之一,但我有一個老式的想法,應該瞭解人們使用的工具,而不僅僅是一味地從匿名陌生人複製代碼。)

+0

謝謝,裏奇。這完全解決了這個問題。我會去閱讀FAQ並開始使用strdup,謝謝。 –

相關問題