Как установить API из lex yacc в программу

Я создаю ФАЙЛ .exe, который может анализировать выражение, сгенерированное lex и yacc. Но я просто получаю ввод с экрана и просто возвращаю результат парсера с экрана. Я видел несколько предложений по использованию YY_BUFFER_STATE yy_scan_buffer(char *base, yy_size_t size), но так и не смог найти хороший способ сделать это.

Возможно ли, что я поместил некоторые заголовки (которые скомпилированы lex yacc) в свою основную программу C++, а затем я могу использовать yylex() для ее вызова, передавая строку в качестве входных данных и получая возвращаемое значение в основной программе? Спасибо за вашу помощь, я не понимаю, как это реализовать. Спасибо.


person CJAN.LEE    schedule 23.09.2012    source источник
comment
Я пометил это как gnu-flex, потому что это не имеет ничего общего с Adobe Flex.   -  person JeffryHouser    schedule 23.09.2012
comment
@www.Flextras.com: вы правы; тег gnu-flex предназначен для GNU Flex.   -  person Jonathan Leffler    schedule 23.09.2012
comment
Если вы создали исполняемый файл (.exe) из кода Lex и Yacc, то вы не сможете использовать его в качестве подпрограммы в программе на C++, поэтому я запутался в этой части вашего вопроса. Если вы спрашиваете, можете ли вы организовать лексический сканер так, чтобы вместо чтения со стандартного ввода он читал из строки, ответ будет «да, но как это зависит от того, используете ли вы AT&T Lex, GNU Flex или какой-то другой». другой вариант Лекса. Просьба уточнить.   -  person Jonathan Leffler    schedule 23.09.2012
comment
Например, у меня есть lex.yy.c, frame.tab.c frame.tab.h (frame.l,frame.y уже сгенерированы), поэтому я хочу использовать их в своей основной программе. Я хочу включить их в качестве заголовков, и я могу использовать некоторые функции для вызова синтаксического анализатора. Бывший. function1(&string1), то это будет парсер.   -  person CJAN.LEE    schedule 23.09.2012
comment
@JonathanLeffler: Flex — это не программное обеспечение GNU. Никогда не было и никогда не будет (она финансировалась, по крайней мере частично, правительством США, которое налагает ограничения, среди прочего, совершенно несовместимые со всеми версиями GPL и всем, что я могу себе представить в качестве возможной будущей версии либо).   -  person Jerry Coffin    schedule 02.10.2012
comment
@JerryCoffin: обсудите это на MSO. Тег gnu-flex был назначен для обозначения различий между Adobe Flex и Flex. Если бы это зависело от меня, я бы использовал adobe-flex и flex, но было бы много людей, не уделяющих должного внимания тому, чтобы использовать flex вместо adobe-flex.   -  person Jonathan Leffler    schedule 02.10.2012


Ответы (1)


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.

person Chris Dodd    schedule 06.05.2013