所以我试图为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}*) ...
将导致一个无限长的正则表达式。
不要把词法分析器误认为是通用语法分析器。词法分析器只需使用正则表达式来识别每个标记,就可以将输入拆分为各个标记(或"词法"(。令牌没有结构(至少出于解析的目的(;一旦标识了一个令牌,它就是一个不可分割的对象。如果你发现自己在写与结构化文本相匹配的词汇描述,那么几乎可以肯定的是,你已经将词汇分析推向了极限。
解析器使用一种算法,该算法允许递归描述(但具有非常有限的前瞻性(,并且可以创建输入的递归描述(例如解析树(。