Bison C++ - 减法

Bison C++ - subtracting

我正在使用 lex 和 bison 进行简单的计算。它应该做的是解析每个提到的减法 - 1 - -11- 11--1,以及最重要的:1-1。前三种情况有效,但在最后一种情况下,它看起来好像将句子分成数字 1-1,它们之间没有符号,这就是出现错误的原因。 我阅读了有关优先级以及如何使用它的内容,但没有任何效果。

下面是我的精简代码,准备复制:

.l 文件

%{
#include "y.tab.h"

void yyerror (const char* s);
int yylex();
%}

%%
[-+*/%\^()\n] { return yytext[0]; }
[0] {yylval = 0; return number;}
[-]?[1-9][0-9]* {yylval = atoi(yytext); return number;}
%%

int yywrap(void) {return 1;}
void yyerror (const char* s) {;}

.y 文件

%{
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
#include <cmath>

void yyerror (const char*);
int yylex();
%}

%token number


%right NEG
%left '-'

%%
program: 
       | line program
       ;

line: '\n'
    | expression '\n' { std::cout << "Score: " <<  << "\n";   }
    ;

expression: number { ; }
          | expression '-' expression { $$ = -; }
          | '-' expression %prec NEG { $$ = -; }
          ;
%% 

int main (void) {
    return yyparse();
}

输入输出:

1- - 1
  Score: 2
1--1
Score: 2
1-1
<here is an error>

您的优先级注释对您没有任何改变,因为规则 '-' expression 实际上并未在 1-1 中使用。该输入的问题是解析器只能看到两个整数标记,您在解析器中所做的任何事情都无法改变它。

相反,您需要让词法分析器为该输入生成三个标记,而不是两个。您只需从 number 标记的规则中删除 [-]? 即可。通过该更改,1-1 将被标记为 number, '-', number,您的解析器将正常工作。

请注意,这仍然允许负数,因为您的 '-' expression 规则处理了负数 - 它只是不会将负数视为单个标记,这很好。