你好我试图在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;}
有关为什么不行的任何线索?有点新兴,所以我相信我错过了什么,不知道是什么,但
答案 0 :(得分:2)
问题在于这个角色类:
other_characters [./-_]
字符类中的破折号表示可能的字符范围(如[a-z]
中所示,它匹配任何小写字母)。因此/-_
匹配其代码点介于/
(0x2F)和_
(0x5F)之间的任何字符。该范围包括数字,大写字母和一些标点符号,包括冒号和分号。
这使冒号成为{string}
中的有效字符,因此{string}
将匹配ss:Workshop
。并且由于flex优先考虑匹配输入的第一个规则,因此ss:Workshop
规则无法匹配。
您可以通过将短划线放在角色类的开头或结尾来解决这个问题:[-./_]
或[./_-]
。这些将匹配列出的四个字符之一。
顺便说一句,没有必要反斜杠 - 逃避冒号,甚至引用它。它在弹性模式中没有特别的意义。