compiler
yacc
brew-cask
bison
lex

大川知、鈴木大郎 著「コンパイラ 言語処理系の基礎からyacc/lexまで」近代科学社(2008)のソースをMacintoshでコンパイル(C++版)

大川知、鈴木大郎 著 「コンパイラ 言語処理系の基礎からyacc/lexまで」近代科学社(2008)のソースをMacintoshでコンパイルする(C++版)

ソースコードは近代科学社のsuppportにある。

学内での利用を前提としている。「学外での配布を禁止」している。
[リンク]https://www.kindaikagaku.co.jp/support/compiler_kindaikagaku.zip

ダウンロードして解凍する。さらに、フォルダの中のtglc-c++.tar.gzも解凍し、コンパイルしてみる。

cd compiler_kindaikagaku
tar -xzf tglc-c++.tar.gz
cd tglc/src
make

道具類が揃っておらず、

interpreter.cc:13:10: fatal error: 'X11/Xlib.h' file not found #include
といったコンパイルエラーなどが出たら。

準備1。yacc導入。名前はbison

brew install bison

準備2.flex導入。

brew install flex

準備3. リンク時にX11のライブラリを使用している。X11を導入。名前はxquartz。

brew cask install xquartz

準備4. 環境設定 INCLUDE

$ printenv

コマンドを実行し、

INCLUDE=/opt/X11/include

という項目があればOK。なければ追加。他の設定は消さずに追加設定すること。

$ vi ~/.bash_profile
export INCLUDE=-I/opt/X11/include:$INCLUDE

「esc」「:」「w」「q」

$ source ~/.bash_profile

あるいは

FLAGS =

FLAGS = -I/opt/X11/include

と追記する。

準備5 Clang++が入っていれば

CC = g++

CC = clang++

と変更しても良い。

main関数でエラーが出れば、次のように先頭にintを追加し関数の終わりにreturn argc;を追記。

tgl.y
...
int main(int argc, char **argv) 
...
return argc;
}
...

ここで, argcを返しているのは一つの技法。ここでは議論しない。

Q&A

なぜOSおよび言語の関連する試験プログラムではmainでargcを返すか。 
https://researchmap.jp/jo16jmzyy-1797580/#_1797580

すべての例を順次実行するシェルスクリプト。例えば名前をtgl.shにする。

tgl.sh
./tglc ../sample/asteroid.tgl   
./tglc ../sample/epicycl.tgl    
./tglc ../sample/key.tgl        
./tglc ../sample/rect.tgl   
./tglc ../sample/sin2.tgl
./tglc ../sample/c.tgl      
./tglc ../sample/hilbert.tgl    
./tglc ../sample/koch.tgl   
./tglc ../sample/sin.tgl        
./tglc ../sample/spiral.tgl

実行権限を与える

$ chmod +x tgl.sh

一枚画像を表示して、閉じると次の処理をする。

文字コードのエラー

エラーなどが出たら、文字コード変換のcvfilesで文字コードを指定する。src, sampleの両方のコードを一括変換してくれる。README-C++ファイルに記載あり。文字コード(utf8, sjis, jis , euc),改行コード(unix, win, mac)

$ cvfiles 文字コード 改行コード

上記スクリプトはnkfを使っている。

nkfがなければ導入。nkfなしでcvfilesを実行すると、すべてのファイルを0バイトにしてくれる。泣)

$ brew install nkf

参考1。 brewの導入方法

[リンク]https://qiita.com/megu_ma/items/820695ac525030285682

参考2。Xcodeの導入。下記からダウンロード。

[リンク]https://developer.apple.com/jp/xcode/

参考3。xcodeではなく、llvm/clang ++を使うためにllvmを導入する場合は

$ brew install --with-clang llvm

PATH
INCLUDE
LIB
などの設定が必要かも。

$ clang++ -v
$ make -v
$ flex -v
$ bison -v

などでそれぞれの道具類の版を出力し記録すると良い。

参考文献

参考1。 brewの導入方法
[リンク]https://qiita.com/megu_ma/items/820695ac525030285682

参考2。Xcodeの導入。下記からダウンロード。
[リンク]https://developer.apple.com/jp/xcode/

言語を作る!bisonとflexを使ってみた
https://qiita.com/toru0408/items/483c77cb76198d4c6ceb

構文解析ツール『Lex&Yacc』の簡易版をアプリに埋め込む
https://qiita.com/tohmas/items/d0a2a6a7b560c9fa8ffb

goyaccを使う
https://qiita.com/draftcode/items/c9f2422fca14133c7f6a

C++でbison(パーサジェネレーター)を使う
https://qiita.com/tosyama/items/6766321025c6a2875109

goyaccで構文解析を行う
https://qiita.com/k0kubun/items/1b641dfd186fe46feb65

CGoでYacc & Bison
https://qiita.com/chobie@github/items/8bc8d1c7104f0a3ad3fe

Markdown記法の一部を理解してHTMLに変換する処理をyacc,lexで実装してみる
https://qiita.com/toshiya/items/7fa39bd9c06fc1c0a44c

FlexとBisonをVisualStudio2017で使う
https://qiita.com/alphya/items/ca668c1315e23dac6e15

文献履歴

ver 1.00 初稿 2017/12/28
ver 1.01 shell指定 2018/03/28