Expression解释器演示中的Expression AST Parser



我正试图将这个"Calculator"Jison示例修改为表达式解析器,而不是表达式解释器。我想输出一个JSON对象,描述表达式,而不是立即对其求值。

  • 我试图修改演示以返回以运算符和操作数为元素的javascript数组
  • 当我解析1 + 2时,我希望得到一个字符串化为['+', 1, 2]的JSON数组。相反,我得到了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; }
;

在这一行中,不是返回$$中操作数的总和

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

返回所需对象是否有效?

: e '+' e
{$$ = ["+", $1, $3];}

相关内容

  • 没有找到相关文章

最新更新