0

Jison (Bison 構文を使用する Javascript パーサー ジェネレーター) の使用方法を学ぼうとしています。

次のようなコードがあります。

a: "{{index()}}"
b: "{{blah(2, 'aba')}}"

string が渡された場合、およびindex()string が渡された場合に返されるパーサーを作成しようとしています。(基本的に、メソッド呼び出しを含む文字列を解析する必要があります)。ablah(2, 'aba')b

私は Jison によって提供された例から適応しようとしてきましたが、解析がどのように機能するかを理解していないことが妨げになっています!

これが私の文法ファイルです:

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[a-zA-Z0-9]+          return 'STR'
"{{"                  return '{{'
"}}"                  return '}}'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

/* operator associations and precedence */
%token '{{' '}}'

%start expressions

%% /* language grammar */

expressions
    : e EOF
        { typeof console !== 'undefined' ? console.log($1) : print($1);
          return $1; }
    ;

e
    : '{{' e '}}'
        {$$ = yytext;}
    | STR
        {$$ = yytext;}
    ;

明らかに、まだ完全ではありません。括弧を認識しません。パーサーにこの文字列を渡す簡単な例から始めます{{index}}。現在のパーサーにこれを与えると、 が返されます}}。私の文法の(間違いなく間違った)理解に基づいて、私はそれが返されることを期待していindexます.

私は何を間違っていますか?

4

1 に答える 1

6

式で n 番目のトークンを取得するには、 $n(where is a number) を使用する必要があります。n

e
    : '{{' e '}}'
        {$$ = $2;}
    | STR
    ;

元のコードから必要な唯一の変更は、アクション$$ = $2;forを使用することです'{{' e '}}'STRデフォルトのアクションはであり、これ$$ = $1が必要なためです。

于 2014-06-10T10:34:40.063 に答える