我的词法分析器应该在进行词法识别时区分方括号并保持一堆打开的方括号。为此,我在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列表的引用。并相应地实现了推,顶,弹出。
问题在于,直到我添加
{
字符为止,一切都正常进行。现在FsLex死于error: parse error
如果我将字符更改为字符串,即再次写
"{"
FsLex没问题,那么一种解决方法是将实现更改为一堆字符串而不是字符。但是我的问题是,这种行为从何而来?如果是FsLex,这是bug吗?
最佳答案
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
关于f# - FsLex中止,解析错误为“{”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40545282/