表达式解析器演示中的表达式AST解析器

时间:2012-09-24 14:22:05

标签: bison flex-lexer parser-generator jison

我试图将此"Calculator" Jison example修改为表达式解析器而不是表达式解释器。我想输出描述表达式的JSON对象,而不是立即对其进行评估。

  • 我尝试修改demo以返回运算符和操作数作为元素的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; }
    ;

1 个答案:

答案 0 :(得分:2)

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

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

是否可以返回所需的对象?

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