Bison C++ - subtracting
I'm making a simple calc using lex and bison. What should it do is to parse every mentioned subtracting - 1 - -1
, 1- 1
, 1--1
, and what's the most important: 1-1
. The first three cases are working, but in the last one it looks as if it separated the sentence into numbers 1
and -1
without a sign between them and that's why there is an error.
I read about precedence and how to use it, nothing has worked.
Below is my shortened code, ready to copy:
.l file
%{
#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 file
%{
#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: " << $1 << "n"; }
;
expression: number { ; }
| expression '-' expression { $$ = $1-$3; }
| '-' expression %prec NEG { $$ = -$2; }
;
%%
int main (void) {
return yyparse();
}
input and output:
1- - 1
Score: 2
1--1
Score: 2
1-1
<here is an error>
c++ bison
add a comment |
I'm making a simple calc using lex and bison. What should it do is to parse every mentioned subtracting - 1 - -1
, 1- 1
, 1--1
, and what's the most important: 1-1
. The first three cases are working, but in the last one it looks as if it separated the sentence into numbers 1
and -1
without a sign between them and that's why there is an error.
I read about precedence and how to use it, nothing has worked.
Below is my shortened code, ready to copy:
.l file
%{
#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 file
%{
#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: " << $1 << "n"; }
;
expression: number { ; }
| expression '-' expression { $$ = $1-$3; }
| '-' expression %prec NEG { $$ = -$2; }
;
%%
int main (void) {
return yyparse();
}
input and output:
1- - 1
Score: 2
1--1
Score: 2
1-1
<here is an error>
c++ bison
1
The problem is that1-1
tokenizes to two consecutive numbers, values1
and-1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.
– Jonathan Leffler
Nov 14 '18 at 19:16
add a comment |
I'm making a simple calc using lex and bison. What should it do is to parse every mentioned subtracting - 1 - -1
, 1- 1
, 1--1
, and what's the most important: 1-1
. The first three cases are working, but in the last one it looks as if it separated the sentence into numbers 1
and -1
without a sign between them and that's why there is an error.
I read about precedence and how to use it, nothing has worked.
Below is my shortened code, ready to copy:
.l file
%{
#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 file
%{
#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: " << $1 << "n"; }
;
expression: number { ; }
| expression '-' expression { $$ = $1-$3; }
| '-' expression %prec NEG { $$ = -$2; }
;
%%
int main (void) {
return yyparse();
}
input and output:
1- - 1
Score: 2
1--1
Score: 2
1-1
<here is an error>
c++ bison
I'm making a simple calc using lex and bison. What should it do is to parse every mentioned subtracting - 1 - -1
, 1- 1
, 1--1
, and what's the most important: 1-1
. The first three cases are working, but in the last one it looks as if it separated the sentence into numbers 1
and -1
without a sign between them and that's why there is an error.
I read about precedence and how to use it, nothing has worked.
Below is my shortened code, ready to copy:
.l file
%{
#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 file
%{
#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: " << $1 << "n"; }
;
expression: number { ; }
| expression '-' expression { $$ = $1-$3; }
| '-' expression %prec NEG { $$ = -$2; }
;
%%
int main (void) {
return yyparse();
}
input and output:
1- - 1
Score: 2
1--1
Score: 2
1-1
<here is an error>
c++ bison
c++ bison
edited Nov 14 '18 at 19:13
Jonathan Leffler
568k916801031
568k916801031
asked Nov 14 '18 at 19:02
J.G.J.G.
434
434
1
The problem is that1-1
tokenizes to two consecutive numbers, values1
and-1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.
– Jonathan Leffler
Nov 14 '18 at 19:16
add a comment |
1
The problem is that1-1
tokenizes to two consecutive numbers, values1
and-1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.
– Jonathan Leffler
Nov 14 '18 at 19:16
1
1
The problem is that
1-1
tokenizes to two consecutive numbers, values 1
and -1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.– Jonathan Leffler
Nov 14 '18 at 19:16
The problem is that
1-1
tokenizes to two consecutive numbers, values 1
and -1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.– Jonathan Leffler
Nov 14 '18 at 19:16
add a comment |
1 Answer
1
active
oldest
votes
Your precedence annotation didn't change anything for you because the rule '-' expression
isn't actually used in 1-1
. The problem with that input is that the parser only sees two integer tokens and nothing you can do in the parser can change that.
Instead you'll need to make the lexer produce three tokens for that input instead of two. You can do by simply removing the [-]?
from your rule for number
tokens. With that change 1-1
will be tokenized as number, '-', number
and your parser will work.
Note that this will still allow negative numbers because your '-' expression
rule handles that - it just won't treat negative numbers as a single token, which is fine.
It will also treat- 1
with a space as-1
— which shouldn't matter much.
– Jonathan Leffler
Nov 14 '18 at 19:17
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53307097%2fbison-c-subtracting%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
Your precedence annotation didn't change anything for you because the rule '-' expression
isn't actually used in 1-1
. The problem with that input is that the parser only sees two integer tokens and nothing you can do in the parser can change that.
Instead you'll need to make the lexer produce three tokens for that input instead of two. You can do by simply removing the [-]?
from your rule for number
tokens. With that change 1-1
will be tokenized as number, '-', number
and your parser will work.
Note that this will still allow negative numbers because your '-' expression
rule handles that - it just won't treat negative numbers as a single token, which is fine.
It will also treat- 1
with a space as-1
— which shouldn't matter much.
– Jonathan Leffler
Nov 14 '18 at 19:17
add a comment |
Your precedence annotation didn't change anything for you because the rule '-' expression
isn't actually used in 1-1
. The problem with that input is that the parser only sees two integer tokens and nothing you can do in the parser can change that.
Instead you'll need to make the lexer produce three tokens for that input instead of two. You can do by simply removing the [-]?
from your rule for number
tokens. With that change 1-1
will be tokenized as number, '-', number
and your parser will work.
Note that this will still allow negative numbers because your '-' expression
rule handles that - it just won't treat negative numbers as a single token, which is fine.
It will also treat- 1
with a space as-1
— which shouldn't matter much.
– Jonathan Leffler
Nov 14 '18 at 19:17
add a comment |
Your precedence annotation didn't change anything for you because the rule '-' expression
isn't actually used in 1-1
. The problem with that input is that the parser only sees two integer tokens and nothing you can do in the parser can change that.
Instead you'll need to make the lexer produce three tokens for that input instead of two. You can do by simply removing the [-]?
from your rule for number
tokens. With that change 1-1
will be tokenized as number, '-', number
and your parser will work.
Note that this will still allow negative numbers because your '-' expression
rule handles that - it just won't treat negative numbers as a single token, which is fine.
Your precedence annotation didn't change anything for you because the rule '-' expression
isn't actually used in 1-1
. The problem with that input is that the parser only sees two integer tokens and nothing you can do in the parser can change that.
Instead you'll need to make the lexer produce three tokens for that input instead of two. You can do by simply removing the [-]?
from your rule for number
tokens. With that change 1-1
will be tokenized as number, '-', number
and your parser will work.
Note that this will still allow negative numbers because your '-' expression
rule handles that - it just won't treat negative numbers as a single token, which is fine.
answered Nov 14 '18 at 19:16
sepp2ksepp2k
296k38596613
296k38596613
It will also treat- 1
with a space as-1
— which shouldn't matter much.
– Jonathan Leffler
Nov 14 '18 at 19:17
add a comment |
It will also treat- 1
with a space as-1
— which shouldn't matter much.
– Jonathan Leffler
Nov 14 '18 at 19:17
It will also treat
- 1
with a space as -1
— which shouldn't matter much.– Jonathan Leffler
Nov 14 '18 at 19:17
It will also treat
- 1
with a space as -1
— which shouldn't matter much.– Jonathan Leffler
Nov 14 '18 at 19:17
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53307097%2fbison-c-subtracting%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
1
The problem is that
1-1
tokenizes to two consecutive numbers, values1
and-1
, and your expression rules don't allow two consecutive numbers. In C, there are no negative integer constants. Maybe you should decide that you don't recognize them either.– Jonathan Leffler
Nov 14 '18 at 19:16