【问题标题】:Flex (lexical analyzer) {+} and {-} operatorsFlex(词法分析器){+} 和 {-} 运算符
【发布时间】:2013-06-23 13:53:13
【问题描述】:

我正在尝试使用 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}

有什么办法让它工作吗?这些运算符可以不用方括号吗?

【问题讨论】:

    标签: operators flex-lexer


    【解决方案1】:

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

    %%
    "char"|"else"|"if"|"class"|"new"|"return"|"void"|"while"|"int"  { return KEYWORD; }
    [a-zA-Z_][a-zA-Z0-9_]*   { return ID; }
    %%
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多