我在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 定义的函数称为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': %sn", strerror(errno));
exit(1);
}
顺便说一句,[TD]
识别T
或D
.因此,使用输入TD
,您的规则将打印两次TD
。