Парсер Bison / Flex получает строки как значения токенов - PullRequest
4 голосов
/ 28 апреля 2011

В настоящее время я работаю над анализатором verilog, использующим в качестве токенизатора bison и flex. Моя грамматика работает нормально, и теперь моя цель - сохранить данные, собранные в базе данных. (Если вы не знаете, что такое verilog, это не имеет значения, но вы можете найти информацию здесь: http://www.verilog.com/VerilogBNF.html)

В настоящее время я застрял на получении значений токена. Моя грамматика в основном состоит из строк и некоторых чисел.

Я просмотрел интернет и нашел полезные вещи, которые побуждают меня писать такие правила lex:

[A-Za-z_]+[A-Za-z0-9_$]* {
    lline = yylineno;yylval.str = strdup(yytext);
    return K_IDENTIFIER;
}

В моем входном файле бизонов .y я сделал некоторые изменения, которые

#define YYSTYPE char*
....
%union {char* str;
  double val;
}
%token<str>K_IDENTIFIER
...
beginning of the grammar rules

Теперь, когда у меня есть правило грамматики, в котором есть K_IDENTIFIER, например

module : K_MODULE K_IDENTIFIER list_of_ports_parameters K_POINTVIRG
{cout << "the value of K_IDENTIFIER is :"<< $2.str << endl;}
list_of_module_itemsE
    K_ENDMODULE

fdsfds

Как видите, я хотел бы напечатать значение (которое является строкой) K_IDENTIFIER. Это просто пример, чтобы помочь мне понять механизм, лежащий в основе этого, потому что позже я создам некоторый объект c ++ и заполню их информацией в зависимости от того, что я прочитал.

Если вам нужно больше кода, чтобы увидеть мою проблему, не стесняйтесь спрашивать. спасибо

1 Ответ

6 голосов
/ 28 апреля 2011

С %union, #define для YYSTYPE не требуется; это может быть частью проблемы. Зубр автоматически выберет правильного члена объединения, поэтому вам нужно только $2 для ссылки на значение, а не $2.str, т.е.

{ cout << "the value of K_IDENTIFIER is: " << $2 << endl; }
...