Как разобрать из строки, а не из файла
Возможный дубликат:
Как заставить YY_INPUT указывать на строку, а не на stdin в Lex & Yacc (Solaris)
я хочу разобрать из строки, а не из файла. я знаю, что v может использовать yy_scan_string fn, чтобы сделать это. но для меня это не работает должным образом, поэтому, пожалуйста, помогите мне
1 ответ
Я сам недавно справился с этой проблемой. Гибкая документация по этому вопросу оставляет желать лучшего.
Я сразу вижу две вещи, которые могут сбить вас с толку. Во-первых, обратите внимание, что ваша строка должна иметь двойное значение NULL. То есть вам нужно взять обычную строку с нулевым символом в конце и добавить еще один терминатор NULL в конце. Этот факт скрыт в документации по гибкому оборудованию, и мне понадобилось время, чтобы найти его.
Во-вторых, вы прекратили вызов "yy_switch_to_buffer". Это также не особенно ясно из документации. Если вы измените свой код на что-то вроде этого, он должен работать.
// add the second NULL terminator
int len = strlen(my_string);
char *temp = new char[ len + 2 ];
strcpy( temp, my_string );
temp[ len + 1 ] = 0; // The first NULL terminator is added by strcpy
YY_BUFFER_STATE my_string_buffer = yy_scan_string(temp);
yy_switch_to_buffer( my_string_buffer ); // switch flex to the buffer we just created
yyparse();
yy_delete_buffer(my_string_buffer );