非専門的シンギュラリティー研究所

無限に動き続けるシステムを表す方法を AI なども使って考えていきます。

コンパイラ(2)

C++ のパーサーコンビネーターとしては Boost.Spirit というものがあるそうですが、検索してみたところ使うのは難しそうです。自力でパーサーコンビネーターを作っているような記事もありました。調べていないのですが簡単な構文を書くには向いていないのかもしれません。

「自由モノイドのイテレーター」の記事(『自由モノイドのイテレーター(39) - 非専門的シンギュラリティー研究所』など)や「モノイド的構文解析」の記事(『モノイド的構文解析(10) - 非専門的シンギュラリティー研究所』など)で、Python のパーサージェネレーター lark や C# のパーサーコンビネーター Sprache を使っています。また、PythonC# の動的にコードを実行する機能を使っています。

C# 版では C# のコードとして構文を書くことができるようになっています。ここでは、これを C++ で書けるようにします。基本的には

  • 演算子 & で構文要素が連続する
  • 演算子 | で構文要素のどちらかが成立する
  • 演算子 ^ で構文要素に構造を対応させる

ことを表します。C++ でも演算子の再定義ができるので可能と考えられます。文字列を基本的な文字列に分割したものと、文字列を構造に変換したものを対応させることを、一般的な呼び方が見つからないのでここでは「モノイド的」と呼んでいます。これは素因数分解を一般化したものと考えることができます。これを構文解析に対応させたものについて考察しています。演算子 & と | を持つ半環について考察します。

ふつうのコンパイラをつくろう 言語処理系をつくりながら学ぶコンパイルと実行環境の仕組み』に C のサブセットのようなプログラミング言語「C♭」が定義されているのでこれを参考にします。