2010-04-26 5 views
5

मिस्चैच टाइप करें। एक LexBuffer<char> लेकिन एक LexBuffer<byte> प्रकार 'चार' प्रकार 'बाइट'लेक्सबफर <char> की अपेक्षा लेकिन लेक्सबफर <byte> दिया गया 'प्रकार' प्रकार 'बाइट' प्रकार से मेल नहीं खाता

यह मेल नहीं खाता दी उम्मीद है, जबकि fslex का उपयोग कर कि मैं त्रुटि संदेश आ रहा है। मैंने लेक्सबफ और उसके प्रकार की हर घटना को मैन्युअल रूप से जांचने का प्रयास किया है। यह हर जगह 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

आपका स्वागत करने के लिए से संबंधित होना चाहिए है। ध्यान दें कि आपके प्रश्न पाठ में कोण ब्रैकेट को सही तरीके से प्रदर्शित करने के लिए बैकक्वॉट में भागने की आवश्यकता है - मैंने आपके लिए यह संपादन किया है। – AakashM

+0

कोड डीबग नहीं कर सकता है जिसे हम नहीं देख सकते हैं। कृपया अपना कोड पोस्ट करें। – Juliet

+0

यह लेक्सर परिभाषा है। संदर्भ एफ # का उपयोग कर एक रैखिक कार्यक्रम के लिए एक डीएसएल लिखना है। – csprabala

उत्तर

0

मेरी lexer फ़ाइल परिभाषा के साथ एक गलती मेरा मानना ​​है कि वहाँ था, यह जब मैं निम्नलिखित मेरी lexer परिभाषा बनाया संकलित। विशेषज्ञों, कारणों में और अधिक जानकारी फेंक सकता है, जबकि समझ रहा है कि lexbuf कि lexer में प्रयोग किया जाता है के प्रकार के किसी भी तरह परिभाषा यह है कि पार्सर अतः उत्पन्न

{ 

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

मुझे लगता है कि आप सही हैं अनुमान लगा रहे हैं; बहुत से लोग इस तथ्य से फेंकते प्रतीत होते हैं कि एफ # में कोई अंतर्निहित नहीं है। –

6

शायद आपको एक यूनिकोड लेक्सर उत्पन्न करने की आवश्यकता है। एक यूनिकोड लेक्सर LexBuffer < char > के साथ लेक्सबफर < बाइट > के बजाय काम करता है।

  • FsLex को "यूनिकोड" तर्क वैकल्पिक है, लेकिन यदि सक्षम एक यूनिकोड लेक्सर उत्पन्न करता है।

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

+1

'fslex --unicode your.fsl' - यदि अन्य लोग इस पर ठोकर खा जाते हैं। –

संबंधित मुद्दे