FsLex在'{'处出现解析错误而中止

3

我的词法分析器需要区分括号并在分析过程中维护一个已打开括号的堆栈。为此,我在我的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 吗?


1
你发布的代码在一个匹配分支中将 top() 的结果与 '['(一个字符)进行比较,在另一个匹配分支中与 "{"(一个字符串)进行比较。这不应该编译通过!top() 的返回类型可以是 charstring,但无论哪种方式,F# 编译器都应该在这两个分支中的一个上给出类型错误。你确定你没有在粘贴此问题的代码时犯了复制和粘贴错误吗? - rmunn
修正了拼写错误,谢谢。然而这与问题无关。不是 F# 编译器没有编译,而是 fslex 未能接受输入并生成任何 F# 代码。 - Friedrich Gretz
1个回答

0

FsLex的解析器是使用FsLexYacc生成的。"解析错误"这个消息意味着词法分析(对于您的.fsl文件)已经成功执行,但在该位置的解析失败了。要找到根本原因,你需要将完整的输入文本发布到FsLex上。

这只是猜测。FsLex可能会被'{'字符搞混,因为它也是嵌入式代码块的开放标记?或者您的输入文本包含一些特殊的Unicode字符,但在编辑器上看起来像空格?

一个可能的解决方案是,在LexHelper.fs中创建另一个模块和.fs文件,LexHelper模块,并将您的帮助函数放在其中,并从.fsl文件打开它。

EDIT

查看FsLexYacc的源代码,它不处理用单引号括起来的}字符的嵌入式F#代码,但在用双引号括起来时则可以处理。

https://github.com/fsprojects/FsLexYacc/blob/master/src/FsLex/fslexlex.fsl


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接