В настоящее время я работаю над анализатором 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 ++ и заполню их информацией в зависимости от того, что я прочитал.
Если вам нужно больше кода, чтобы увидеть мою проблему, не стесняйтесь спрашивать.
спасибо