2011-04-08 58 views
3

我正在研究使用F#的玩具編譯器,即FsLex和FsYacc的組合。爲了熟悉它們,我已經閱讀了Expert F#(v2)書的Lexer/Parser章節(一本好書btw)。現在,我已經完成了推薦的ocamlyacc教程的一半,並停留在最後一個示例多功能計算器mfcalc。特別是,在分析器文件下面的語句什麼是以下ocamlyacc代碼的fsyacc等價物?

%token <float->float> FNCT 

不斷收到錯誤「錯誤:解析錯誤」在我F# version。我在這裏錯過了什麼,或者這是F#目前不支持的功能嗎?

回答

4

這看起來像一個錯誤。添加parens並沒有幫助。我嘗試了各種解決方法,但我找不到乾淨的方法。你應該做一個錯誤報告。

如果你只有一個功能(如在本教程中的例子),你應該定義中拉開序幕類型:

type floatFunction = float -> float 
... 
%token <floatFunction> FNCT 

如果你有很多功能,你還可以定義一個泛型類型:

type functionType<'a, 'b> = 'a -> 'b 
... 
%token < ('a, 'b) functionType > FNCT 

該類型中的任何角度括號都會導致分析錯誤(即使是functionType<float,float>)。

+0

我試着按照您的建議採用這種方法。它解決了這個問題。謝謝。順便說一句,在這種情況下,我仍然考慮ocamlyacc語法,看起來更乾淨,更自然。 – Cygwin98 2011-04-08 13:11:34

+0

剛剛向F#團隊發送了一個錯誤報告。 – Cygwin98 2011-04-08 13:40:00

+0

@ Cygwin98他們修復了這個bug嗎? – 2013-10-05 02:56:50

0

你可能需要把括號,如

%token <(float->float)> FNCT 

我忘了(是從F#機離開檢查)。

+0

嗨,布賴恩,我添加了parens,現在錯誤更改爲Parser.fsy(11,21):錯誤:意外的字符')' – Cygwin98 2011-04-08 12:40:04

相關問題