ネストしたPEGの"/"(prioritized choice)は展開していいのか?
PEGはCFGより強力な文法表現で,
Not-predicate(!)とか見れば一目瞭然ですが無限先読みとか可能です.
常に貪欲に(かつ順番に)マッチするので左再帰が記述できないですけど,
上のページに'Packrat parsers can support left recursion'とも書いてあったり. がんばれば出来るのかな?
で表題の件, "/"(prioritized choice)は, 複数の展開規則(?)を左からマッチを確認していって,
マッチした段階で結果が確定する規則です.
ABC -> A / B / C A -> ... B -> ... C -> ...
ABCがある入力文字列にマッチするかを決めるには,左から順に,
- AがマッチするならA
- BがマッチするならB
- CがマッチするならC
という順でマッチを確認します. つまり左の方が優先順位(priority)が高いです.
疑問は, これがネストしてるときに, そのネストを展開しても全く同じ文法になるのか?ってことです.
たとえば,
alpha -> 'a' / 'b', ..., 'z' digit -> '0' / '1', ..., '9' alnum -> alpha / digit
みたいな(多分)よくある定義をしたいと思ったとします.
このときの規則alnumを展開して書いてみると,
// 単に規則を並べる alnum -> ('a' / 'b', ..., 'z') / ('0' / '1', ..., '9')
となりますが,これは以下の規則
// ベタに展開 alnum -> 'a' / 'b', ..., 'z' / '0' / '1', ..., '9'
と完全に同じです.
これを一般化して,
// 単に規則を並べる ABC -> A / B A -> A0 / A1 B -> B0 / B1 A0 -> ... PEG文法規則一般 A1 -> ... PEG文法規則一般 B0 -> ... PEG文法規則一般 B1 -> ... PEG文法規則一般
での規則ABCと,
// ベタに展開 ABC -> A0 / A1 / B0 / B1
での規則ABCは完全に同じものとして扱っていいのだろうか?という疑問があります.
イケなさそうな気がするけど反例が思いつかない.