Flex中的单线或多线字符串检测

时间:2015-04-19 18:11:52

标签: flex-lexer lex lexical-analysis

我写了一个flex程序来检测给定的单词是否是动词。输入将从文本文件中获取。我想改进代码。有没有办法在输入文件中检测单行或多行字符串(例如:"我是男孩"或者#34;我是男孩\我喜欢足球")。在这种情况下,输出将是"找到单/多行字符串"这是我想要的程序。我怎么能这样做?请帮忙。这是我的示例代码:

%%

[\t]+

is   |

am   |

are  |

was  |

were {printf("%s: is a verb",yytext);}

[a-zA-Z]+ {printf("%s: is a verb",yytext);}

. |\n

%%

int main(int argc, char *argv[]){    
    yyin = fopen(argv[1], "r");    
    yylex();         
    fclose(yyin);
}

2 个答案:

答案 0 :(得分:1)

向词法分析器添加单个规则以识别字符串(可以分布在多行中)非常容易:

%%
["][^"]*["] {printf("'%s': is a string\n", yytext); }
[a-zA-Z]+ {printf("%s: is a word\n",yytext); }
[ \t\n]+
.
%%
int main(int argc, char *argv[]){    
    yyin = fopen(argv[1], "r");    
    yylex();         
    fclose(yyin);
}

(我整理了一下,专注于字符串vs无字符串演示。)

答案 1 :(得分:0)

Flex生成扫描仪,扫描仪通常用于识别单个令牌,在本例中为单词或换行符。它只从输入中读取足够的字符来确定此特定令牌是什么,并且除此之外没有任何前瞻。如果你想在输入中的某个位置找到换行符时做某事,作为一系列标记之一,那么解析器可以更好地处理它,例如由Yacc或Bison生成的解析器。