Bisonで再入可能な構文解析器を作る(C言語版)

前回作った電卓プログラムは、Bisonが吐き出した main.tab.c というCのコードをコンパイルしてリンクしています。
中を見ると、yyparse関数の中でグローバル変数 “yychar” を初期化したり、字句解析器によって切り出されたトークンを代入したりしているので、このyyparseは再入可能ではありません。つまり、スレッドセーフではないということになります。
(他にも、グローバル変数yylvalを介して 字句解析器とやりとりしてたりします。)

Bisonが再入可能なコードを吐くようにするやりかたは次の2つ。

  • 再入可能なCのコードを出力させる
  • C++のコードを出力させる

今回は1つ目の方法をとります。
続きを読む Bisonで再入可能な構文解析器を作る(C言語版)

久々にBison/Flex

簡単なDSLのスレッドセーフな構文解析エンジンを作る必要ができたので、いろいろ調べつつメモ。
構文解析器はBison、字句解析はFlexに作ってもらいます。
かなり昔に、”ぼくのかんがえたさいきょうのぷろぐらみんぐげんご”のソースを標準入力から読み込み、”ぼくのかんがえたさいきょうのぶいえむ”用のバイトコードを出力するプログラムを作ったことがあったので、Bison/Flex についてはなんとなく覚えています。

今回作るのは、

  • ポートをLISTEN
  • 接続を確立したらスレッド分岐
  • 設計したDSLで書かれたプログラムを受信し、結果を送信する。

というものです。

ですので、構文解析エンジンは最低限次のことを満たす必要があります。

  • 入力はファイルからではなく、文字列、文字バッファ、またはストリームから
  • 出力はストリームに
  • スレッドセーフ(再入可能)

続きを読む 久々にBison/Flex