Jisonを使用しているブロックのpython風インデントを解析する文法を定義する方法の簡単な例がありますか?ブロック構造にインデントを使用するJison文法の例を探す
答えて
を使用するJisonを使用して言語を作成しました。 Biancaというホワイトボックスアルゴリズムの自動テスト言語です。
ビアンカには2つの依存関係があります.1つはJisonで、もう1つはLexerです。 Jisonはcustom scannersをサポートしており、Lexerはそのようなスキャナの1つです。
Cスタイルのプログラミング言語では、コードブロックは中括弧で区切られています。しかし、Pythonスタイルの字下げでは、INDENT
とDEDENT
のトークンがあります。
レクサーでINDENT
とDEDENT
のトークンを生成するルールを作成するのは脳死です。実際、Lexerのドキュメントには、どのようにそれを行うかが正確に示されています。
このコードスニペットは、ビアンカのソースコード(lexer.js)から直接取得されています。このコードがどのように動作するかの
var indent = [0];
lexer.addRule(/^ */gm, function (lexeme) {
var indentation = lexeme.length;
col += indentation;
if (indentation > indent[0]) {
indent.unshift(indentation);
return "INDENT";
}
var tokens = [];
while (indentation < indent[0]) {
tokens.push("DEDENT");
indent.shift();
}
if (tokens.length) return tokens;
});
簡単な説明は、Pythonドキュメントで見つけることができます:
ファイルの最初の行が読み取られる前に、1つのゼロがスタックにプッシュされます。これは決して再び現れないでしょう。スタックにプッシュされる数値は、常に下から上へと厳密に増加します。各論理行の先頭で、行のインデントレベルがスタックの先頭と比較されます。等しい場合、何も起こりません。大きい場合はスタックにプッシュされ、
INDENT
トークンが1つ生成されます。小さければ、はでなければなりません。大きい方のスタック上のすべての数値がポップオフされ、ポップされた各数値に対してDEDENT
トークンが生成されます。ファイルの最後には、0より大きいスタック上の残りの番号ごとにDEDENT
トークンが生成されます。
私はジーソンがスタートで^を使用できないと思った。 jisonfileにルールを追加してこれを使って字句に関連するものを得るように見えます。 –
これは標準のlexファイルでどのようにして行いますか? colとは何ですか?私はルール(これ)をログに記録しようとしていると、それらの値が何から来たかを把握しようとしています。 –
これらの値はすべて[lexer.js](https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js)で定義されています。 –
- 1. Jison文法
- 2. VS2017のインデント構造線をオンにする方法は?
- 3. F#のインデント構文で使用して
- 4. 構文エラー:インデントされたブロックのPythonが必要です
- 5. インデント用に4つのスペース - 構文エラー
- 6. 最高のifステートメント構造を探す
- 7. node.jsを使用してXML構文/構造を検証する
- 8. Twigでブロックを使用するときインデントを保持する方法
- 9. ワイルドカードでディレクトリ構造を探す
- 10. Magento - ホームページ用の構造ブロックを作成する
- 11. F#印刷用のインデント構文
- 12. Doxygenを使用する場合の構造化文書
- 13. if文のエラー:私のコードを実行すると、私は構文エラーを取得するの下に無効な構文とは、インデントされたブロック
- 14. インデントされた階層テーブル構造
- 15. IF文を使用して構造体を選択する
- 16. 構文例外をキャッチする方法
- 17. /?p = x構造のWordPress URLをリダイレクト/ブロックします。例えば。 site.com/?p=2
- 18. CakePHP:MVCのような構造体でSQLクエリ文を使用する方法
- 19. インデントされたブロックの最後をスキップする方法をpyparsing?
- 20. 構造体からncurses拡張文字を使用する
- 21. Expressionengineと構造体でGETクエリ文字列を使用する
- 22. Elasticsearch updateByQuery構文の例を探して(ノードドライバ)
- 23. 構造体を別の構造体メンバにキャストする方法
- 24. 他の構造に汎用構造をキャストする
- 25. オープンソースグラフ(データ構造のように)データベースエンジンを探しています
- 26. 変数を使用する構造
- 27. 構造体バイオメトリックを使用するレイテンシ
- 28. 構造体を使用する行列
- 29. 構造をmatlabで使用する
- 30. 複数のクラスを使用すると、インデントされたブロックが必要です
こんにちは! [この質問とその回答](http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing)はあなたのお手伝いをします。おもう。 –
ありがとう...おもしろい... – interstar
実際には、ジソンがpyparsingと同じ機能を持っていない限り、おそらく実際には質問には答えません。 – interstar