【问题标题】:flex recursion definitions cause flex scanner push-back overflowflex 递归定义导致 flex 扫描器后推溢出
【发布时间】:2021-11-01 04:13:00
【问题描述】:

我对 flex 很陌生,我不知道如何处理递归定义。 当我尝试这样做时:

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

它告诉我

flex scanner push-back overflow

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

【问题讨论】:

    标签: flex-lexer lex


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-09
      • 2021-05-04
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 2011-09-30
      • 2017-08-31
      相关资源
      最近更新 更多