c语言 - 弹性字符串识别"unrecognised rule"错误



我试图创建一个字符串识别规则以在flex中运行,字符串可以由转义字符(,\t,\r,\,",'(,符号(-,+,*,/,:,_,$,!,#,@,&,~,^,(,((和a-zA-Z0-9字符组成,我已经尝试了下面代码的许多变体,但我不断收到上面提到的相同错误。

ESCAPECHAR  [n] | [t] | [r] | [] | ['] | ["]
SYMBOLS [-+*/:_$!#@&~^()]
CHARACTERS [0-9a-zA-Z]
STRING  ("({ESCAPECHAR} | {SYMBOLS} | {CHARACTERS})*") | ('({ESCAPECHAR} | {SYMBOLS} | {CHARACTERS})*')

你最好阅读 Flex 手册中关于模式语法的章节。它不是很长,它给出了 Flex 模式语法的完整描述。

以下是您犯的一些错误:

  1. Flex 模式不能包含不带引号的空格(除非您将它们放在标有x标志的子表达式中(。所以

    [n] | [t] | [r] | [] | ['] | ["]
    

    无效。

  2. 此外,用于指示:

    • 以下字母是控制字符的代码(因此n是换行符(,或
    • 以下标点符号不应具有特殊意义。 所以在[]中,表示以下]应该被视为普通字符,而不是字符类的结尾,这意味着字符类将持续到下一]。字符类中的空格字符被认为是用引号括起来的,因此字符类由字符]、空格、|['组成。(Flex 允许您在字符类中重复字符,因此它不会抱怨有两个空格字符的事实。你可能的意思是[\].
  3. 无论如何,您应该以与编写其他字符类相同的方式编写字符类,作为[]中的一系列字符或转义代码:

    [ntr\ '"]
    
  4. Flex 允许您通过用引号将字符括起来来引用字符,以便 '"({ESCAPECHAR} |{符号} |{字符}(*" 被视为单个文本字符串,必须在文本中逐字匹配。您可能希望引号是普通字符,因此您应该转义引号或将它们放入单字符字符类中:

    ["]({ESCAPECHAR}|{SYMBOLS}|{CHARACTERS})*["]
    

    同样,有必要从模式中删除空格。

  5. 我假设您的意图是允许"转义字符"仅在实际转义时才出现在字符串中。您的{ESCAPECHAR}宏将扩展到实际字符的集合,以便它包括换行符、制表符和回车符。它还包括引号和撇号,它们实际上应该保留用于终止字符串文字。可能,您的意思是允许转义代码,如果它们前面有一个(与 C 或如上所述,flex 本身(。在这种情况下,你真正需要写的是

    ESCAPECHAR    \[ntr'"]
    

    (也就是说,一个\,后面跟着字符ntr'"。然而,即使这样也不精确:它不允许使用\来表示单个,并且它强制用户编写"Don't just copy code."'"',这两者都通常在没有反斜杠转义的情况下写入。

最新更新