構文解析(3)
正規表現風の記法を作って,そこから等価なルールセットを生成できれば,もう少し見やすくなる?
A|B AまたはB A&B AかつB !A A以外 A-B AかつB以外 = A&!Bと等価 () 優先順位変更 . 任意の1文字 [] 文字選択 [a-c]と[abc]が等価 * 0回以上の繰り返し + 1回以上の繰り返し ? 0または1回 {rule}別ルールの埋め込み
みたいなのを作って
rule(:quoted_value, "((\"\")|(.-\"))*") rule(:naked_value, "(.-[,\"\n])*") rule(:quote, "{space_opt}\"{quoted_value}\"{space_opt}") rule(:value, "{quote}|{naked_value}") rule(:csv, "({value}(,{value})*\n)+")
とか.
却って判りにくいような….1ルール,1アクションなので,1行に1ルールのこの記法だと細かく分解する必要があるし.
スペースは\sで指定することにして,式中のスペースは全部無視するようにすれば少しはマシになるか?
rule(:quote, "\s* \" {quoted_value} \" \s*")
追記:なんと\sは勝手にスペース(0x20)に置き換えられるのか.知らなかった.