【发布时间】:2016-03-08 08:02:50
【问题描述】:
我在用 flex 编译这个正则表达式时遇到问题
"on"[ \t\r]*[.\n]{0,300}"."[ \t\r]*[.\n]{0,300}"from" {counter++;}
我在 flex 规范文件的规则部分有 10000 条规则。我试图编译它flex -Ce -Ca rule.flex 我等了 10 个小时仍然没有完成所以我杀了它。我开始发现问题并将问题缩小到这条规则。如果我从 100 条规则中删除这条规则,编译成 C 代码需要 21 秒。
如果我用其他字符替换句点,它将成功编译。例如
"on"[ \t\r]*[.\n]{0,300}"A"[ \t\r]*[.\n]{0,300}"from" {counter++;}
立即编译。即使是空格字符后面/前面的句点也能快速编译
"on"[ \t\r]*[.\n]{0,300}" ."[ \t\r]*[.\n]{0,300}"from" {counter++;}
我可以从flex manual 看到那个“。”匹配文字“.”
我的规则有什么问题?
【问题讨论】:
-
不要使用词法分析器进行解析。使用它们将标记彼此分开,并为自己编写一个单独的解析器,可以手动或使用解析器生成器(如 yacc/bison)。你永远不会从这里到达那里。
-
@EJP 我没有使用 flex 进行解析。我有数千个正则表达式,每个都代表一个文本消息模板。我正在使用 Java 的正则表达式来匹配模板。但这慢得让人无法接受。所以我使用 flex 将所有正则表达式编译成一个 DFA。它超快。我只想知道给定的短信是否与任何正则表达式匹配。
-
您正在使用flex进行解析。期间。
-
@EJP 无论如何,我认为这是一个合法的规则。如果您不这么认为,我很乐意纠正自己:)
标签: regex flex-lexer lex