問題タブ [lpeg]
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 - boost::spirit のような LPEG (Lua Parser Expression Grammar) の使用
だから私はブースト精神文法を置き換えるためにlpegで遊んでいます.boost::spiritはlpegよりもはるかにエレガントで自然です。ただし、現在の C++ コンパイラ テクノロジの制約と C++ の TMP の問題により、これを使用するのは困難です。この場合、型メカニズムは味方ではなく敵です。一方、Lpeg は醜い基本的な結果であり、生産性が向上します。
とにかく、余談ですが、私の lpeg 文法の一部は次のようになります。
この文法は (不完全ではありますが) 次のものと一致しますnamespace foo {}
。次のセマンティクスを実現したいと思います (ブースト スピリットを使用する場合の一般的なユース ケースです)。
- 名前空間ルールのローカル変数を作成します。
namespace IDENTIFIER {
が一致した場合、このローカル変数に名前空間データ構造を追加します。- 新たに作成された名前空間データ構造を に渡し、
NAMESPACE_BODY
AST をさらに構築します... などなど。
このユースケースは達成可能であると確信しています。それを示す例はありません。その方法を理解するのに十分な言語やライブラリを知りません。誰かがその構文を示すことができますか?
編集: lpeg で踊ろうとして数日間足を踏み入れた後、私は精神に戻ることにしました :D lpeg が lua 関数で織り込まれることを意図しており、そのような織りが非常に自由であることは明らかです-フォーム (一方、スピリットには非常によく文書化された明確なセマンティクスがあります)。ルアの適切なメンタルモデルをまだ持っていません。
parsing - LPeg文法の奇妙さ
私のLuaアプリケーションの一部は検索バーであり、ブール式を理解できるようにしようとしています。LPegを使用していますが、現在の文法では奇妙な結果が得られます。
最初のトークンを解析するだけで、なぜこれを行うのか理解できません。私の知る限り!.
、開始非終端記号の終わりにあるため、部分一致は不可能です。どうすればこれを修正できますか?
lua - (cond ? then : else) を lpeg で ifthenelse(cond,then,else) に変換
lpeg lua パーサーを使用して、文字列のようなもの'a?(b?c:d):e'
を別の文字列に変換しようとしています。lpeg の使用方法をゆっくりと学んでいますが、キャプチャでこれを行うための適切なソリューションが見つかりません。何か案は?'ifthenelse(a,ifthenelse(b,c,d),e)'
これが私がこれまでに行ったことです。
lpeg - 内部グループを持つ可能性のあるカンマ区切りのグループを解析する lpeg 文法
グループ内に内部グループがある可能性があるコンマ区切りのグループ (括弧で囲まれている) を解析する必要があります。外部グループのみを分離する必要があります。
これを行う関数があります:
しかし問題は、グループを囲む可能性のある余分なブラケットを削除することです。
テスト文字列は次のとおりです。
に解析する必要があります
内部グループがそのままになっていることに注意してください。のような文字列になってしまうため、末尾の余分な括弧を単純に削除しても機能しませんa,b,[c,d]],[e,[f,g]
。
外部グループを許可するためにlpeg文法を変更する方法はありますか?
lua - Luaパターンの大文字と小文字をLPegで区別する
私は(とりわけ)プレーンテキスト検索とLuaパターンを使用した検索をサポートするアプリを持っています。便利なように、アプリは大文字と小文字を区別しない検索をサポートしています。画像スニペットは次のとおりです。
与えられたLuaパターンを大文字と小文字を区別しないLuaパターンに変換するコードはあまりきれいではありません。基本的に、文字の前に奇数または偶数のエスケープ(%)が付いているかどうか、および角かっこ内にあるかどうかが心配です。画像に示されているパターンは次のようになります%a[bB][bB]%%[cC][%abB%%cC]
私はまだLPegを学ぶ機会がありませんでした、そしてこれが私の動機であるかもしれないと思います。
私の質問は、これがLPegで簡単に処理できたものかどうかです。
lua - lua パターン マッチング: 区切られたキャプチャ
私は次のような文字列を解析しようとしています: &1 first &2 second &4 fourth \\
、そしてそれからテーブルを構築する
私は一般的に正規表現の経験があまりないので、私の素朴な試み(\\
今のところとテーブルの部分を無視して)は
これは、キャプチャされた 2 つのペアが表示されることを期待していたときに、最初にキャプチャされたペアのみを提供します。私はいくつかの読書をしてlpeg
ライブラリを見つけましたが、私にはあまりなじみがありません. ここはlpeg
必要ですか?誰かが私のエラーを説明できますか?
lua - lpeg parse 一次論理項
タイトルが示すように、たとえば解析しようとしています
のようなLuaテーブルで
これは私が構築した文法です:
次の問題があります。
- ネストされた用語を解析できません。上記の例では、 のみを返します
{term, {} }
(ただし、 で問題ありませんterm(A, b, c)
)。 - 使用した文字列から引用符を取り除く
{~ ~}
ために、そのため、すべてのキャプチャを下の行から移動する必要がargument
ありました。term
これを回避する方法はありますか? A
たとえば、のようなものの代わりに、各要素にキーを関連付けてそのタイプを指定したいと思います{value = "A", type = "variable"}
。これを行う方法を見つけました{:name: :}
が、テーブル内の要素の順序が失われます (新しいテーブルを作成するのではなく、単にキーを追加するためです。この場合variable="A"
、この要素の順序は固定されていません)。注文を維持するアイテムにタグを付けるにはどうすればよいですか?
lua - lpeg luapeg reモジュールの使用/インクルード方法
ATM アプリケーションから lua ファイルを実行しようとしていますが、これは基本的な lua で動作します。私は borland コンパイラを使用しています (builder 3, just don't ask >.<)
現在、re モジュールを介して lpeg を使用しようとしています。lpeg ディレクトリを LUA_PATH 環境変数に追加しました。このディレクトリには re が含まれています。lua、LuaForWindows の lpeg.dll、および *.c ファイル。
スクリプトを開始しようとすると、 ファイル 'lpeg.dll' からモジュール 'lpeg' をロード中にエラー エラーが発生します: lpeg.dll:1: char(144) 付近の構文エラー
同じスクリプトが、LuaForWindows の IExecutor で完全に実行されます。
ルア環境を完全に間違ってセットアップしたと思います。dllはどこに置くのですか?コンパイラで自分でビルドする必要がありますか? (試みたが失敗した)
前もって感謝します。
lua - LPeg.match が nil を返すようにする方法
現在、LPeg パーサー モジュールに慣れてきました。このために、バージョン文字列 (例: 11.4
) をlistと照合します。
このようなリストは、範囲を含むこともできるタイトな構文の文字列です。これは EBNF に似ていますが、いずれにしても非常に単純な文法です (以下の LPeg コードは少し読みにくいので書き留めておきます)。
文字列の例は1-9,10.1-11,12
. これが私の巨大なコードです:
したがって、次のように呼び出しcheckversion("1-7,8.1,8.3,9")
、現在のバージョンがリストと一致しない場合は、取得する必要nil
があります。
問題は、すべての呼び出しがcheck
何も返さない場合 (つまり、バージョンが一致しない場合)、grammar:match(...)
実際にはキャプチャがないため、文字列の現在の位置が返されることです。しかし、これはまさに私が望んでいないcheckversion
ことです。戻りたいnil
かfalse
、一致するものがなく、それ以外の場合は true と評価されるものがあれば、実際にstring:match
はそうします。
一方、不一致の場合に returnfalse
またはnil
fromの場合、基本的に処理できないcheck
match like からの戻り値になります。nil, "1", nil, nil
何か案は?
parsing - Lua で LPeg を使用して複数行を解析する
次のような複数の行ブロックを持つテキストファイルがあります
これらの可変長ブロックは、テキスト間に存在します。: の後のすべての数値を読み取り、それらを個々の配列に保持したい。この場合、2 つの配列があります。
array1 = {0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 343 3938 9433 8756 6270 4472 3182 2503 1768 1140 836 496 326 273 349 269 144 121 94 82 64 66 59 56 47 50 50 56 47 50 46 64 35 42 53 42 40 41 34 35 41 39 39 47 30 30 39 12345 }
array2 = {0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 212 3079 8890 8941 6177 4359 3625 2420 1639 974 594 438 323 286 318 296 206 132 96 85 65 73 62 53 52 29 44 44 41 43 36 50 36 40 30 30 29 40 35 30 25 31 47 31 25 29 24 30 35 31 28 31 17 37 35 30 20 33 28 20 }
lpeg は、それを達成するための軽量な方法である可能性があることがわかりました。しかし、私は PEG と LPeg はまったくの初心者です。助けてください!