2010-04-26 13 views
5

No coincide. Esperando un LexBuffer<char> pero dado un LexBuffer<byte> El tipo char 'no coincide con el tipo 'bytes'Esperando un LexBuffer <char> pero dado un LexBuffer <byte> El tipo 'char' no coincide con el tipo 'byte'

Este es el mensaje de error que estoy recibiendo durante el uso de fslex. Intenté comprobar manualmente cada aparición de lexbuf y su tipo. Es LexBuffer<char> en todas partes. Pero aún el compilador me está dando el error anterior. ¿Puede decirme por qué ocurre este error y cómo resolverlo?

{ 
    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

Bienvenido a SO. Tenga en cuenta que los corchetes angulares en el texto de su pregunta deben escaparse en las comillas inversas para que se muestren correctamente. He hecho esta edición por usted. – AakashM

+0

No se puede depurar el código que no podemos ver. Por favor publique su código. – Juliet

+0

Esta es la definición de lexer. El contexto es escribir un DSl para un programa lineal usando F #. – csprabala

Respuesta

0

Hubo un error con mi definición de archivo lexer creo, se compilan cuando hice la siguiente mi definición analizador léxico. Los expertos pueden arrojar más información sobre los motivos, mientras que el conocimiento que tengo es el tipo de la lexbuf que se utiliza en el analizador léxico debe ser de alguna manera relacionada con la definición que el analizador genera

{ 

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

¿Has intentado insertar un lanzamiento explícito?

+0

Supongo que tienes razón; Mucha gente parece estar impresionada por el hecho de que no hay conversiones implícitas en F #. –

Cuestiones relacionadas