【发布时间】:2016-11-11 09:50:19
【问题描述】:
我的 Lexer 应该在词法分析期间区分括号并维护一堆打开的括号。为此,我在我的 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 ()
| _ -> ()
堆栈当然是 char 列表的引用。并且push、top、pop都相应的实现了。
问题是在我添加{ 字符之前一切正常。现在 FsLex 简单地死于 error: parse error
如果我将字符更改为字符串,即写入"{" FsLex 再次正常,因此解决方法是将实现更改为字符串堆栈而不是字符。
但是,我的问题是,这种行为从何而来?如果 FsLex 这是一个错误吗?
【问题讨论】:
-
您发布的代码在一个匹配分支中将
top()的结果与'['(一个字符)和另一个匹配分支中的"{"(一个字符串)进行比较。那不应该编译!top()的返回类型可以是char或string,但无论哪种方式,F# 编译器都应该在这两个分支之一上给您一个类型错误。您确定在粘贴此问题的代码时没有在某处出现复制粘贴错误吗? -
修正错字,谢谢。但是,这与问题无关。不是 F# 编译器没有编译,而是 fslex 无法接受输入并生成任何 F# 代码。