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 ?










share|improve this question




























    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 ?










    share|improve this question


























      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 ?










      share|improve this question















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 22 at 17:04

























      asked Nov 22 at 16:22









      Jane

      196




      196
























          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.






          share|improve this answer























          • 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











          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',
          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
          });


          }
          });














          draft saved

          draft discarded


















          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

























          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.






          share|improve this answer























          • 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















          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.






          share|improve this answer























          • 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













          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.






          share|improve this answer














          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.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          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


















          • 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


















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          What visual should I use to simply compare current year value vs last year in Power BI desktop

          How to ignore python UserWarning in pytest?

          Alexandru Averescu