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



我在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("Pn",yytext);}
"font-size: 8 px"       {printf("font-size: 8 pxn"); return FONTSIZE;}
"font-family: arial"        {printf("font-family: arialn"); return FONTFAMILY;}
"color: red"            {printf("color: redn"); return COLOR;}
[TD]                {printf("TDn",yytext);}
"background-color: yellow"  {printf("background-color: yellown"); return BACKGROUNDCOLOR;}
"border: 1px solid black"   {printf("border: 1px solid black"); return BORDER;}
[ tn]             ;
.               ;   
%%
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;因为它似乎没有读取文件并将其作为输入。

由 (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': %sn", strerror(errno));
exit(1);
}

顺便说一句,[TD]识别TD.因此,使用输入TD,您的规则将打印两次TD

最新更新