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. F#のインデント構文で使用して
- 2. node.jsを使用してXML構文/構造を検証する
- 3. ワイルドカードでディレクトリ構造を探す
- 4. Magento - ホームページ用の構造ブロックを作成する
- 5. Doxygenを使用する場合の構造化文書
- 6. IF文を使用して構造体を選択する
- 7. if文のエラー:私のコードを実行すると、私は構文エラーを取得するの下に無効な構文とは、インデントされたブロック
- 8. インデントされた階層テーブル構造
- 9. 構文例外をキャッチする方法
- 10. CakePHP:MVCのような構造体でSQLクエリ文を使用する方法
- 11. Expressionengineと構造体でGETクエリ文字列を使用する
- 12. /?p = x構造のWordPress URLをリダイレクト/ブロックします。例えば。 site.com/?p=2
- 13. 変数を使用する構造
- 14. オープンソースグラフ(データ構造のように)データベースエンジンを探しています
- 15. ハスケル:このデータ構造を使用する方法
- 16. row_countを使用するプロシージャの例を探す
- 17. Magentoブロック構造体 - _constructまたは__constructを使用しますか?
- 18. 構造的置換を使用して例外を削除する
- 19. なぜ構造体、プロパティ、列挙型の構文を使用しますか?
- 20. HTMLマークアップでERBコントロール構造をインデントするときのベストプラクティスは何ですか?
- 21. 構造体を別の構造体に渡す方法
- 22. 構造体ポインタを使用して構造体内部の配列にアクセスする方法
- 23. f#からC#構造体を使用する方法#
- 24. .cppファイルでCudaデータ構造を使用する方法
- 25. cfparamをCF8の構造体に使用するには?
- 26. 構造体にchar文字列を定義して使用する
- 27. gitリポジトリ/ブランチ構造の提案を探しています
- 28. タプルのようなCSLAデータ構造を探す
- 29. ラックアプリの構造とconfig.ru仕様をお探しですか?
- 30. Robocopyを使用してテンプレートフォルダ構造を他のフォルダにコピーする方法は?
こんにちは! [この質問とその回答](http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing)はあなたのお手伝いをします。おもう。 –
ありがとう...おもしろい... – interstar
実際には、ジソンがpyparsingと同じ機能を持っていない限り、おそらく実際には質問には答えません。 – interstar