Ruby as a parser extension - akamah/garbanzo GitHub Wiki

構文解析器の拡張構文としてRubyを使う

構文解析のルールを追加するのに、Rubyを使うというアイディア。 たとえばこんな感じ?

print(1 + 2);     # これは対象とする言語の文

%{ # このかっこにぶつかったら、

# ここをRubyのプログラムとして解釈して実行する。
parser.expressions << Proc.new(s) {
  e1, rest1 = parser.read_expression(s)
  sp, rest2 = parser.read_spaces(rest1)
  op, rest3 = parser.read_char('*').call(rest2)
  sp, rest4 = parser.read_spaces(rest3)
  e2, rest5 = parser.read_expression(rest4)
  return new Multiply(e1, e2), rest5
}

%}

print(4 * 8);

ここで発生することとしては、以下のことがある。

  • もともと存在する文法に、%{と %}が含まれることになる。
  • 読み込みつつ実行する場合、1行1行を隔てることを認識する必要がある。
  • 事前に全て読み込んでからの場合は、文法を定義するメタ構文として %{ 〜 %}のみが意味をなしてしまい、構文を定義する構文を定義できない。