Gauche を PL/0 処理系にする

Scheme 処理系 Gauche のリーダを差し替える方法とその利用例を先日は紹介しました。

更に別のプログラミング言語で書かれたコードを埋込めるのではないかと考えて、 PL/0 を題材に実際に試みてみました。 成果物は github に上げています。 説明は最小限なので同梱しているサンプルを見た方がわかりやすいでしょう。

PL/0 の文法規則は Wikipedia だけを参考にしたので挙動が本来の PL/0 の通りであるか詳細な試験はしていません。 リーダを差し替えることの効果確認やパーサライブラリの使い方を把握しようとしたものであり、もう更新はしないと思います。

さて、今回の作業で気付いたのはポートを遅延シーケンスにしたものを使うと一文字分を余計に先読みしてしまう性質があるのは地味に厄介ということです。 前回の記事でも取り上げたように、先読みで文字を消費してしまうとまともに使えない場合があるのです。 リーダから戻ってきたときに既に消費した分が消えてなくなってしまうからです。 PL/0 の場合は文法的にピリオドがプログラムの終了であるとトークン分割時に把握できるのでそこで一旦停止するように出来ますが、複雑な文法だと難しいかもしれません。 何か根本的な解決方法があればよいのですが。

Document ID: 40c6998a102315dce57a5650258637bc