我在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;因为它似乎无法读取文件并将其作为输入。
答案 0 :(得分:1)
(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
。