我收到一个错误:yyparse()的未定义引用

时间:2018-10-24 21:13:35

标签: windows flex-lexer lex

我在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")之外,还有其他方法可以将输入信息传递给flex;因为它似乎无法读取文件并将其作为输入。

1 个答案:

答案 0 :(得分:1)

(f)lex定义的函数称为yylexyyparse由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]可以识别TD。因此,使用输入TD,您的规则将打印两次TD