3

我的 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,这是一个错误吗?

4

1 回答 1

0

FsLex 的解析器是使用 FsLexYacc 生成的。消息“解析错误”表示(您的 .fsl 文件的)词法分析,直到错误位置成功但在该位置解析失败。要找到根本原因,您需要将完整的输入文本发布到 FsLex。

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

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

编辑

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

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

于 2017-02-23T00:20:49.807 回答