構文解析できた

LISPを少しずつ作っている。とりあえず、構文解析まではできた。
受理する構文をBNF的に書くと、以下の通り。

<expr> ::= <atom> | <list>
<atom> ::= <identifier> | <string> | <number> | <boolean>
<list> ::= <open_paren> [<expr>+ [<dot> <expr>]] <close_paren>


ただし、それぞれ

  • はS式
  • はアトム
  • は識別子
  • は文字列
  • は数値
  • は真理値
  • はコンスセルまたは空リスト
  • はカッコ
  • はコッカ
  • はドット
  • |は「または」
  • []は省略可能
  • +は1回以上の繰り返し

とする。
からまでを表すクラスを定義して、てっとり早くInterpreterパターンでParseして構文木を作った。
とっても簡単。そういや、このパターン使うの初めてだなぁ。


まだ評価する部分を実装していないから、現時点では構文木をToString()して表示するだけのプログラム。

結果の文字列をGaucheに食わせても、ちゃんと動いたよー。