FsLex在'{'上解析错误

时间:2016-11-11 09:50:19

标签: f# lex fsyacc fslex

我的Lexer应该在lexing期间区分括号并保持一堆打开的括号。为此,我在我的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这是一个错误吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

修改

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

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