Xcodeでflexつかうとエラーになる時のメモ

半日潰したのでメモ。

● 出てたのは

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 」が古いファイルを参照するので,/Application/Xcode.app/〜以下のFlexLexer.hをXcodeに内緒で差し替える
 ↓
ビルド成功(ちょっぴり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 *’) is a pointer; did you mean to use ‘->’?」

みると確かに「yyin」がポインターとして宣言されて,「.」演算子が付されてる。
「yyin.rdbuf(std::cin.rdbuf())」みたくなってて妙だ。
「yyin->rdbuf(std::cin.rdbuf())」では,ってコンパイラが言うのも確かに。

しっかしsemanticエラーたって,flexが吐いたコードだしなあ。
webによっては「もう,自分で.を->に編集しちゃおうか」的な話もあり。

● だが救世主はやはり

webの中に。

● stack overflowというサイト

国内に情報が少ない場合に大体googleでヒットするstack overflowだ。

もう。stack overflowyahoo知恵袋に世界の大半は記録されてるんじゃないか。

上記リンク先の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のプログラムとマージしてみる。