問題タブ [pegjs]
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.
javascript - PEG.js ( と ) の間のテキストを取得します。
最後にセミコロンを使用して、段落間のテキストをキャッチしようとしています。
例:(in here there can be 'anything' !"#¤);); any character is possible);
私はこれを試しました:
しかし、 (.*) には最後の ); が含まれるようです。前 ");" エラーが発生します:
期待される ");" または入力の末尾以外の任意の文字が見つかりました
問題は、テキストに「);」が含まれる可能性があることです。だから私は最も外側が欲しい); 行がいつ終了するかを決定します。
この正規表現\((.*)\);
は私が望むことを行いますが、どうすれば PEG.js で同じことを行うことができますか? 結果に外側の括弧とセミコロンを含めたくありません。
これは、自分が何をしているのかを知っていれば、非常に簡単なようです = P
regex - PEG.js ヘルプ - オプションのフリー テキストとそれに続くキーと値のペア
次のパーサーを作成しました ( http://pegjs.org/onlineに貼り付けると動作します):
次のキーと値のペアの文字列を解析しますlocation=USA; application<>app; count>5
。
[
{
"key": "location",
"op": "=",
"value": "USA"
},
{
"key": "application",
"op": "<>",
"value": "app"
},
{
"key": "count",
"op": ">",
"value": "5"
}
]
問題は、キーと値のペアの前に入力されるフリーテキスト検索も有効にしたいことです。たとえば、 this:free text foobar; location=USA; application<>app; count>5
と get this:
[
{
"key": "fullText",
"op": "=",
"value": "free text foobar"
},
{
"key": "location",
"op": "=",
"value": "USA"
},
{
"key": "application",
"op": "<>",
"value": "app"
},
{
"key": "count",
"op": ">",
"value": "5"
}
]
パーサーは、最初の部分が ("Pair" ルールに従って) キーと値のペアではないことを認識し、それを "fullText" オブジェクトとして挿入する必要があります。
ドキュメントで読んだことによると、基本的に「式」ルールで実行する必要があります-A / Bは、Aが合格しない場合、Bが試行されることを意味します。2 番目のケースでは、「Paris」は「free text foobar」が Pairs ルールに合格しないため失敗しますが、先に進む代わりに例外をスローするだけです。
ここまで生き残った人におめでとう、私は何を間違っていますか? :) ありがとうございました
javascript - PEGjs の条件付き文法規則
基本的な算術式を解析する単純な DSL を実装しようとしています。これはブラウザーで行う必要があるため、PEGjs を使用してパーサーを生成しています。
式の用語は、数値 (整数または実数)、変数 (変数はパーサーに渡されるコンテキスト オブジェクトのプロパティ)、条件、またはドット表記を介してアクセスされるプロパティです。
条件をこの のようにしたいのですcondition?value
が、condition
が true の場合、用語は に相当しvalue
ます。の両側の変数は、?
このようなオブジェクトのプロパティにアクセスするドット表記にすることもできますobject.property1?object.property2
。
したがって、パーサーに次のようなオブジェクトが渡された場合:
表現:
500 + depth + material.include?edge.face + material.thickness
に等しい必要があり624.5
ます。
私は PEGjs オンライン エディターを使用しています。私はさまざまなアプローチを試しましたが、条件を釘付けにすることはできません。他のすべてが機能します。関連するルールは次のとおりです。
PEGjs github repo で javascript の文法例を見てきましたが、条件付きルールはここにあるものとよく似ていますが、まだ機能させることができません。
PEGjs ルールで説明したような条件ステートメントを実装する正しい方法は何でしょうか?
parsing - 入力の末尾以外の任意の文字が必要です
私の入力は次のような再帰構造です (空白の 2 行目に注意してください)。
xxx @{} yyy @{ zzz @{} wwww }
私が見る文法は次のようになります。
しかし、私が得るのは
行 2、列 1: "@{"、"}"、または入力の末尾以外の任意の文字が必要です。
私は何を間違っていますか?