問題タブ [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.
parsing - パーサーは、任意の改行と空白の解析を停止しません
だから、私は pegjs で非常に基本的な Lisp パーサーを書こうとしていて、Lisp コードが構文的に有効で 1 行に収まる限り、同じコードを吐き出すことができました。
コード内の任意の場所に挿入された改行文字と余分な空白を受け入れることができるようにパーサーを拡張したいと考えています。
したがって、すべてが1行にある限り機能するコードは次のとおりです。
次に、改行と空白を許可しようとして、「タプル」のルールを次のように変更してみました
しかし、この変更により pegjs は無限ループに入りますが、ルールへの追加は再帰的ではないように見えます。
注:私が何をしようとしているのか不明な場合は、pegjs が解析するパーサーを吐き出すような文法を書いています。
文字列と同じコードを吐き出すか、単に
どちらも私にとってはうまくいきます。
私の現在の作業文法が行うことは、
と出力
各「トークン」または「タプル」の後に改行文字を 1 つだけ許可するのは些細なことですが、合法的なコードとして次を受け入れたいと思います。
javascript - 「?」で始まるトークンを一致させるにはどうすればよいですか? ペグで
pegjs を使用して、このようなトークンを一致させる必要があります。
私はこれがうまくいくと思っていたでしょう:
取得したソースを解析すると、次のエラーが表示されます。
物体 ?メソッド「結合」がありません
これは、str
変数が一致したトークンの配列ではないためです...これをどのように行うべきか考えていますか?
javascript - PEGJS: 文法を渡す方法
PEGJSチュートリアルからの引用:
パーサーを生成するには、PEG.buildParser メソッドを呼び出し、文法をパラメーターとして渡します。
私の文法はもう少し複雑です:
PEG.buildParser
文法の開始規則、つまりに合格する必要がadditive
ありますが、正しく理解できません。PEG.buildParser(additive)
またはと書く
PEG.buildParser(start)
と、FireBug は次のように言いました
SyntaxError: Expected "=" or string but end of input found
。私が書くPEG.buildParser(start = additive)
と、私は得GrammarError: Referenced rule "additive" does not exist
ます。私の文法を渡す正しい方法は何ですか?
javascript - PEG.js:プロンプトの使い方は?
PEG.js を使用して C++ パーサーを作成していますが、cin
. After-match JS で を使用するprompt()
と、(代替)オンライン バージョンで「解析エラー: プロンプトが定義されていません」というエラーがスローされます。イニシャライザを使用してレプリケートする関数を作成しようとしていますprompt
(おそらく最適化されていないため、解決策として試しただけです)。ただし、これを行うと、まだエラーが発生します。私も使用window.prompt
してみましたが、やはりうまくいきません。これが私がやっていることの例です:
次に、パーサー テスト フィールドで:
ご覧いただきありがとうございます。これをグーグルで検索し、これを検索してみましたが、結果が見つかりませんでした。
また、ここにコードの主要部分があり、誰もが必要とするすべての (現在の) 追加情報が含まれています。これにもいくつか問題がありますが、別の質問を投稿する前に、自分で解決しようとします。
javascript - require と module.exports を使用して PEGJS パーサーをインポートする
複数の異なるファイルで PEGJS パーサーを使用しようとしています。メソッド var Parser = require("./Parser"); を使用します。
ただし、Parser.parse を使用して何かを解析しようとすると、Parser が定義されていないため、解析できません。
どうすればこれを修正できますか? 以前は機能していましたが、文法にいくつかの変更を加え、パーサーを再生成する必要がありました。
実行時に発生する正確なエラーは Uncaught TypeError: Cannot read property 'parse' of undefined です
インポートしようとしている基本的なコードは以下のとおりです。
そして、私はこの関数をインポートして使用しようとしています
javascript - PEG.js を使用して左結合演算子ツリーを構築するにはどうすればよいですか?
PEG.jsを使用して、左結合演算子の AST ( Abstract Syntax Tree ) をどのように構築しますか?
インターネットで見つけた情報に基づいてコードを記述しようとしましたが、間違いを犯したようです。
私が書いたコードは、ほとんどの式に対して間違った AST を生成します。
表現
予想AST
生成された AST
コード
左結合演算子と右結合演算子の両方の AST を構築する方法について、ヘルプやサンプル コードをいただければ幸いです。
編集: @Bergi が指摘したように、問題は、の代わりに残りの演算子リストの式としてE2
使用されることでした。しかし、Bergi が書いたコードは私のものよりずっと単純です。E1
Value
node.js - バックトラッキングは peg.js でどのように機能しますか (例あり)?
次の最小限の Peg.js 文法を定義しました。
サンドボックスで試すことができます。
「A1」と「A123」が一致すると予想していました (バックトラッキングの仕組みに関する私の考えによると)。しかし、そうではありません: 文法は "A1" を認識しますが、"A123" は認識しません。
注:関連する質問How to transform a simple grammar into something that works in PEG.js (expected "a" but "a" found) のように、「用語の順序を逆にする」というアドバイスは探していません。むしろ、私が見ている動作と、この場合に Peg.js のバックトラッキングが適用されない理由を理解しようとしています。用語の順序を逆にしても効果がない理由については、以下のより現実的な例を参照してください。
より現実的な例として、単位の解析を考えてみましょう。文法は、メートル法単位 (「m」、「mol」など) を、「mm」、「mmol」などのオプションの接頭辞とともに認識し、「yr」、「week」、または「mo」などの非メートル法単位も認識する必要があります。
次の Peg.js 文法は、「mo」を消費してつまずいてバックトラックしないため、「mol」を認識しません。(用語の順序を変更しても意味がありません。むしろ、「mol」または「mmol」を犠牲にして「mo」が認識されるようになります。)
私はAntlrで同様のことをうまくやることができます:
parsing - 構文解析式文法: 次のトークンを検出しますか?
で PEG を開始していPEG.js
ます。
頭がよくわからないことがあります...単純なことだと思いますが、概念を理解しようとすると頭が痛くなります...
次の 2 規則文法を考えてみましょう。
「foo を bar に入れる」というパーサーを渡すことができるようにしたいと考えています。とput("foo","bar")
評価させます。
しかし、PEG.jsは私にエラーを与えますExpected " into " or any character but end of input found.
name
ルールの正規表現がより具体的である場合、この問題を修正できると思います.*
が、なぜそうしなければならないのですか? パーサーは、「.」だけでなく、「 into 」が近づいていることを先読みして確認できるほどスマートではありませんか。最後に?
探しているものをどのように達成できますか? これはおそらく「ボトムアップ」文法と「トップダウン」文法の違いでしょうか?
編集:正規表現/put (.*) into (.*)/g
は私が望むように機能します-私がそれを渡すと"put foo into bar"
、それは私$1="foo"
に andを与えます$2="bar"
. PEGjsまたはJisonを使用して、これと同じ機能を取得できるかどうかを尋ねているだけです(トークンの境界がどこにあるかを判断する前に文字列全体を考慮に入れます)。
peg - ペグ左再帰の削除
私はこのpegjs文法を持っています。左再帰を削除するにはどうすればよいですか?
javascript - _vars_with_underscores_ の検出; なぜこれが機能しないのですか?
変換する PEGjs ルールを作成しようとしています
に
私の文法は
これは
と
しかし、何かがうまくいかない
例。
これが壊れている理由がよくわかりません。なぜこのように動作しているのかについての説明が欲しいです。(必ずしも、問題の解決策さえ必要ありません。最大の問題は、私の PEGjs 文法のメンタル モデルが不十分であることです。)