【问题标题】:correct pattern in flex, error : rule cannot me matchedflex 中的正确模式,错误:我无法匹配规则
【发布时间】:2018-05-27 09:27:28
【问题描述】:

你好我正在尝试在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;}

关于为什么这不正常的任何线索?在这里弯曲有点新,所以我相信我错过了一些东西,但不确定是什么

【问题讨论】:

    标签: parsing flex-lexer


    【解决方案1】:

    问题出在这个字符类上:

    other_characters [./-_]
    

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

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

    您可以通过将破折号放在字符类的开头或结尾来解决此问题:[-./_][./_-]。这些只会匹配列出的四个字符之一。

    顺便说一句,没有必要反斜杠转义冒号,甚至引用它。它在 flex 模式中没有特殊意义。

    【讨论】:

    • 谢谢!似乎已修复。
    猜你喜欢
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多