如何将正则表达式缩写引入 Lex 中的正则表达式?

How to introduce a Regular Expression abbreviation into a Regular Expression in Lex?

我有以下 RE 缩写:

word  [\x21-\x22\x24-\x2F\x3A-\x3F\x5B-\x5E\x60\x7B\-\x7E]

现在我需要在下面的正则表达式中引入这个词:

[@][0-9a-zword][@]

所以我可以有,例如,以下短语:

@0@
@r@
@!@

我怎么能说它可以是数字、从 a 到 z 的字符或我之前定义的 "word"?

"@"([0-9a-z]|({word}))"@"

您不能将定义的名称扩展到集合匹配中,因为这通常没有任何意义。使用 | 和括号获得具有适当分组的替代项。

注意 AT&T lex(与 flex 相对),因为它只是直接替换定义,所以对于 C 宏,您可能需要额外的括号来获得正确的优先级。