Значения в $ 1, $ 2 .. переменные всегда NULL - PullRequest
4 голосов
/ 11 сентября 2011

Я пытаюсь создать парсер с Bison (GNU bison 2.4.1) и flex (2.5.35) на моей ОС Ubuntu.У меня есть что-то вроде этого:

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

...

Проблема в том, что какую бы строку я ни дал ей, когда она приходитЧтобы решить эту проблему, v всегда имеет значения (NULL, 0), даже если во входной строке должно быть какое-то имя таблицы.(Я решил пропустить ненужные другие детали / фрагменты, но могу предоставить больше, если это поможет решить эту проблему.)

Я написал грамматику, которая является полной и правильной, но я не могу заставить ее построить дерево разбораиз-за этой проблемы.

Любые входные данные будут весьма признательны.

1 Ответ

5 голосов
/ 13 сентября 2011

Ваша проблема связана с отсутствующим или некорректным кодом в лексическом анализаторе.

Сначала проверьте лексический анализатор.

Если он не вернет токен, то парсер не сможет правильно обработать значения. Напишите базовый тест, который напечатает значение токена. Не обращайте внимания на стиль «с», прежде всего это принцип:

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

Если вы запустили какой-то ввод, и это не сработало.

если лексический анализатор не устанавливает yylval при возврате NAME, нормально, что val пуст.

Если у вас в флексе есть такой шаблон:

[a-z]+  { return NAME; }

Это неправильно, вы должны установить значение, как это

[a-z]+  { 
   yylval.val = strdup(yytext); 
   yylval.length = yylen;
   return NAME; }
...