Haskell で js パーサーを実装しようとしています。しかし、私は自動セミコロン挿入で立ち往生しています。問題をいじるためにテストプロジェクトを作成しましたが、問題を解決する方法がわかりません。
私のテスト プロジェクト プログラムでは、式 (単項またはバイナリ) のリストがあります。
data Program = Program [Expression]
data Expression
= UnaryExpression Number
| PlusExpression Number Number
入力ストリームはトークンのリストです:
data Token
= SemicolonToken
| NumberToken Number
| PlusToken
次のような入力を解析したい:
1;
-単項式 - 2
1 + 2;
項式
1; 2 + 3;
- 2 つの式 (単項および 2 項)
1 2 + 3;
- 前の入力と同じですが、最初のセミコロンがありません。そのため、パーサーはトークン 1 を消費しますが、トークン 2 はどの文法の生成でも許可されていません (次に予想されるトークンはセミコロンまたはプラスです)。自動セミコロン挿入のルールでは、この場合、トークン 2 の前にセミコロンが自動的に挿入されます。
では、そのようなパーサーの動作を実装する最もエレガントな方法は何ですか?