Jisonを使用してブロックのPythonのようなインデントを解析する文法を定義する方法の簡単な例を誰かが持っていますか?
1 に答える
Python スタイルのインデントを使用する Jison を使用して言語を作成しました。これは、 Biancaと呼ばれる自動化されたホワイト ボックス アルゴリズム テスト言語です。
Bianca には 2 つの依存関係しかありません。1 つは Jison で、もう 1 つはLexerです。Jison はカスタム スキャナーをサポートしており、Lexer はそのようなスキャナーの 1 つです。
C スタイルのプログラミング言語では、コードのブロックは中かっこで区切られます。ただし、Python スタイルのインデントではトークンがINDENT
あります。DEDENT
Lexer でトークンINDENT
を生成するルールを作成するのは、非常に簡単です。DEDENT
実際、レクサーのドキュメントには、その方法が正確に示されています。
このコード スニペットは、Bianca のソース コード ( 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 ドキュメントにあります。
ファイルの最初の行が読み取られる前に、単一のゼロがスタックにプッシュされます。これは二度と外れることはありません。スタックにプッシュされる数値は、常に下から上に厳密に増加します。各論理行の先頭で、行のインデント レベルがスタックの一番上と比較されます。等しい場合は何も起こりません。大きい場合はスタックにプッシュされ、
INDENT
トークンが 1 つ生成されます。小さい場合は、スタックにある数値の 1 つである必要があります。より大きなスタック上のすべての数値がポップされ、ポップされた数値ごとにDEDENT
トークンが生成されます。ファイルの最後でDEDENT
、スタックに残っているゼロより大きい数値ごとにトークンが生成されます。