0

我正在尝试使用 Flex 制作一个简单的扫描仪。在声明部分,我试图使用 {-} 运算符从 id 中排除保留字,但我无法让它工作。我发现的每个示例都使用 {+} 和 {-} 运算符,如下代码所示:

    [a-z]{-}[d]

但是,我试图在下面的代码中使用这些运算符,但我总是得到错误:

    invalid_id   "char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int"
    all_ids      [a-zA-Z_][a-zA-Z0-9_]*
    id           {all_ids}{-}{invalid_id}

有什么办法让它工作吗?这些运算符可以在没有方括号的情况下使用吗?

4

1 回答 1

0

{-}and{+}运算符仅适用于字符类,例如,[a-z]而不适用于完整的正则表达式或字符串。flex不支持更通用的{-}运算符。更通用的版本{+}当然是|. 您的特定问题通常可以通过以下事实来解决:如果两个模式匹配相同的字符串,则将使用第一个模式。ID因此,将您的规范更改为以下内容实际上会从s 中排除所有关键字。

%%
"char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int"  { return KEYWORD; }
[a-zA-Z_][a-zA-Z0-9_]*   { return ID; }
%%
于 2013-06-23T16:31:32.407 回答