0

yacc 再帰を理解するのに苦労しています。そこで、与えられた番号のリストを単純にエコーしたい最小限の言語を作成しました。ジソンを使用しています。JISON は次のとおりです。

/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  return 'NUMBER'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e EOF 
        {}
    ;

 e
    : NUMBER {}
    | NUMBER e
 ;

空白で区切られた数字のリストをエコーするには、どのようなアクションが必要ですか?

4

1 に答える 1

0

@JoachimPileborgが言ったとき、彼は正しかった:

まず、パーサーが読み取れるように、スキャンする数値を設定する必要があります。Lex/Yacc では、これは通常、 を使用して行われyylvalます。次に、コードをパーサールールに追加して、数値を出力します。

JISON は yacc/bison の文法プロセッサを使用しますが、アクションは Javascript で指定する必要があります。アクションの例が欲しいので、Javascriptでプログラミングできると思いますか?

/* description: Parses end executes mathematical expressions. */

/* lexical grammar */
%lex
%%

\s+                   /* skip whitespace */
[0-9]+("."[0-9]+)?\b  yylval = ParseInt(yytext); return 'NUMBER'
<<EOF>>               return 'EOF'
.                     return 'INVALID'

/lex

%start expressions

%% /* language grammar */

expressions
    : e EOF 
        {}
    ;

 e
    : NUMBER { print($1); }
    | NUMBER e { print($1); }
 ;

私が行ったのは、数値の語彙素を整数に変換して語彙部分に格納し、トークンが使用さyylvalれるたびにその値をパーサー部分に出力することだけです。NUMBER

うまくいけば、それはそれを明確にするでしょう。(PS - JISON を持っていないため、実行もテストもしていません)

于 2015-02-14T19:33:22.700 に答える