我试图创建一个字符串识别规则以在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 模式语法的完整描述。
以下是您犯的一些错误:
-
Flex 模式不能包含不带引号的空格(除非您将它们放在标有
x
标志的子表达式中(。所以[n] | [t] | [r] | [] | ['] | ["]
无效。
-
此外,
用于指示:
- 以下字母是控制字符的代码(因此
n
是换行符(,或 - 以下标点符号不应具有特殊意义。 所以在
[]
中,表示以下
]
应该被视为普通字符,而不是字符类的结尾,这意味着字符类将持续到下一]
。字符类中的空格字符被认为是用引号括起来的,因此字符类由字符]
、空格、|
、[
和'
组成。(Flex 允许您在字符类中重复字符,因此它不会抱怨有两个空格字符的事实。你可能的意思是[\]
.
- 以下字母是控制字符的代码(因此
-
无论如何,您应该以与编写其他字符类相同的方式编写字符类,作为
[
和]
中的一系列字符或转义代码:[ntr\ '"]
-
Flex 允许您通过用引号将字符括起来来引用字符,以便 '"({ESCAPECHAR} |{符号} |{字符}(*" 被视为单个文本字符串,必须在文本中逐字匹配。您可能希望引号是普通字符,因此您应该转义引号或将它们放入单字符字符类中:
["]({ESCAPECHAR}|{SYMBOLS}|{CHARACTERS})*["]
同样,有必要从模式中删除空格。
-
我假设您的意图是允许"转义字符"仅在实际转义时才出现在字符串中。您的
{ESCAPECHAR}
宏将扩展到实际字符的集合,以便它包括换行符、制表符和回车符。它还包括引号和撇号,它们实际上应该保留用于终止字符串文字。可能,您的意思是允许转义代码,如果它们前面有一个(与 C 或如上所述,flex 本身(。在这种情况下,你真正需要写的是
ESCAPECHAR \[ntr'"]
(也就是说,一个
\
,后面跟着字符n
、t
、r
、'
、"
。然而,即使这样也不精确:它不允许使用\
来表示单个,并且它强制用户编写
"Don't just copy code."
和'"'
,这两者都通常在没有反斜杠转义的情况下写入。