2010-04-26 3 views
5

유형이 일치하지 않습니다. 유형 '바이트'LexBuffer가 필요하지만 LexBuffer가 주어진 경우 <byte> 'char'유형이 'byte'유형과 일치하지 않습니다.

이 일치하지 않는 LexBuffer<byte> 유형 '문자'주어진 LexBuffer<char>하지만를 기대하는 것은 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

+0

볼 수없는 코드를 디버그 할 수 없습니다. 코드를 게시하십시오. – Juliet

+0

이것은 렉서 정의입니다. 컨텍스트는 F #을 사용하여 선형 프로그램 용 DSl을 작성하는 것입니다. – csprabala

답변

0

은 내가 믿는 내 렉서 파일 정의와 실수가 있었다, 그것은 컴파일. 내가 가지고있는 이해가 어떻게 든 파서가 SO

{ 

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 #에 암시 적 캐스트가 없다는 사실에 의해 던져진 것 같습니다. –

6

아마도 유니 코드 렉서를 생성해야합니다. 유니 코드 렉서는 LexBuffer < char > 대신 LexBuffer < 바이트 > 대신 작동합니다.

  • FsLex에 대한 "unicode"인수는 선택 사항이지만 선택하면 유니 코드 렉서가 생성됩니다. 나는 다음 내 렉서 정의를 만들 때

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

+1

'fslex --unicode Your.fsl' - 다른 사람들이 비틀 거리는 경우를 대비하여. –