0

この「電卓」Jisonの例を、式インタープリターではなく式パーサーに変更しようとしています。式をすぐに評価するのではなく、式を説明するJSONオブジェクトを出力したいと思います。

  • 演算子とオペランドを要素として持つjavascript配列を返すようにデモを変更しようとしました。
  • 解析すると1 + 2、に文字列化されたJSON配列を取得することを期待しています['+', 1, 2]。代わりに私は得る1
  • これはNUMBERアクションに直接関係しているようです-私が返すように言うことは何でも私が返すすべてです。
  • ただし、 `1 2 + 3'を解析しようとすると、構文エラーが発生します。

(有用なASTモデルで式を表現しているかどうかは気にせず、Jisonを学習しようとしているだけです)

/* description: Parses mathematical expressions. */

/* lexical grammar */
%lex
%%

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

/lex

/* operator associations and precedence */

%left '+' '-'
%left '*' '/'
%left '^'
%left UMINUS

%start expressions

%% /* language grammar */

expressions
    : e EOF
        { return $e; }
    ;

e
    : e '+' e
        { return ['+', $e1, $e2]; }
    | e '-' e
        { return ['-', $e1, $e2]; }
    | e '*' e
        { return ['*', $e1, $e2]; }
    | e '/' e
        { return ['/', $e1, $e2]; }
    | e '^' e
        { return ['^', $e1, $e2]; }
    | '-' e %prec UMINUS
        { return ['-', $e]; }
    | '(' e ')'
        { return ['G', $e ]; }
    | NUMBER
        { return Number($NUMBER); }
    | E
        { return Math.E; }
    | PI
        { return Math.PI; }
    ;
4

1 に答える 1

2

この行では、$$のオペランドの合計を返す代わりに、

: e '+' e
    {$$ = $1+$3;}

目的のオブジェクトを返すことはできますか?

: e '+' e
    {$$ = ["+", $1, $3];}
于 2012-09-24T15:54:13.740 に答える