gpt4 book ai didi

parsing - 快乐:这不是关键字

转载 作者:行者123 更新时间:2023-12-02 13:58:10 24 4
gpt4 key购买 nike

当您编写 Happy 描述时,您必须定义所有可能出现的 token 类型。但您只能匹配 token 类型,而不是单个 token ...

这有点问题。例如,考虑 data 关键字。根据 Haskell 报告,该 token 是“reservedid”。所以我的标记器可以识别它并对其进行标记。但是,请考虑 as 关键字。现在事实证明这不是一个保留ID;这是一个普通的变量。它仅在一种情况下是特殊的。您完全可以声明一个名为 as 的普通变量,这样就可以了。

所以这里有一个问题:我如何具体解析 as

一开始我并没有认真考虑这个问题。我刚刚定义了一个新的 token 类型,它代表任何文本恰好为 as 的 varid token 。

...然后我花了大约 2 个小时试图弄清楚为什么我的语法实际上不起作用。是的,事实证明,由于此 token 类型与现有 token 类型重叠,因此声明顺序很重要。 (!!!)从字面上看,改变声明的顺序使语法解析变得完美。

但是现在我很担心。我担心 as 永远不会作为 varid 进行匹配,而只会作为其本身进行匹配。因此,所有表示 varid 的语法规则都会拒绝 as 标记 - 这是完全错误的!

解决此问题的正确方法是什么?

最佳答案

GHC 在 Parser.y 中做了什么就是定义一个非终结符类型 special_id ,列出许多特殊的非关键字,例如 as,然后定义 tyvarid varid(非终端)标记,将其作为终端 VARID 之外的选项(以及其他一些标记,尽管在我看来,它们中的大多数应该也输入 special_id)。

摘录:

varid :: { Located RdrName }
: VARID { sL1 $1 $! mkUnqual varName (getVARID $1) }
| special_id { sL1 $1 $! mkUnqual varName (unLoc $1) }
| 'unsafe' { sL1 $1 $! mkUnqual varName (fsLit "unsafe") }
...

special_id :: { Located FastString }
special_id
: 'as' { sL1 $1 (fsLit "as") }
| 'qualified' { sL1 $1 (fsLit "qualified") }
| 'hiding' { sL1 $1 (fsLit "hiding") }
| 'export' { sL1 $1 (fsLit "export") }
...

关于parsing - 快乐:这不是关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33467481/

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