2

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 の前にセミコロンが自動的に挿入されます。

では、そのようなパーサーの動作を実装する最もエレガントな方法は何ですか?

4

1 に答える 1

1

あなたが持っている

expression = try unaryExpression <|> plusExpression

UnaryExpressionしかし、 aは a のプレフィックスであるため、これは機能しませんPlusExpression。だから

input2 = [NumberToken Number1, PlusToken, NumberToken Number1, SemicolonToken]

次のトークンは ではなく であるため、パーサーは最初のトークンを喜んで解析し、NumberToken自動的にセミコロンを追加します。次に、次の を解析しようとしますが、次は であり、それで開始することはできません。PlusTokenSemicolonTokenExpressionPlusTokenExpression

パーサーが試行される順序を変更します。

expression = try plusExpression <|> unaryExpression

そして、最初に a を解析しようとし、PlusExpressionそれが失敗した場合にのみ、 a の短い解析に頼りUnaryExpressionます。

于 2013-01-06T18:41:23.623 に答える