ネストした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は完全に同じものとして扱っていいのだろうか?という疑問があります.

イケなさそうな気がするけど反例が思いつかない.