構文解析(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)に置き換えられるのか.知らなかった.