問題タブ [parsec]
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.
haskell - Haskellパーセクと順序付けられていないプロパティ
私はParsecを使用して次のようなものを解析しようとしています:
私はiCalendar仕様を実装しており、XMLにname:attributes:contentトリプレットがあるのと非常によく似たname:parameters:valueトリプレットがあります。実際、iCalendarをXML形式に非常に簡単に変換できます(私は実際には利点を理解できないと思いました)。
私のポイントは、パラメーターはまったく順序を指定する必要はなく、各パラメーターは異なるタイプである可能性があるということです。1つのパラメーターは文字列で、もう1つのパラメーターは別の要素の数値IDです。それらはまだ類似性を共有していない可能性があります。最終的には、パーサーに返してほしい「SomeObjectInstance」の正しいレコードフィールドに正しく配置したいと思います。この種のことを行うにはどうすればよいですか(または、誰かがこのようなデータを解析しなければならなかった例を教えていただけますか)?
ありがとう、私の質問はおそらく少し混乱していることを知っていますが、それは私が何をする必要があるかについての私の理解のレベルを反映しています。
編集:私は期待される出力を与えないようにしようとしていました(それが隠されているためではなく、大きいため)が、ここに入力ファイルの例があります(ウィキペディアから):
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-// hacksw / handcal // NONSGML v1.0 // EN
BEGIN:VEVENT
UID:uid1@example.com
DTSTAMP:19970714T170000Z
ORGANIZER; CN = John Doe:MAILTO:john.doe@example .com
DTSTART:19970714T170000Z
DTEND:19970715T035959Z
概要:バスティーユデーパーティー
END:VEVENT
END:VCALENDAR
ご覧のとおり、VCalendar内に1つのVEventが含まれているので、ここでそれらを表すデータ構造を作成しました。
そのタイプのファイルをデータ構造に解析するパーサーを作成しようとしていますが、任意のタイプの任意の順序で来るプロパティを処理する必要があるビットに固執しています。日付、時刻、整数、文字列、uid、電気ショック療法。iCalendarの仕様全体を繰り返さなくても、それがより理にかなっていることを願っています。
haskell - Haskellの型システムを使用して、パターンマッチングを実行しながら、正確さを強制するにはどうすればよいですか?
ある種のツリー構造を表すadtがあるとしましょう。
型コンストラクターに対してパターンマッチングを行う方法がないことを知っている限り(または、マッチング関数自体に型がない場合)、コンパイル時の型システムを使用して、戻り値や解析の可能性を排除したいと思います。ツリーノードの「タイプ」が間違っています。たとえば、CNodeはANodeの親にしかなれません。私は持っているかもしれません
私のCNodeパーサーの一部として使用されるParsec解析関数として:
型システムによると、parseANodeはMaybe CNode、Maybe BNode、またはMaybe ANodeを返す可能性がありますが、MaybeANodeのみを返すようにしたいのです。これは、データのスキーマ値や実行時のチェックではないことに注意してください。実際には、特定のツリースキーマ用に作成したパーサーの有効性をチェックしようとしています。IOW、私は解析されたデータのスキーマの正しさをチェックしようとはしていません。実際にやろうとしているのは、パーサーのスキーマの正しさをチェックすることです。いつかparseANodeを台無しにしないようにしたいと思います。 ANode値以外のものを返します。
バインド変数の値コンストラクターと照合した場合、型推論によって意味がわかることを期待していました。
しかし、これには多くの問題があります。特に、そのparseANodeはNothingを返すことができなくなりました。そして、それはとにかく機能しません-parseANodeがNothingまたはMaybe BNodeなどを返す場合、バインド変数はパターンマッチとして扱われ、ランタイムは非網羅的なパターンマッチングについて文句を言うようです。
私はこれらの線に沿って何かをすることができました:
しかし、制約がすべてのノードに適用されることを前提としているため、この種の問題はありません-私はそれを行うことに興味がないかもしれません-実際、ANodeの子育てのみが可能なのはCNodeだけかもしれません。だから私はこれを行うことができると思います:
しかし、これにより、* Nodeとのパターンマッチングがはるかに困難になります。実際、これらは完全に異なるタイプであるため、不可能です。パターンマッチングしたいところならどこでも型クラスを作ることができたと思います
とにかく、これはちょっと厄介なようです。誰かがこれを行うためのより簡潔な方法を考えることができますか?
parsing - Parsecのオプションのパーサーから値を取得するには?
初心者の質問で申し訳ありません-定義されたものを解析したい
私はこれができると思った:
オプションの部分が存在する場合は str0/str1 を取得したいです。そうでない場合、str0/str1 は "" になります。ただし、(1) と (2) は機能しません。optional() では、そのパラメーター (この場合は parserOptionalPart0/parserOptionalPart1) から結果を抽出できないためです。
今それを行う適切な方法は何ですか?
どうもありがとう!
ビリー・R
parsing - パーセクは多くの質問を解析します
プログラミング言語用のパーサーを作成する必要があります。これまでのところ、細かい部分を除いて、95%完了しています。
この言語で書かれたプログラムの構造は次のとおりです。
要件は、出力を入力と混合できないことです。例えば:
単一の出力を問題なく解析できますが、(many1出力)を使用して複数の出力を許可しようとすると、入力を出力として解析しようとするため、機能しません。
私のメインパーサーは次のようになります。
簡単そうに見えますが、いろいろ試してみましたが、うまくいきません。助けてください。
haskell - Data.Text での Parsec の使用
を使用するParsec 3.1
と、いくつかのタイプの入力を解析できます。
[Char]
とText.Parsec.String
Data.ByteString
とText.Parsec.ByteString
Data.ByteString.Lazy
とText.Parsec.ByteString.Lazy
Data.Text
モジュールには何も表示されません。String
非効率性に苦しむことなく、Unicode コンテンツを解析したいと考えています。したがって、モジュールに基づいて次のモジュールを作成しましたText.Parsec.ByteString
。
- そうするのは理にかなっていますか?
- これは、Parsec API の残りの部分と互換性がありますか?
追加コメント:
{-# LANGUAGE NoMonomorphismRestriction #-}
機能させるには、解析モジュールにプラグマを追加する必要がありました。
構文解析Text
と AST の構築Text
は別物です。pack
また、String
返品前に次のことを行う必要があります。
haskell - Parsec - '多数' とエラー メッセージ
を解析しようとすると many p
、「expecting p」メッセージが表示されません。
比較する
「。」を報告します。私が期待するように。many1 p <|> return []
同様に動作します。
これらの関数はすべて空の input を受け入れるmany
のに、期待しているものを報告しないのはなぜでしょうか? それはバグですか、それとも機能ですか?
parsing - HaskellのParsec<|>演算子の問題
私はHaskellとParsecの両方に不慣れです。特に言語とそのライブラリについてさらに学ぶために、Luaで保存された変数ファイルを解析できるパーサーを作成しようとしています。これらのファイルでは、変数は次の形式をとることができます。
varname = value
varname = {値、値、...}
varname = {{value、value}、{value、value、...}}
これらのタイプごとにパーサーを作成しましたが、choice <|>演算子を使用してそれらを文字列化すると、タイプエラーが発生します。
私の仮定は(ドキュメントでは見つかりませんが)、choice演算子に渡される各パーサーは同じ型を返す必要があるということです。問題のコードは次のとおりです。
haskell - パーサーコンビネーターを効率的にすることはできますか?
約6年前、私はOCamlで自分のパーサーコンビネーターのベンチマークを行い、当時提供されていたパーサージェネレーターよりも約5倍遅いことがわかりました。私は最近、このテーマを再検討し、HaskellのParsecと、F#で記述された単純な手巻きの優先順位クライミングパーサーのベンチマークを行いました。F#がHaskellより25倍高速であることに驚きました。
これが私がファイルから大きな数式を読み取り、それを解析して評価するために使用したHaskellコードです:
これが、F#の自己完結型の優先順位クライミングパーサーです。
私の印象では、最先端のパーサーコンビネーターでさえ、バックトラッキングに多くの時間を浪費しています。あれは正しいですか?もしそうなら、競争力のあるパフォーマンスを得るためにステートマシンを生成するパーサーコンビネーターを書くことは可能ですか、それともコード生成を使用する必要がありますか?
編集:
ベンチマーク用に〜2Mbの式を生成するために使用したOCamlスクリプトは次のとおりです。
xml - Haskell で XML を解析する
株式市場の相場 (サンプル データ)を含む XML ファイルを定期的に提供する Web ページからデータを取得しようとしています。XML の構造は非常に単純で、次のようなものです。
(それ以上ですが、例としてはこれで十分です)。
私はそれをデータ構造に解析したいと思います:
私は Parsec がどのように機能するか (Real World Haskell book のレベルで) を多かれ少なかれ理解しており、Text.XML
ライブラリを少し試してみましたが、開発できたのは機能するコードだけでしたが、そのような単純なタスクには大きすぎて、中途半端なハックであり、できる限りのことではありません。
私はパーサーと XML についてあまり知りません (基本的に RWH の本で読んだことは知っていますが、パーサーを使用したことはありません) (私は統計プログラミングと数値プログラミングを行うだけで、コンピューター科学者ではありません)。各要素を手作業で解析したり、純粋な文字列を解析したりすることなく、モデルが何であるかを判断して情報をすぐに抽出できる XML 解析ライブラリはありますか?
私は次のようなことを考えています:
ここでは、純粋な文字列を処理してコンビネータを自分で作成する必要はありません (私はそれが嫌いです)。
編集: おそらく、一般的なパーサー (Parsec だけでなく) と XML に関する最低限のことについて、少し (これを正しく行うのに十分なだけ) 読む必要があります。皆さん、何かお勧めはありますか?
解析する必要がある実際の文字列は次のとおりです。
EDIT2:
私は次のことを試しました(readFloat、readQuoteTimeなどは、文字列から物を読み取るための単なる関数です)。
ghciで呼び出すと:
何か問題がありますか?
c++ - メイクファイルの変更
PARSEC オープンソース ベンチマークの次のファイルがあり、gcc を使用してプロファイルできるようにしたいと考えています。それでも、ご存知のように、-pg フラグを立てる必要があります。それでも私はそうするのに苦労しています。通常の g++ -pg -o files.cpp を使用しようとしましたが、機能しませんでした。また、-oi の前に -pg を配置した makefile を変更しようとしましたが、大きなエラーも発生しました。だから今、私は立ち往生しています.何か間違ったことをしたか、-pgフラグに何か特別なものが必要です.しかし、メイクファイルを単独で実行すると、実行してテストした出力が得られ、成功しました! だから私はソースコードが私のコンパイラによって受け入れられると確信しています