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)+
.
我是 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)+
.