Я создаю .exe ФАЙЛ, который может анализировать выражение, сгенерированное lex и yacc. Но я делаю это, просто получаю ввод с экрана и просто возвращаю результат парсера с экрана. Я видел некоторые предложения по использованию YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size)
, но я все еще не мог найти хороший способ сделать это.
Возможно ли, что я поместил несколько заголовков (которые скомпилированы с помощью lex yacc) в мою основную программу c ++, а затем я могу использовать yylex () для ее вызова, давая строку в качестве ввода и получая возвращаемое значение в основной программе? Спасибо за вашу помощь, я не понимаю, как это реализовать. Благодарю.
yy_scan_string
это то, как вы даете flex строку в качестве ввода. Вы называете это сначала, а затем позвоните yylex
и он будет использовать эту строку в качестве входных данных для получения токенов, а не stdin
, Когда вы получаете EOF от yylex
, он отсканировал всю строку. Вы можете позвонить yy_delete_buffer
на YY_BUFFER_STATE
вернулся yy_scan_string
(чтобы освободить память) и позвонить yy_scan_string
еще раз, если вы хотите отсканировать новую строку.
Ты можешь использовать yy_scan_buffer
вместо этого, чтобы сохранить немного копирования, но затем вы должны настроить буфер самостоятельно (в основном, это должно закончиться два NUL байтов вместо одного).
К сожалению, нет стандартного заголовочного файла от flex, объявляющего их. Поэтому вам нужно либо где-то объявить их самостоятельно (скопировать декларации из документации flex), либо вызвать их в 3-м разделе .l
файл, который дословно копируется в конец lex.y.c
файл.
Других решений пока нет …