Compiler construction 用野牛做计算器

Compiler construction 用野牛做计算器,compiler-construction,bison,yacc,Compiler Construction,Bison,Yacc,这是我的野牛密码。问题是,当我输入例如4+3时,程序检测到语法错误。但当我输入4+3,即数字之间用空格分隔时,它会计算并完美地显示结果。请提示它可能出了什么问题 输入: |输入线 ; 行:新行 |expr新行{cout乍一看,似乎4+3应该标记为{number}{signednumber},而不是{number}{PLUS}{number} 另外,我认为您不应该为有符号的数字使用特殊标记。解析器应该找出这是一元还是二元加减。这是您的全部吗?不,我只是在这里复制了语法规则部分。不确定是否应该将整

这是我的野牛密码。问题是,当我输入例如
4+3
时,程序检测到语法错误。但当我输入
4+3
,即数字之间用空格分隔时,它会计算并完美地显示结果。请提示它可能出了什么问题


输入:
|输入线
;
行:新行

|expr新行{cout乍一看,似乎4+3应该标记为
{number}{signednumber}
,而不是
{number}{PLUS}{number}


另外,我认为您不应该为有符号的数字使用特殊标记。解析器应该找出这是一元还是二元加减。

这是您的全部吗?不,我只是在这里复制了语法规则部分。不确定是否应该将整个lex和bison代码放在这里。@sergio我已经编辑了我的问题并附加了代码。乍一看,似乎
4+3
应该被标记为
{number}{signednumber}
,而不是
{number}{PLUS}{number}
我想知道,你需要一个特殊的标记来表示有符号的数字吗?我会把这个实体放到解析器中。
input:
 | input line
 ;

line: NEWLINE
 | expr NEWLINE     {cout << $1 << endl; $$ = $1;}
 ;
expr: term
 | expr PLUS term    {$$ = $1 + $3;}
 | expr MINUS term  {$$ = $1 - $3;}
 | expr LSHIFT term {checkedShifting($1, $3, &$$, true);}
 | expr RSHIFT term {checkedShifting($1, $3, &$$, false);}
 ;
term: factor
 | term MUL factor  {$$ = $1 * $3;}
 | term DIV factor  {checkedDivision($1, $3, &$$);}
 | term MOD factor  {checkedMod($1, $3, &$$);}
 ;
factor: NUMBER
   | LBRACE expr RBRACE     {$$ = $2;}
   | factor EXPONENT factor {$$ = pow($1, $3);}
   ;