Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Values in $1, $2 .. variables always NULL

I am trying to create a parser with Bison (GNU bison 2.4.1) and flex (2.5.35) on my Ubuntu OS. I have something like this:

sql.h:

typedef struct word
{
  char *val;
  int  length;
} WORD;

struct yword
{
  struct word  v;
  int          o;
...
};

sql1.y

%{
..
#include "sql.h"
..
%}

%union yystype
{
  struct tree *t;
  struct yword b;
...
}

%token <b> NAME

%%

...

table:
        NAME           { add_table(root, $1.v); }
    ;

...

Trouble is that whatever string I give to it, when it comes to resolve this, v always has values (NULL, 0) even if the input string should have some table name. (I chose to skip unnecessary other details/snippets, but can provide more if it helps resolve this.)

I wrote the grammar which is complete and correct, but I can't get it to build the parse tree due to this problem.

Any inputs would be quite appreciated.

like image 926
Jay Avatar asked Sep 11 '11 19:09

Jay


1 Answers

Your trouble seems related to some missing or buggous code in the lexical analyzer.

Check your lexical analyzer first.

If it does not return the token proprely the parser part can not handle correctly the values. Write a basic test that print the token value. Do not mind the "c" style, above all is the principle :

main() {
   int token;
   while( token = yylex() ) {
      switch( token) {
         case NAME:
            printf("name '%s'\n", yylval.b.v.val );
            break;
         ...
      }
   }
}

If you run some input and that does not work.

if the lexical analyzer does not set yylval when it returns NAME, it is normal that val is empty.

If in your flex you have a pattern such as :

[a-z]+  { return NAME; }

It is incorrect you have to set the value like this

[a-z]+  { 
   yylval.val = strdup(yytext); 
   yylval.length = yylen;
   return NAME; }
like image 117
VGE Avatar answered Sep 23 '22 15:09

VGE