經過進一步搜索,我碰到了rexical的寶石,它本身就是雷克斯的重命名和偉略維護版本。這是一個老派的詞法分析器生成器,它只依賴於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,用舊的火箭運營商語法替換新的關鍵字樣式的散列鍵語法。 [這樣做是爲了讓vMATCodeMonkey對未更新的的Mac OS X 10.8工作仍然附帶紅寶石的一個過時版本。]