2012-05-09 11 views
6

मैं सामान्य रूप में एलेक्स और lexers समझने की कोशिश कर रहा हूँ, लेकिन मैं अपने lexer चलाने के लिए परेशानी आ रही है में त्रुटि।हास्केल एलेक्स - आवरण टेम्पलेट

मैं "बुनियादी" और "posn" रैपर में lexers लिखा था, लेकिन मैं "इकाई" आवरण में नहीं कर सके। मुझे लगता है कि मुझे monad रैपर का उपयोग करना है क्योंकि मुझे इनपुट में तारों और टोकन स्थितियों को इकट्ठा करने की आवश्यकता है। मुझे कई राज्यों की भी आवश्यकता है।

{ 
module Main (main) where 
} 

%wrapper "monad" 

$whitespace = [\ \b\t\n\f\v\r] 
$digit  = 0-9 
$alpha  = [a-zA-Z_] 
$upper  = [A-Z] 
$lower  = [a-z] 

@tidentifier = $upper($alpha|_|$digit)* 
@identifier = $lower($alpha|_|$digit)* 


tokens :- 

$whitespace+ ; 
$upper $alpha+ { typeId } 
$lower $alpha+ { id_ } 
$digit+ { int } 

{ 

data Lexeme = L AlexPosn LexemeClass String 

data LexemeClass 
     = TypeId String 
     | Id String 
     | Int Int 
     | EOF 
    deriving (Show, Eq) 

typeId :: AlexInput -> Int -> Alex Lexeme 
typeId = undefined 

id_ :: AlexInput -> Int -> Alex Lexeme 
id_ = undefined 

int :: AlexInput -> Int -> Alex Lexeme 
int = undefined 

alexEOF = return (L undefined EOF "") 

main :: IO() 
main = do 
    s <- getContents 
    let r = runAlex s $ do 
       return alexMonadScan 
    print r 
} 

मेरे कार्यों अब के लिए undefined हैं: अभी के लिए मैं इस सरल उदाहरण के चलाने के लिए कोशिश कर रहा हूँ।

➜ haskell ghc --make Tokens.hs 
[1 of 1] Compiling Main    (Tokens.hs, Tokens.o) 

templates/wrappers.hs:208:17: 
    Couldn't match expected type `(AlexPosn, Char, [Byte], String)' 
       with actual type `(t0, t1, t2)' 
    Expected type: AlexInput 
     Actual type: (t0, t1, t2) 
    In the return type of a call of `ignorePendingBytes' 
    In the first argument of `action', namely 
     `(ignorePendingBytes inp)' 

मैं भी विभिन्न त्रुटियों हो रही है जब मैं एलेक्स के GitHub रेपो में उदाहरण संकलित करने के लिए प्रयास करते हैं, यह एक संस्करण बेमेल साथ संबंधित हो सकता है: जब मैं यह संकलन करने की कोशिश, मैं इस त्रुटि मिल रही है? मैंने ghc 7.0.4 के साथ कैबल से एलेक्स स्थापित किया है। कोई विचार?

उत्तर

7

यह एलेक्स 3.0.1 में एक बग की तरह दिखता है। यह आपके कोड में कुछ अन्य असंबंधित समस्याओं से निपटने के बाद संस्करण 2.3.3 में ठीक काम करता है।

ignorePendingBytes (p,c,ps,s) = (p,c,s) 

उत्पन्न कोड में प्रकार का पालन करके, ऐसा लगता है जैसे इस समारोह प्रकार AlexInput -> AlexInput होना चाहिए, लेकिन AlexInput स्पष्ट रूप से दोनों एक 3 टपल और नहीं हो सकता है: समस्या उत्पन्न कोड में इस लाइन है एक 4-टुपल

यह संभावना हुआ क्योंकि AlexInput की परिभाषा दो संस्करणों के बीच बदल गया था।

type AlexInput = (AlexPosn, Char, String)   -- v2.3.3 
type AlexInput = (AlexPosn, Char, [Byte], String) -- v3.0.1 

मैं क्या बता सकते हैं, सही कोड होना चाहिए

ignorePendingBytes (p,c,ps,s) = (p,c,[],s) 

और मैन्युअल रूप से तैयार किए गए कोड में यह परिवर्तन यह अन्य मुद्दों से निपटने के बाद संकलन करता है बना रही है।

हालांकि, जब तक कि आप 3.0.1 से कुछ चाहिए, मैं पदावनति की सलाह देते हैं, जब तक यह उत्पन्न कोड के खिलाफ पैच बनाए रखने के लिए होने के रूप में, तय हो गई है आमतौर पर अधिक परेशानी से इसके लायक है।

आपका कोड Lexeme के लिए एक Show उदाहरण याद आ रही है और आप भी alexMonadScan, जो Alex इकाई में पहले से ही है पर return कॉल कर रहे हैं।

+0

धन्यवाद! क्या मुझे इसके गिटहब रेपो में कोई समस्या खुलनी चाहिए? – sinan

+0

@sinan: हाँ, यह शायद एक अच्छा विचार होगा। – hammar

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