6

类型不匹配。期望 a LexBuffer<char> 但给定 a 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 } 
4

3 回答 3

6

也许您需要生成一个 unicode 词法分析器。unicode 词法分析器使用 LexBuffer <char>而不是 LexBuffer <byte >

  • FsLex 的“unicode”参数是可选的,但如果启用会生成一个 unicode 词法分析器。

http://blogs.msdn.com/dsyme/archive/2009/10/21/some-smaller-features-in-the-latest-release-of-f.aspx

于 2010-04-26T14:41:14.403 回答
1

您是否尝试过插入显式演员表?

于 2010-04-26T14:39:26.753 回答
0

我相信我的词法分析器文件定义有一个错误,它是在我进行以下我的词法分析器定义时编译的。专家可以更深入地了解原因,而我的理解是词法分析器中使用的 lexbuf 的类型应该与解析器生成的定义有某种关系

{

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") } 
于 2010-04-27T07:00:02.243 回答