Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing flex中的模式正确,错误:无法匹配规则_Parsing_Flex Lexer - Fatal编程技术网

Parsing 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

您好,我正在尝试在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-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模式中没有特殊意义。

谢谢!似乎已经修好了。谢谢你!似乎是固定的。