2016-11-11 40 views
3

上終止並解析錯誤我的詞法分析器應該在分類期間區分括號並保留一疊已打開的括號。爲此,我在我的FSL文件中指定一個輔助功能是這樣的:FsLex在'{'

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?

+1

你已經發布的代碼有'頂部()'的結果是相對於''[''在一場比賽分支(一個字符)和'‘{’'(字符串)在另一個比賽分支。這不應該編譯! 'top()'的返回類型可以是'char'或'string',但無論哪種方式,F#編譯器都應該在這兩個分支之一給你一個類型錯誤。你確定你沒有在粘貼這個問題的代碼的地方發生複製粘貼錯誤? – rmunn

+0

修正了錯字,謝謝。然而,這與問題無關。不是F#編譯器不編譯,但fslex無法接受輸入並生成任何F#代碼。 –

回答

0

FsLex的解析器是使用FsLexYacc生成的。 「解析錯誤」消息意味着(您的.fsl文件的)lexing,直到錯誤位置成功,但解析在該位置失敗。要找到根本原因,您需要將完整的輸入文本發佈到FsLex。

這只是猜測。 FsLex可能會被'{'字符混淆,因爲它也是嵌入代碼塊的開放標記?或者你的輸入文本包含一些特殊的unicode字符,但它看起來像編輯器上的空白字符?

一個可能的解決方法是,在LexHelper.fs中創建另一個模塊和.fs文件LexHelper模塊,並將輔助函數放入其中,並從.fsl文件打開它。

編輯

望着FsLexYacc的源代碼,它不處理}人物在嵌入F#代碼單引號括起來,但是當用雙引號括起來一樣。

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