【问题标题】:Macro contains a cycle宏包含一个循环
【发布时间】:2020-08-23 23:41:12
【问题描述】:

所以我正在尝试为方案制作一个词法分析器,当我运行 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}*\)

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

【问题讨论】:

  • 您似乎正在尝试使用词法分析器进行解析。这不是一个好主意。词法分析器应该只将输入分解为单个词素。让解析器解析结果。

标签: scheme lexer lexical-analysis jflex


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 那么您建议如何定义宏?因为方案定义的官方定义是我放在那里的。这是参考链接:scheme.com/tspl2d/grammar.html
  • @FernandoBermúdez:正如我所说,使用解析器生成器(CUP 或 Byacc/J 或其他)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-26
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多