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行を隔てることを認識する必要がある。
- 事前に全て読み込んでからの場合は、文法を定義するメタ構文として %{ 〜 %}のみが意味をなしてしまい、構文を定義する構文を定義できない。