flex中的正确模式,错误:我无法匹配规则

时间:2018-05-27 09:27:29

标签: parsing flex-lexer

你好我试图在flex中使用以下模式来匹配

形式的信息
  • ss:Name="string"(字符串必须在“”)
  • ss:Name="Number"(实际字数)
  • ss:Workshop

当我编译它时,它显示警告错误,规则不能匹配。我的代码是这样的:

%{
#include "y.tab.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
%}
%option noyywrap
letter [a-zA-Z]
digit [0-9]
other_characters [./-_]
whitespace [ \t]
newline [\n]
string ({letter}|{digit}|{other_characters})({letter}|{digit}|{other_characters})+
%%
{string}({whitespace}|{string})     {printf ("%s", yytext); return TEXTMSG;}
"ss\:Workshop"      {printf("%s", yytext); return WORKSHOP;}
"ss\:Name\=\"Number\""|"ss\:Name\="\"{string}\"|    {printf("%s", yytext); return NAME;}

有关为什么不行的任何线索?有点新兴,所以我相信我错过了什么,不知道是什么,但

1 个答案:

答案 0 :(得分:2)

问题在于这个角色类:

other_characters [./-_]

字符类中的破折号表示可能的字符范围(如[a-z]中所示,它匹配任何小写字母)。因此/-_匹配其代码点介于/(0x2F)和_(0x5F)之间的任何字符。该范围包括数字,大写字母和一些标点符号,包括冒号和分号。

这使冒号成为{string}中的有效字符,因此{string}将匹配ss:Workshop。并且由于flex优先考虑匹配输入的第一个规则,因此ss:Workshop规则无法匹配。

您可以通过将短划线放在角色类的开头或结尾来解决这个问题:[-./_][./_-]。这些将匹配列出的四个字符之一。

顺便说一句,没有必要反斜杠 - 逃避冒号,甚至引用它。它在弹性模式中没有特别的意义。