2010-04-26 89 views
5

類型不匹配。期待LexBuffer<char>但由於一個LexBuffer<byte>類型「字符」類型「字節」期待LexBuffer <char>,但給定LexBuffer <byte>類型'char'與'byte'類型不匹配

此不匹配是在使用fslex,我得到的錯誤消息。我已經嘗試手動檢查lexbuf及其類型的每一次出現。到處都是LexBuffer<char>。但編譯器仍然給我上面的錯誤。你能告訴我爲什麼會發生這個錯誤,以及如何解決它。

{ 
    open System 
    open Microsoft.FSharp.Text.Lexing 
    open Microsoft.FSharp.Text.Parsing 

    let lexeme (lexbuf : LexBuffer<char>) = new System.String(lexbuf.Lexeme) 
    let newline (lexbuf:LexBuffer<char>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine 
    let unexpected_char (lexbuf:LexBuffer<char>) = failwith ("Unexpected character '"+(lexeme lexbuf)+"'") 
} 

let char = ['a'-'z' 'A'-'Z'] 
let digit = ['0'-'9'] 
let float = '-'?digit+ '.' digit+ 
let ident = char+ (char | digit)* 
let whitespace = [' ' '\t'] 
let newline = ('\n' | '\r' '\n') 

rule tokenize = parse 
    | "maximize" { MAXIMIZE } 
    | "minimize" { MINIMIZE } 
    | "where" { WHERE } 
    | '+' { PLUS } 
    | '-' { MINUS } 
    | '*' { MULTIPLY } 
    | '=' { EQUALS } 
    | '>' { STRICTGREATERTHAN } 
    | '<' { STRICTLESSTHAN } 
    | ">=" { GREATERTHANEQUALS } 
    | "<=" { LESSTHANEQUALS } 
    | '[' { LSQUARE } 
    | ']' { RSQUARE } 
    | whitespace { tokenize lexbuf } 
    | newline { newline lexbuf; tokenize lexbuf }  
    | ident { ID (lexeme lexbuf) } 
    | float { FLOAT (Double.Parse(lexeme lexbuf)) } 
    | ';' { SEMICOLON } 
    | eof { EOF } 
    | _ { unexpected_char lexbuf } 
+0

歡迎這樣的定義是在詞法分析器中使用的lexbuf的類型。請注意,問題文本中的尖括號需要在引號中進行轉義才能正確顯示 - 我已經爲您編輯了該編輯。 – AakashM 2010-04-26 14:03:00

+0

無法調試我們無法看到的代碼。請發佈您的代碼。 – Juliet 2010-04-26 17:33:00

+0

這是詞法分析器的定義。上下文是使用F#編寫線性程序的DSl。 – csprabala 2010-04-27 05:31:01

回答

0

有我的詞法分析器文件定義了一個錯誤,我相信,當我做了以下我的詞法分析器定義編譯。專家們可以拋出更深入的原因,而我的理解是應該以某種方式涉及到解析器產生

{ 

open System 
open LanguageParser 
open Microsoft.FSharp.Text.Lexing 
open Microsoft.FSharp.Text.Parsing 
open System.Text 

let newline (lexbuf:LexBuffer<_>) = lexbuf.EndPos <- lexbuf.EndPos.NextLine 

} 

let char = ['a'-'z' 'A'-'Z'] 
let digit = ['0'-'9'] 
let float = '-'?digit+ '.' digit+ 
let ident = char+ (char | digit)* 
let whitespace = [' ' '\t'] 
let newline = ('\n' | '\r' '\n') 

rule tokenize = parse 
    | "maximize" { MAXIMIZE } 
    | "minimize" { MINIMIZE } 
    | "where" { WHERE } 
    | '+' { PLUS } 
    | '-' { MINUS } 
    | '*' { MULTIPLY } 
    | '=' { EQUALS } 
    | '>' { STRICTGREATERTHAN } 
    | '<' { STRICTLESSTHAN } 
    | ">=" { GREATERTHANEQUALS } 
    | "<=" { LESSTHANEQUALS } 
    | '[' { LSQUARE } 
    | ']' { RSQUARE } 
    | whitespace { tokenize lexbuf } 
    | newline { newline lexbuf; tokenize lexbuf } 
    | ident { ID <| Encoding.UTF8.GetString(lexbuf.Lexeme) } 
    | float { FLOAT <| Double.Parse(Encoding.UTF8.GetString(lexbuf.Lexeme)) } 
    | ';' { SEMICOLON } 
    | eof { EOF } 
    | _ { failwith ("Unexpected Character") } 
1

你試過插入一個明確的演員嗎?

+0

我猜你是對的;很多人似乎都被F#中沒有隱式強制轉換的事實拋出。 – 2010-04-26 23:47:18

相關問題