Bison C++ - 减法
Bison C++ - subtracting
我正在使用 lex 和 bison 进行简单的计算。它应该做的是解析每个提到的减法 - 1 - -1
、1- 1
、1--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
规则处理了负数 - 它只是不会将负数视为单个标记,这很好。
我正在使用 lex 和 bison 进行简单的计算。它应该做的是解析每个提到的减法 - 1 - -1
、1- 1
、1--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
规则处理了负数 - 它只是不会将负数视为单个标记,这很好。