我的词法分析器应该在词法分析过程中区分括号并维护一堆打开的括号。为此,我在fsl文件中指定了一个helper函数,如下所示:
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列表的ref。并相应地实现了push、top、pop。
问题是,在我添加{字符之前,一切都正常进行。现在FsLex和error: parse error一起死了
如果我将字符更改为字符串,即再次写入"{" FsLex,那么解决方法是将实现更改为字符串堆栈而不是字符堆栈。
然而,我的问题是,这种行为从何而来?如果是FsLex,这是一个bug吗?
发布于 2017-02-23 08:20:50
FsLex的解析器是使用FsLexYacc生成的。消息"parse error“表示词法分析(您的.fsl文件),直到错误位置成功,但在该位置解析失败。要找到根本原因,您需要将完整的输入文本发布到FsLex。
这只是猜测。FsLex可能会被'{‘字符混淆,因为它也是嵌入式代码块的开放令牌?或者您的输入文本包含一些特殊的unicode字符,但它看起来像编辑器中的空格?
一种可能的解决方法是,在LexHelper.fs中创建另一个模块和.fs文件LexHelper模块,并将帮助器函数放入其中,然后从.fsl文件中打开它。
编辑
查看FsLexYacc的源代码,它不能处理嵌入式F#代码中用单引号括起来的}字符,但如果用双引号括起来,它就能处理。
https://github.com/fsprojects/FsLexYacc/blob/master/src/FsLex/fslexlex.fsl
https://stackoverflow.com/questions/40545282
复制相似问题