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

Bison 表达式解释器演示中的表达式AST解析器,bison,flex-lexer,parser-generator,jison,Bison,Flex Lexer,Parser Generator,Jison,我试图将其修改为表达式解析器,而不是表达式解释器。我想输出一个描述表达式的JSON对象,而不是立即对其求值 我试图修改演示,以返回以运算符和操作数为元素的javascript数组 当我解析1+2时,我希望得到一个字符串化为['+',1,2]的JSON数组。相反,我得到了1 这似乎与数字动作直接相关——无论我说什么,返回就是我得到的一切 但是,如果我试图解析'12+3',它确实会给出一个语法错误 (我不关心是否在有用的AST模型中表示表达式,我只是想学习Jison) /*说明:解析数学表达式*

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

  • 我试图修改演示,以返回以运算符和操作数为元素的javascript数组
  • 当我解析
    1+2
    时,我希望得到一个字符串化为
    ['+',1,2]
    的JSON数组。相反,我得到了
    1
  • 这似乎与数字动作直接相关——无论我说什么,返回就是我得到的一切
  • 但是,如果我试图解析'12+3',它确实会给出一个语法错误
(我不关心是否在有用的AST模型中表示表达式,我只是想学习Jison)

/*说明:解析数学表达式*/
/*词汇语法*/
%莱克斯
%%
\s+/*跳过空格*/
[0-9]+(“[0-9]+)?\b返回“编号”
“*”返回“*”
“/”返回“/”
“-“返回”-”
“+”返回“+”
“^”返回“^”
“(”返回“(”
“返回”)
“PI”返回“PI”
“E”返回“E”
返回“EOF”
.                     返回“无效”
/莱克斯
/*运算符关联和优先级*/
%左'+''-'
%左'*''/'
%左“^”
%左耳门
%起始表达式
%%/*语言语法*/
表达
:e EOF
{返回$e;}
;
E
:e'+'e
{返回['+',$e1,$e2];}
|e'-'e
{return['-',$e1,$e2];}
|e'*'e
{返回['*',$e1,$e2];}
|e'/'e
{return['/',$e1,$e2];}
|"^"e
{返回['^',$e1,$e2];}
|“-”e%前白蛋白
{return['-',$e];}
|“(‘e’)”
{return['G',$e];}
|数
{返回编号($Number);}
|E
{return Math.E;}
|圆周率
{return Math.PI;}
;

在此行中,不是以$$为单位返回操作数之和

: e '+' e
    {$$ = $1+$3;}
返回所需对象是否有效

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

这就成功了!我不知道为什么我认为它必须是
return
而不是
$=
谢谢。
: e '+' e
    {$$ = ["+", $1, $3];}