gpt4 book ai didi

parsing - 如何使用 alex/haskell 进行 python 样式的缩进/缩进标记?

转载 作者:行者123 更新时间:2023-12-04 13:21:27 25 4
gpt4 key购买 nike

我正在用 Haskell 为 Alex 中的一种小语言编写词法分析器。

该语言被指定为具有 pythonesque 显着缩进,每当缩进级别发生变化时都会发出 INDENT 标记或 DEDENT 标记。

在像 C 这样的传统命令式语言中,您会在词法分析器中保留一个全局变量,并使用每行的缩进级别对其进行更新。

这在 Alex/Haskell 中不起作用,因为我不能在任何地方使用 Haskell 存储任何全局数据,而且我不能将所有的词法规则放在任何单子(monad)或任何东西中。

那么,我该怎么做呢?甚至可能吗?还是我必须编写自己的词法分析器并避免使用亚历克斯?

最佳答案

请注意,在其他对空格敏感的语言(如 Haskell)中,布局处理确实是在词法分析器中完成的。 GHC 实际上在 Alex 中实现了布局处理。这是来源:
https://github.com/ghc/ghc/blob/master/compiler/GHC/Parser/Lexer.x
正如 jrockway 指出的那样,您的问题中有一些严重的错误会导致您误入歧途。 “我无法使用 Haskell 在任何地方存储任何全局数据”是错误的。首先,您可以拥有全局状态,其次,当 Alex 以安全的方式完全支持规则中的状态转换时,您不应该在这里使用全局状态。
查看 Alex 提供的 AlexState 结构,让您通过词法分析器线程化状态。然后,看看GHC的布局实现中是如何使用状态来实现布局规则的缩进/取消缩进的。 (在 GHC 的词法分析器中搜索“-- Layout processing”以查看状态是如何被推送和弹出的)。

关于parsing - 如何使用 alex/haskell 进行 python 样式的缩进/缩进标记?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com