半日潰したのでメモ。
● 出てたのは
2つ。
Xcode付属のflex,bisonで下記。
- (1) flex ver 2.5.: C++11仕様でコンパイルでワーニング
- (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない
(1)(2)ともにXcode付属のflex/bisonが古いぜ。
● 結論
(1)(2)ともに,flex&bisonをverUpしたがXcodeがそれをガン無視。
↓
Scanner.cpp, Parser.hpp, Parser.cppを予めコマンドラインで生成して,Xcodeのプロジェクトに追加することに。
↓
今度は,Xcodeの環境で読み込む「#include
↓
ビルド成功(ちょっぴりwarningまだ出るけどね)
ここまで半日格闘。
● (1)flex 2.5.x だと c++11 コンパイルでワーニング
flex 2.5.xは,変数宣言だかにregisterキーワードが使われる。
registerはc++11でdeprecatedに。だから Xcode でコンパイル時にワーニングだらけになる。
こちとら趣味だしワーニングなんで放っとこうかと思ったが,何しろ多量だし気味が悪い。
● 調べると
flex 2.6.xは,registerキーワード吐かなくなったらしい。おお。
早速brewでインストール。
$ brew install flex $ brew link flex --force
これでScanner.lをコンパイルする。
$ flex -o Scanner.cpp Scanner.l
中身からキレイにregisterが消えた。
● このファイルをXcode
に追加すると,register絡みのワーニングは消えた。
● が
今度はエラーが大量に出るように。
Xcode曰く
Too many errors emitted, stopping now
て。ええ!?
● みると Semantic Issue だそうで
「Member reference type ‘std::istream *’ (aka ‘basic_istream
みると確かに「yyin」がポインターとして宣言されて,「.」演算子が付されてる。
「yyin.rdbuf(std::cin.rdbuf())」みたくなってて妙だ。
「yyin->rdbuf(std::cin.rdbuf())」では,ってコンパイラが言うのも確かに。
しっかしsemanticエラーたって,flexが吐いたコードだしなあ。
webによっては「もう,自分で.を->に編集しちゃおうか」的な話もあり。
● だが救世主はやはり
webの中に。
● stack overflowというサイト
国内に情報が少ない場合に大体googleでヒットするstack overflowだ。
もう。stack overflowとyahoo知恵袋に世界の大半は記録されてるんじゃないか。
上記リンク先のAlex H.さん(stack overflowの方ね)曰く
you might be able to just use a newer “FlexLexer.h” (for example the one from here: https://github.com/westes/flex/blob/master/src/FlexLexer.h)
(新しいほうの”FlexLexer.h”が使える。(例えばこことか))
FlexLexer.hが古いんで,新しいやつダウンロードして使えば?という。
理由はAlex H.さんの予想だと
I believe the issue is an out of sync “FlexLexer.h”. Flex 2.6.0 changed the storage definition of yyin storage for C++ scanners for both the header and the generated source. However I suppose the mac port package is including an out-of-date FlexLexer.h, even though flex itself has been updated. This leads to the mismatch you are seeing as compilation errors.
ということのよう。って英語だらけ。だいたい
- flex 2.6.0で,yyinの定義が変更になってる
- flex自体は更新されても,古いまんまの”FlexLexer.h”が読み込まれてるんじゃないか
ということか。
● そこで
仰せの通りここへ行って,FlexLexer.hをダウンロード。
いや実際にはここでcloneをダウンロード。
どこに入れればいいかというと
~$ find /Applications/Xcode.app/ -name "FlexLexer.h" /Applications/Xcode.app//Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/FlexLexer.h
発見。
これで(1)が解決。
Xcodeにはコマンドラインで作ったScanner.h
$ flex -o Scanner.cpp Scanner.l
を後から読み込ませれば世はすべて事もなし。
● (2) bison ver2.x:「%define parser_class_name { Parser }」が通じない
$ brew install bison $ brew link bison --force
そして
$ bison -o Parser.cpp Parser.y
を後からXcodeに読み込ませる。
● なんとかおしまい
上記でビルド成功(ちょっぴりwarningまだ出るけどね)。
次は
● 今まで作ってた
SDL2.0のプログラムとマージしてみる。