flex 递归定义导致 flex 扫描器推回溢出

flex recursion definitions cause flex scanner push-back overflow

我是 flex 的新手,我不知道如何处理递归定义。 当我尝试这样做时:

C   A|BA|A{C}|BA{C}

它告诉我

flex scanner push-back overflow

我不知道为什么会这样。我认为它应该匹配所有 [BABAA][AAABAABA]等. 没有 {C} 的终点 BA 和 A 已经定义。 重写定义以解决此错误的正确方法是什么。我现在很困惑。谢谢。

Flex 定义是宏,仅此而已。与 C 预处理器不同,Flex 不检测或​​抑制递归扩展,并且没有条件语句,因此自引用宏将不可避免地溢出输入缓冲区。 (Flex 通过将替换字符串推回输入缓冲区来扩展宏。与 lex 不同的是,它用括号将替换文本括起来以提供一点卫生。)

基本上,flex 模式实际上是正则表达式(在数学意义上)并且只能匹配正则语言。这通常足以识别令牌,这是预期的用例。任何更复杂的东西都应该用解析器来处理。

在这种情况下,递归位于模式的末尾,您可以只使用重复运算符,例如 (B?A)+.