yyin = fopen(argv[1],"r");
yyout = fopen(argv[2],"w");
yyparse();
yylex();
В текущем состоянии моя программа создает указанный мной выходной файл, но в него ничего не записывается.
Вы растерялись, потому что не знаете, чтоваша программа делает, и вы не знаете, что она делает, потому что она не говорит вам.Что вам нужно, так это обратная связь.В частности, вам необходимо проверить наличие ошибок.
Например, что если первый fopen (3) завершится неудачно?Что если yyparse завершится неудачей или не вернется?(Не будет.) Проверьте наличие ошибок, и программа сообщит вам, что происходит.
#include <err.h>
if( argc < 3 ) {
errx(EXIT_FAILURE, "syntax: foo in out");
}
if( (yyin = fopen(argv[1],"r")) == NULL ) {
err(EXIT_FAILURE, "could not read '%s'", argv[1]);
}
if (yyout = fopen(argv[2],"w")) == NULL ) {
err(EXIT_FAILURE, "could not write '%s'", argv[2]);
}
printf("starting yyparse\n");
if( 0 != yyparse() ) {
errx(EXIT_FAILURE, "parse error");
}
printf("starting yylex\n");
if( 0 != yylex() ) {
errx(EXIT_FAILURE, "lex error");
}
Вышеуказанное гарантирует, что программа запускается с достаточным количеством аргументов, гарантирует, что оба файла открыты успешно, и проверяет наличие ошибок.ошибки разбора и лексирования.Это всего лишь пример.Как сказал Джон Боллинджер , вам не нужен yyparse, потому что вы не используете бизон, а yyout контролирует только файл, используемый оператором flex ECHO.Вы можете использовать свой собственный глобальный дескриптор FILE *
и fprintf (3) в своих действиях flex.
Я думаю, вы обнаружите, что вы никогда не увидите «запускающий yylex» на экране, потому что yyparse никогда не возвращается, потому что - если он генерируется где-то - он не возвращается, потому что он вызывает yylex , который никогда ничего не возвращает ему.
Я бы удалил эти строки и включил бы отладку flex с помощью
yy_flex_debug = 1;
перед вызовом yylex.Я думаю, вы найдете, что это имеет больше смысла тогда.