Я получаю сообщение об ошибке: неопределенная ссылка на yyparse () - PullRequest
0 голосов
/ 25 октября 2018

Я выполнил следующий код на flex и получил ошибку yyparse (), целевой вывод, который я надеюсь получить:

P
font-size: 8px
font-family: arial
color: red
TD
background-color: yellow
border: 1px solid black

Вот моя программа:

%{
#include<stdio.h>
#include"yousuf.h"
int yylineno;
%}
%%
"<"[^>]*>           ;
[P]             {printf("P\n",yytext);}
"font-size: 8 px"       {printf("font-size: 8 px\n"); return FONTSIZE;}
"font-family: arial"        {printf("font-family: arial\n"); return FONTFAMILY;}
"color: red"            {printf("color: red\n"); return COLOR;}
[TD]                {printf("TD\n",yytext);}
"background-color: yellow"  {printf("background-color: yellow\n"); return BACKGROUNDCOLOR;}
"border: 1px solid black"   {printf("border: 1px solid black"); return BORDER;}
[ \t\n]             ;
.               ;   
%%
int main(int argc, char **argv) 
{
char string[]= "<style>P{font-size: 8px; font-family: arial; color: red;}TD{background-color: yellow; border: 1px solid black;}</style>";
YY_BUFFER_STATE buffer= yy_scan_string(string);
yyparse();
yy_delete_buffer(buffer);
return 0;
}
int yywrap(void)
{
return 0; 
}

Кроме того, есть ли другой способ подачи ввода для сгибания, кроме fopen("filename.txt","r");потому что он, кажется, не читает файл и не принимает его в качестве ввода.

1 Ответ

0 голосов
/ 25 октября 2018

Функция, определенная (f) lex, называется yylex.yyparse создается с помощью bison / yacc, который, по-видимому, вы не используете.

Flex получает данные от yyin, объявленного как:

extern FILE* yyin;

Так что этого недостаточнопросто позвонить fopen;вам нужно присвоить возвращаемое значение yyin.Вы также должны убедиться, что вызов fopen выполнен успешно:

yyin = fopen("filename.txt","r");
if (yyin == NULL) {
  fprintf(stderr, "Could not open 'filename.txt': %s\n", strerror(errno));
  exit(1);
}

Кстати, [TD] распознает либо T, либо D.Таким образом, при вводе TD ваше правило будет печатать TD дважды.

...