Parsing flex中的模式正确,错误:无法匹配规则
您好,我正在尝试在flex中使用以下模式来匹配以下形式的信息Parsing flex中的模式正确,错误:无法匹配规则,parsing,flex-lexer,Parsing,Flex Lexer,您好,我正在尝试在flex中使用以下模式来匹配以下形式的信息 ss:Name=“string”(字符串必须位于“”) ss:Name=“Number”(实际字号) ss:车间 当我编译它时,它会显示规则无法匹配的警告错误。我的代码是: %{ #include "y.tab.h" #include <stdio.h> #include <stdlib.h> #include <string.h> %} %option noyywrap letter [a-z
(字符串必须位于“”)ss:Name=“string”
(实际字号)ss:Name=“Number”
ss:车间
%{
#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;}
%{
#包括“y.tab.h”
#包括
#包括
#包括
%}
%选项No yywrap
字母[a-zA-Z]
数字[0-9]
其他字符[./-]
空白[\t]
换行符[\n]
字符串({字母}{数字}{其他字符})({字母}{数字}{其他字符})+
%%
{string}({whitespace}{string}){printf(“%s”,yytext);返回TEXTMSG;}
“ss \:工作坊”{printf(“%s”,yytext);返回工作坊;}
“ss\:Name\=”Number\“”“\”ss\:Name\=”{string}\“{printf(“%s”,yytext);返回Name;}”
有什么线索可以解释为什么这不好吗?这里的flex有点新,所以我相信我错过了一些东西,不确定是什么问题,尽管这个角色类中存在问题:
other_characters [./-_]
字符类中的破折号表示可能的字符范围(如[A-z]
,它匹配任何小写字母)。因此,/-
匹配代码点在/
(0x2F)和
(0x5F)之间的任何字符。该范围包括数字、大写字母和一些标点符号,包括冒号和分号
这使冒号成为{string}
中的有效字符,因此{string}
将匹配ss:Workshop
。由于flex优先考虑与输入匹配的第一条规则,因此不可能匹配ss:Workshop
规则
您可以通过将破折号放在字符类的开头或结尾来解决此问题:[-./-./-
或[./-]
。这些将只匹配列出的四个字符中的一个
顺便说一下,没有必要对冒号进行反斜杠转义,甚至不用引用它。它在flex模式中没有特殊意义。问题在于此字符类:
other_characters [./-_]
字符类中的破折号表示可能的字符范围(如[A-z]
,它匹配任何小写字母)。因此,/-
匹配代码点在/
(0x2F)和
(0x5F)之间的任何字符。该范围包括数字、大写字母和一些标点符号,包括冒号和分号
这使冒号成为{string}
中的有效字符,因此{string}
将匹配ss:Workshop
。由于flex优先考虑与输入匹配的第一条规则,因此不可能匹配ss:Workshop
规则
您可以通过将破折号放在字符类的开头或结尾来解决此问题:[-./-./-
或[./-]
。这些将只匹配列出的四个字符中的一个
顺便说一下,没有必要对冒号进行反斜杠转义,甚至不用引用它。它在flex模式中没有特殊意义。谢谢!似乎已经修好了。谢谢你!似乎是固定的。