さらに検索した後、 rexの名前が変更され、わずかに維持されたバージョンであるrexical gem に出会いました。これは古い学校のレクサージェネレーターであり、依存関係はracc/parserにのみあります。これは、長い間ruby -coreの一部であったため、心配する必要はありません。
ドキュメントはまばらですが、このトピックに触れているブログ投稿が十分にあったので、必要なものを手に入れることができました。
ここまで読んだことに興味がある方のために、.rex仕様の例を次に示します。
require 'generator'
class OptionSpecsLexer
rules
\d+(\.\d*) { [:number, text] }
\w+: { [:syntax_hash_key, ":#{text[0, text.length - 1]} =>"] }
\:\w+ { [:symbol, text] }
\w+\( { [:funcall_open_paren, text] }
\w+ { [:identifier, text] }
\"(\\.|[^\\"])*\" { [:string, text] }
=> { [:rocket, text] }
, { [:comma, text] }
\{ { [:open_curly, text] }
\} { [:close_curly, text] }
\( { [:open_paren, text] }
\) { [:close_paren, text] }
\[ { [:close_square, text] }
\] { [:close_square, text] }
\\\s+ { }
\n { [:eol, text] }
\s+ { }
inner
def enumerate_tokens
Generator.new { |token|
loop {
t = next_token
break if t.nil?
token.yield(t)
}
}
end
def normalize(source)
scan_setup source
out = ""
enumerate_tokens.each do |token|
out += ' ' + token[1]
end
out
end
end
このレクサーは、私のvMATCodeMonkey DSL で記述された仕様を前処理するのに十分なRuby構文を理解し、新しいキーワード形式のハッシュ キー構文を古いロケット オペレーター構文に置き換えます。[これは、vMATCodeMonkeyが更新されていないMac OS X 10.8で動作できるようにするために行われました。この Mac OS X 10.8 には、廃止されたバージョンのruby が同梱されています。]