Flex Lexer REGEX 优化器
Flex Lexer REGEX Optimiser
是否有 Flex REGEX 优化器?有一些类似于 perl 模块的东西:
http://search.cpan.org/~rsavage/Regexp-Assemble-0.37/
但遗憾的是它不支持 lex regex 语法。我几乎想做的是拥有一个优化正则表达式的工具
TOMA|TOMOV
至
TOM(A|OV)
提前谢谢大家。
实在没有必要这么做。 Flex 将正则表达式编译成单个确定性有限状态机 (FSM),除了对非常大的扫描器定义产生轻微的缓存影响外,交替或重复运算符不会造成性能损失。
Flex 不会最小化 FSM,但这只会减少 FSM 表的大小,不会降低词法分析的速度(除了前面提到的缓存效果,如果适用)。
即使 FSM 没有最小化,NFA 到 DFA 的转换过程也会执行您建议的特定转换。因此,以下两条规则产生完全相同的词法分析器:
TOMA|TOMOV { /* do something */ }
TOM(A|OV) { /* do something */ }
虽然没有真正的性能损失,但您应该尽量避免以下情况,因为它会不必要地重复操作代码:
TOMA { /* do something */ }
TOMOV { /* do the same thing */ }
您可能还会发现 this question 中的讨论很有用。
是否有 Flex REGEX 优化器?有一些类似于 perl 模块的东西:
http://search.cpan.org/~rsavage/Regexp-Assemble-0.37/
但遗憾的是它不支持 lex regex 语法。我几乎想做的是拥有一个优化正则表达式的工具
TOMA|TOMOV
至
TOM(A|OV)
提前谢谢大家。
实在没有必要这么做。 Flex 将正则表达式编译成单个确定性有限状态机 (FSM),除了对非常大的扫描器定义产生轻微的缓存影响外,交替或重复运算符不会造成性能损失。
Flex 不会最小化 FSM,但这只会减少 FSM 表的大小,不会降低词法分析的速度(除了前面提到的缓存效果,如果适用)。
即使 FSM 没有最小化,NFA 到 DFA 的转换过程也会执行您建议的特定转换。因此,以下两条规则产生完全相同的词法分析器:
TOMA|TOMOV { /* do something */ }
TOM(A|OV) { /* do something */ }
虽然没有真正的性能损失,但您应该尽量避免以下情况,因为它会不必要地重复操作代码:
TOMA { /* do something */ } TOMOV { /* do the same thing */ }
您可能还会发现 this question 中的讨论很有用。