flex bison : creating multiple character variable
up vote
0
down vote
favorite
I want to create a programming language consisting multiple character variables (e.g. abc=10, num=120). I was able to create single character variable . The .y code is :
%{
#include <stdio.h>
//char sym[1000];
//int x=0;
int sym[26];
%}
%token NUMBER ADD SUB MUL DIV ABS EOL ID ASS
%%
calclist :
| calclist exp EOL { printf("= %dn", $2); }
| ID ASS exp EOL { sym[$1] = $3;
}
;
exp: factor { $$=$1; }
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor : term { $$=$1; }
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term : NUMBER { $$=$1; }
;
%%
int main(int argc, char **argv)
{
yyparse();
}
yyerror(char *s)
{
fprintf(stderr, "error: %sn", s);
}
and the .l code is :
%{
# include "P3.tab.h"
#include <stdio.h>
#include <stdlib.h>
extern int yylval;
//int m=0;
%}
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"=" { return ASS; }
[a-z]+ { yylval= *yytext - 'a' ;
return ID ; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
n { return EOL; }
[ t] { /* ignore whitespace */ }
. { printf("Mystery character %cn", *yytext); }
%%
int yywrap()
{
return 1;
}
So, with this code , I can only create a=10,x=90 kind of single character variable . How can I create multiple character variable And I also want to check if it is already declared or not ?
bison flex-lexer
add a comment |
up vote
0
down vote
favorite
I want to create a programming language consisting multiple character variables (e.g. abc=10, num=120). I was able to create single character variable . The .y code is :
%{
#include <stdio.h>
//char sym[1000];
//int x=0;
int sym[26];
%}
%token NUMBER ADD SUB MUL DIV ABS EOL ID ASS
%%
calclist :
| calclist exp EOL { printf("= %dn", $2); }
| ID ASS exp EOL { sym[$1] = $3;
}
;
exp: factor { $$=$1; }
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor : term { $$=$1; }
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term : NUMBER { $$=$1; }
;
%%
int main(int argc, char **argv)
{
yyparse();
}
yyerror(char *s)
{
fprintf(stderr, "error: %sn", s);
}
and the .l code is :
%{
# include "P3.tab.h"
#include <stdio.h>
#include <stdlib.h>
extern int yylval;
//int m=0;
%}
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"=" { return ASS; }
[a-z]+ { yylval= *yytext - 'a' ;
return ID ; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
n { return EOL; }
[ t] { /* ignore whitespace */ }
. { printf("Mystery character %cn", *yytext); }
%%
int yywrap()
{
return 1;
}
So, with this code , I can only create a=10,x=90 kind of single character variable . How can I create multiple character variable And I also want to check if it is already declared or not ?
bison flex-lexer
add a comment |
up vote
0
down vote
favorite
up vote
0
down vote
favorite
I want to create a programming language consisting multiple character variables (e.g. abc=10, num=120). I was able to create single character variable . The .y code is :
%{
#include <stdio.h>
//char sym[1000];
//int x=0;
int sym[26];
%}
%token NUMBER ADD SUB MUL DIV ABS EOL ID ASS
%%
calclist :
| calclist exp EOL { printf("= %dn", $2); }
| ID ASS exp EOL { sym[$1] = $3;
}
;
exp: factor { $$=$1; }
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor : term { $$=$1; }
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term : NUMBER { $$=$1; }
;
%%
int main(int argc, char **argv)
{
yyparse();
}
yyerror(char *s)
{
fprintf(stderr, "error: %sn", s);
}
and the .l code is :
%{
# include "P3.tab.h"
#include <stdio.h>
#include <stdlib.h>
extern int yylval;
//int m=0;
%}
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"=" { return ASS; }
[a-z]+ { yylval= *yytext - 'a' ;
return ID ; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
n { return EOL; }
[ t] { /* ignore whitespace */ }
. { printf("Mystery character %cn", *yytext); }
%%
int yywrap()
{
return 1;
}
So, with this code , I can only create a=10,x=90 kind of single character variable . How can I create multiple character variable And I also want to check if it is already declared or not ?
bison flex-lexer
I want to create a programming language consisting multiple character variables (e.g. abc=10, num=120). I was able to create single character variable . The .y code is :
%{
#include <stdio.h>
//char sym[1000];
//int x=0;
int sym[26];
%}
%token NUMBER ADD SUB MUL DIV ABS EOL ID ASS
%%
calclist :
| calclist exp EOL { printf("= %dn", $2); }
| ID ASS exp EOL { sym[$1] = $3;
}
;
exp: factor { $$=$1; }
| exp ADD factor { $$ = $1 + $3; }
| exp SUB factor { $$ = $1 - $3; }
;
factor : term { $$=$1; }
| factor MUL term { $$ = $1 * $3; }
| factor DIV term { $$ = $1 / $3; }
;
term : NUMBER { $$=$1; }
;
%%
int main(int argc, char **argv)
{
yyparse();
}
yyerror(char *s)
{
fprintf(stderr, "error: %sn", s);
}
and the .l code is :
%{
# include "P3.tab.h"
#include <stdio.h>
#include <stdlib.h>
extern int yylval;
//int m=0;
%}
%%
"+" { return ADD; }
"-" { return SUB; }
"*" { return MUL; }
"/" { return DIV; }
"=" { return ASS; }
[a-z]+ { yylval= *yytext - 'a' ;
return ID ; }
[0-9]+ { yylval = atoi(yytext); return NUMBER; }
n { return EOL; }
[ t] { /* ignore whitespace */ }
. { printf("Mystery character %cn", *yytext); }
%%
int yywrap()
{
return 1;
}
So, with this code , I can only create a=10,x=90 kind of single character variable . How can I create multiple character variable And I also want to check if it is already declared or not ?
bison flex-lexer
bison flex-lexer
edited Nov 22 at 17:04
asked Nov 22 at 16:22
Jane
196
196
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
1
down vote
accepted
This has very little to do with bison or flex. In fact, your flex patterns already recognise multi-character identifiers (as long as they are purely alphabetic), but the action ignores characters after the first.
What you need is some kind of associative container like a hash table, which you could use as a symbol table instead of the vector sym
.
The Bison manual includes a number of small example calculator programs. See, for example, mfcalc, which includesa symbol table implemented as a simple linear association list.
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
1
down vote
accepted
This has very little to do with bison or flex. In fact, your flex patterns already recognise multi-character identifiers (as long as they are purely alphabetic), but the action ignores characters after the first.
What you need is some kind of associative container like a hash table, which you could use as a symbol table instead of the vector sym
.
The Bison manual includes a number of small example calculator programs. See, for example, mfcalc, which includesa symbol table implemented as a simple linear association list.
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
add a comment |
up vote
1
down vote
accepted
This has very little to do with bison or flex. In fact, your flex patterns already recognise multi-character identifiers (as long as they are purely alphabetic), but the action ignores characters after the first.
What you need is some kind of associative container like a hash table, which you could use as a symbol table instead of the vector sym
.
The Bison manual includes a number of small example calculator programs. See, for example, mfcalc, which includesa symbol table implemented as a simple linear association list.
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
add a comment |
up vote
1
down vote
accepted
up vote
1
down vote
accepted
This has very little to do with bison or flex. In fact, your flex patterns already recognise multi-character identifiers (as long as they are purely alphabetic), but the action ignores characters after the first.
What you need is some kind of associative container like a hash table, which you could use as a symbol table instead of the vector sym
.
The Bison manual includes a number of small example calculator programs. See, for example, mfcalc, which includesa symbol table implemented as a simple linear association list.
This has very little to do with bison or flex. In fact, your flex patterns already recognise multi-character identifiers (as long as they are purely alphabetic), but the action ignores characters after the first.
What you need is some kind of associative container like a hash table, which you could use as a symbol table instead of the vector sym
.
The Bison manual includes a number of small example calculator programs. See, for example, mfcalc, which includesa symbol table implemented as a simple linear association list.
edited Nov 23 at 3:36
answered Nov 23 at 1:06
rici
150k19131194
150k19131194
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
add a comment |
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
how will I check if my variable is declared or not ? Do I need to traverse through the linked list? It was not that much of helpful:(
– Jane
Nov 23 at 18:10
1
1
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
@jane: the sample code does essentially what you want to do. It works and it's coding style is pretty clear (IMHO). And it has helped many people over the years. Anyway, the answer is yes and the sample code does that (in the lexer iirc).
– rici
Nov 23 at 19:52
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
Thank you . It solved my problem.
– Jane
Nov 24 at 19:02
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.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- 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%2f53434948%2fflex-bison-creating-multiple-character-variable%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