Вызов lex / yacc из отдельной программы - PullRequest
3 голосов
/ 24 августа 2010

Я читал о lex / yacc. Книги и примеры не трудно подражать. На самом деле вся концепция ясна как колокол. За одним исключением. Lex / yacc, кажется, генерирует автономные программы. Что если бы я хотел вызвать их как функцию парсера? Кажется, Yacc генерирует основную функцию, поэтому как бы я вызывал ее самостоятельно, без конфликтов.

Мне также пока неясно, как они работают при вводе файлов. Я в порядке с захватом строки из файла и отправкой ее парсеру, но что если ваш парсер ищет многострочную структуру, например блок, заключенный в фигурные скобки?

Я понимаю, что я глуп по обоим этим, но любая помощь приветствуется. Спасибо.

Ответы [ 2 ]

3 голосов
/ 21 октября 2010

ввод в комбо lexx / yacc осуществляется через ФАЙЛ * с именем yyin.

по умолчанию это stdin - траля вокруг lex.yy.c, чтобы найти его

если вы назначите ФАЙЛ * для yin, лексер будет читать из этого файла, вы делаете что-то вроде

yyin = fopen ("parseme", "rt");

перед вызовом yyparse (), обычно в main ().

2 голосов
/ 24 августа 2010

Обе программы генерируют функции yylex() и yyparse(), но ни одна из них не генерирует основную функцию. Вы должны добавить свою собственную функцию main() где-нибудь. Многие учебные пособия помещают их в файл .l или .y, но вы можете размещать их в любом месте.

...