私は次のバイソン文法を持っています(より複雑な文法の一部として):
expression:
IDENTIFIER
| CONST
| LAMBDA match_block
;
match_block:
pattern '=' expression
| match_block '|' pattern '=' expression
;
pattern:
IDENTIFIER
| CONST
;
これは、次の例のように、パターンマッチングを使用して識別子、定数、ラムダ関数を含む式を記述します。lambda 0 = 1
| 1 = 2
| x = x
問題は、ネストされた一致とのあいまいさによって引き起こされる1シフト/リデュースの競合です。
lambda 0 = 1
| x = lambda 1 = 2
| y = 4
ルールは、一致ブロックが最も近い関数に関連していることです。上記の例ではインデントで示されています。
私の質問は、この文法を書き直して、このあいまいさを排除するにはどうすればよいですか(%left%right yaccディレクティブを使用せずに)?