宏包含一个循环

Macro contains a cycle

所以我正在尝试为 scheme 制作一个词法分析器,当我 运行 JFlex 转换 lever.flex 文件时,我得到一个类似于这个的错误,例如:

Reading "lexer.flex"

Macro definition contains a cycle.
1 error, 0 warnings.

它指的是这个宏:

definition = {variable_definition} 
            | {syntax_definition} 
            | \(begin {definition}*\) 
            | \(let-syntax \({syntax_binding}*\){definition}*\) 
            | \(letrec-syntax \({syntax_binding}*\){definition}*\)

此处定义的所有宏都已实现,但出于某种原因我无法摆脱这个错误,我也不知道为什么会发生。

lex/flex/JFlex 样式“定义”是一个宏扩展,如该错误消息所示。递归宏扩展是不可能的,因为宏扩展不是有条件的;试图扩大

definition = ... \(begin {definition}*\) ...

将产生无限长的正则表达式。

不要将词法分析器误认为是 general-purpose 解析器。词法分析器只是将输入拆分为单独的标记(或“词位”),使用正则表达式来识别每个标记。令牌没有结构(至少为了解析的目的);一旦标记被识别,它就是一个不可分割的对象。如果您发现自己编写的词法描述与结构化文本相匹配,那么您几乎可以肯定已经将词法分析推到了极限。

解析器使用允许递归描述(但前瞻性非常有限)并且可以创建输入的递归描述(例如解析树)的算法。