この「電卓」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; }
;