2010-04-26 86 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

相关问题