我对flex非常陌生,我不知道如何处理递归定义。当我尝试这样做的时候:
C A|BA|A{C}|BA{C}它告诉我
flex scanner push-back overflow我不知道为什么会这样。我认为它应该匹配all _,BABA,,_A等。不带{C}的端点BA和A已经定义好了。为了解决这个错误,重写定义的正确方法是什么?我现在很困惑。谢谢。
发布于 2021-11-01 06:26:58
Flex定义是宏,仅此而已。与C预处理器不同,Flex不检测或抑制递归扩展,也没有条件,因此自引用宏不可避免地会溢出输入缓冲区。(Flex通过将替换字符串推回输入缓冲区来扩展宏。与lex不同的是,它用括号包围替换文本,以提供一点卫生功能。)
基本上,flex模式实际上是正则表达式(在数学意义上),只能与常规语言相匹配。这通常足以识别令牌,这是预期的用例。任何更复杂的事情都应该用解析器来处理。
在这种情况下,递归位于模式的末尾,您可以只使用一个重复操作符,例如(B?A)+。
https://stackoverflow.com/questions/69792551
复制相似问题