【问题标题】:lex - unrecognized rule - using regexlex - 无法识别的规则 - 使用正则表达式
【发布时间】:2015-02-04 19:24:02
【问题描述】:

我是使用 lex 的新手,我只是想尝试看看我是否可以尝试制作一个文件,该文件可以使用正则表达式在 C 文件中定位 cmets。

%%

(/\*([^*]|[^]|(\*+([^*/]|[^])))*\*+/)|(//.*){   
    return 5;
}
.   ;

%%

int yywrap(void)
{
    return1;
}

所以这里的想法是,每次找到评论时,它都会“返回 5”,否则,什么也不会发生。

问题是,正则表达式没有被识别,我遇到了错误:

第 3 行:无法识别的规则 第 3 行:无法识别的规则 第 3 行:无法识别的规则 第 3 行:无法识别的规则 ...等

任何帮助将不胜感激,在此先感谢。

【问题讨论】:

  • 太棒了。实际上会发生什么
  • an error: :3 :unrecognized rule, aka 正则表达式未被识别(将其编辑为主要问题--woops)
  • 您的规则应该用空格与其操作分开。另外,我建议使用单独的规则来匹配这两种 cmets。
  • 请注意,模式片段[^*]|[^] 仅相当于[^*],片段[^*/]|[^] 相当于[^*/]
  • @JohnBollinger:不完全是。 [^] 是一个未终止的字符类(不仅在 flex 中;在 posix 中也是如此。)

标签: c regex parsing lex


【解决方案1】:

在 (f)lex 正则表达式中,就像在标准 Posix 正则表达式中一样,您可以在字符类中包含 ] 作为类中的 first 字符。 (无论您使用的是正([...])还是负([^...])字符类,都是如此。)

所以第一个[^] 启动了一个字符类,然后被下一个] 终止,下一个未终止。我不清楚您对 [^] 的期望是什么意思,所以我无法提供替代建议。

此外,您需要在操作前留一个空格,以定义正则表达式的结尾。

【讨论】:

  • 感谢您抽出宝贵的时间,(还有 john)我发现 [^] 类我使用得不好,所以在这种情况下我简单地删除了它,我也意识到我需要转义正则表达式中的“/”以便读取它,因为我没有意识到它是 lex 中的实际操作,根据:csd.uwo.ca/~moreno//CS447/Lectures/Lexical.html/node11.html,这两个更改帮助很好地解决了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多