問題タブ [trifecta]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
parsing - Trifectaのレイアウトパーサーを使用する
私は、Haskellのようなレイアウト構文を使用して非常に単純な関数型言語を解析するためにTrifectaを実験しています。Trifecta自体に紹介資料が見つからなかったため、HaddockのドキュメントとParsecでの経験に取り組んでいます。
私が抱えている問題は、Haddockのドキュメントでさえあまり役に立たないため、レイアウト関連のものを使用することです。
次のコードが与えられます:
次のテキストを次のように解析しようとしていますtest
:
しかし、この解析エラーで失敗します:
しかし、2行目と3行目をコメントアウトすると、機能します。
では、2行目と3行目を含めても解析するにはどうすればよいですか?
parsing - Haskell/Trifecta: AST を汚染することなく完全にオプションのセミコロンを解析する
より簡潔なコード例で最初に投稿されたので、質問を書き直しました。
完全にオプションのセミコロンを持つ言語をほぼ完全にシュガーとして考えてみましょう。
;; foo; bar;;;;
有効ですfoo bar foobar
有効ですif (+1); foo
if (+1) foo
はセマンティクスが異なるため、;
空白と見なすことはできません
パーサーの例を次に示します。
このようなパーサーで私が抱えている問題は、pStmt
. 現時点では、次のエラーが発生します。
これは、ステートメント (in semi *> pStmt
) が必要なためですが、積み重ねられたセミコロンが式の最初と最後を砂糖漬けにする可能性があるため、すでに期待する前に本当に期待/解析したいのかどうか確信が持てません。
私が開発したハックの 1 つNop
は、AST でコンストラクターとして使用することでしたが、実際にはそうしたくありません。ハックのように感じられ、ドキュメントによってはセミコロンの数が多いため、メモリ使用量が大幅に増加します。
解決策/提案を探しています。
目的の文法の EBNF 形式を試みます。
haskell - 一度に 2 つのレコード フィールドを更新するときのあいまいな型変数 (ただし、1 つを更新するときは違います!)
次のコードは、「あいまいな型変数」エラーで失敗します (下)。ただし、レコードを 2 回更新する別の定義は問題なく機能します。これはなぜでしょうか? さらに、以下の「壊れた」定義は、 Trifecta ソースのものと非常によく似ています。私はtrifecta 1.5.2とパーサー0.12.3に対してGHC 7.10.3でコンパイルしています。
これが作業(代替)定義です
最初の定義によって生成されるエラーは次のとおりです。
haskell - trifecta パーサーで失敗を通知する方法
trifecta の実験として、次の単純な関数を作成しました。
アイデアは、パーサーに条件を追加できるようにすることでした。たとえば (述語prime
が既に存在すると仮定して)、次のように記述
filterParser prime integer
します。素数のみを受け入れるパーサーを作成します。
単一の解析では問題ないようです:
しかし、「多数」では機能しません-比較してください:
最後の例も返されることを望んでいましたSuccess "zzz"
。への呼び出しunexpected
は、解析全体を脱線させるように見えますが、これは私が望んでいたものではありません。
parsing - パーサーで解析された整数を返す integer >> eof bind を使用
trifecta ライブラリを使用して、末尾の文字を含まない整数文字列を解析し、解析された整数を返すことになっています。
次のように do 表記を使用してこれを行うことができました。
しかし、これをバインド/ラムダに変換することに失敗しました。
これは解析された数値を保持しませんが、それ以外は正しいです:
私はこのように始めるべきだと思います
しかし、この後、私が試したすべての順列は機能しません。解析された数値を返し、do の代わりに bind 構文を使用して eof をチェックするにはどうすればよいですか?
parsing - Haskell (Trifecta) で 3 桁の数字を解析する最も簡潔な方法
3 つの連続した数字を文字列に解析する慣用的な方法は何ですか?
以下は機能しますが、スケーリングしません。
より一般的には、これは N 個の数に対してどのようにスケーリングできますか?