yacc/lex
yacc/lexの使い方を勉強してます。
yaccというのはコンパイラコンパイラで、独自のコンパイラを作るためのツールです。
なんでこれらのツールを勉強しているかというと、基板検査等に使うための強力なJTAGスクリプト言語を開発するためです。
実用的なスクリプト言語を作ろうとすると、for文やif文、変数の扱いが必要になってきますが、それを自分でどうやって実装しようかと2、3日悩んだ挙句、自分で考え出すのは難しいという結論に至り、本を買って勉強することにしました。
今回の参考文献は、「コンパイラ構成法」 原田賢一著 共立出版。この本は教科書的で、yaccとlexでの例を出しながらコンパイラの理論を教えてくれます。
yaccの使い方は、やはり最初は四則演算のできる電卓の作り方のことからはじまります。
で、わかってきたのはyaccを使っても制御構文は自動的には作れないということです。
ifとかelseとか、そういう制御構造で行う処理は自分で書かなければなりません。
変数に遭遇したときの処理も自分で作らなければいけなさそうです。
yaccというのは、つまるところルールに従って入力文の構造を解析し、解析木を作ってアクションを起こすことくらいしかやってくれないようです。
さて、ソフトウェアを作るとなると心配なのがライセンスです。
コンパイラコンパイラは、出力したコードの中に自分自身のコードを入れるので、一般にその成果物のライセンスがややこしくなります。
yaccやlexにはGNUが実装したものがあって、yaccに対応するのがbison。lexに対応するのがflex。
bisonを使った場合、下手するとGPLに汚染されたコードを出力してしまいかねません。
一応bisonはバージョン1.24から出力したコードをGPLにしなくても良いという例外措置がとられたそうなのですが、何が潜んでいるかわからないので、やはり怖いです。
ここは、ライセンスの綺麗な純粋のyaccを探して使うか、リリース用のパーサは自前で作るかしたほうが良さそうだなという感触です。
#それにしても、yaccとlexのライセンスがわからない。
電卓程度ならば、自分で書いたルーチンよりも、yaccが自動で出力したソースの方が圧倒的に大きいのですが、構造とか変数とかスコープを実装した実用的なコンパイラとなると自分で書いたプログラムのほうがyaccの出力よりもはるかに大きくなりそうです。
最近のコメント