我的词法分析器需要区分括号并在分析过程中维护一个已打开括号的堆栈。为此,我在我的fsl文件中定义了一个辅助函数如下:
let updateBracketStack sign = // whenever a bracket is parsed, update the stack accordingly
match sign with
| '[' -> push sign
| '{' -> push sign
| ']' -> if top() = '[' then pop() else ()
| '}' -> if top() = '{' then pop() else ()
| _ -> ()
栈(stack)当然是 char 列表的引用。因此,push、top 和 pop 的实现也相应完成。
问题在于,一切都正常运行,直到我添加了字符 {
。现在,FsLex 只会显示错误:解析错误
。
如果我将字符更改为字符串,即写成 "{"
,那么 FsLex 就可以正常工作了,因此解决方法是将实现更改为字符串的堆栈而不是字符的堆栈。
然而我的问题是,这种行为来自哪里?这是 FsLex 中的 bug 吗?
top()
的结果与'['
(一个字符)进行比较,在另一个匹配分支中与"{"
(一个字符串)进行比较。这不应该编译通过!top()
的返回类型可以是char
或string
,但无论哪种方式,F# 编译器都应该在这两个分支中的一个上给出类型错误。你确定你没有在粘贴此问题的代码时犯了复制和粘贴错误吗? - rmunn