微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

宏包含一个循环

如何解决宏包含一个循环

因此,我正在尝试为该方案创建一个词法分析器,当我运行jflex转换handle.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}*\) ...

将导致无限长的正则表达式。

不要将词法分析器误认为是通用分析器。词法分析器仅使用正则表达式识别每个词法,仅将输入分割成单独的词法(或“词法”)。令牌没有结构(至少出于解析目的);一旦识别出令牌,它就是一个不可分割的对象。如果您发现自己写的词法描述与结构化文本匹配,那么几乎可以肯定,词法分析超出了其范围。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。