2013-02-10 6 views
6

Jisonを使用しているブロックのpython風インデントを解析する文法を定義する方法の簡単な例がありますか?ブロック構造にインデントを使用するJison文法の例を探す

+1

こんにちは! [この質問とその回答](http://stackoverflow.com/questions/1547944/how-do-i-parse-indents-and-dedents-with-pyparsing)はあなたのお手伝いをします。おもう。 –

+1

ありがとう...おもしろい... – interstar

+0

実際には、ジソンがpyparsingと同じ機能を持っていない限り、おそらく実際には質問には答えません。 – interstar

答えて

7

を使用するJisonを使用して言語を作成しました。 Biancaというホワイトボックスアルゴリズムの自動テスト言語です。

ビアンカには2つの依存関係があります.1つはJisonで、もう1つはLexerです。 Jisonはcustom scannersをサポートしており、Lexerはそのようなスキャナの1つです。

Cスタイルのプログラミング言語では、コードブロックは中括弧で区切られています。しかし、Pythonスタイルの字下げでは、INDENTDEDENTのトークンがあります。

レクサーでINDENTDEDENTのトークンを生成するルールを作成するのは脳死です。実際、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トークンが生成されます。

+0

私はジーソンがスタートで^を使用できないと思った。 jisonfileにルールを追加してこれを使って字句に関連するものを得るように見えます。 –

+0

これは標準のlexファイルでどのようにして行いますか? colとは何ですか?私はルール(これ)をログに記録しようとしていると、それらの値が何から来たかを把握しようとしています。 –

+0

これらの値はすべて[lexer.js](https://github.com/aaditmshah/bianca/blob/master/lib/lexer.js)で定義されています。 –

関連する問題