~
पार्सर पर विधि दो पार्सर को जोड़ती है जो दो मूल पार्सर्स को लगातार लागू करती है और दो परिणाम देता है। यही कारण है कि बस हो सकता है (Parser[T]
में)
def ~[U](q: =>Parser[U]): Parser[(T,U)].
आप दो से अधिक पारसर्स संयुक्त कभी नहीं करते हैं, तो यह ठीक हो जाएगा। हालांकि, अगर आप उनमें से तीन, p1
, p2
, p3
, चेन वापसी प्रकार T1
, T2
, T3
, तो p1 ~ p2 ~ p3
, जो p1.~(p2).~(p3)
का मतलब के साथ प्रकार Parser[((T1, T2), T3)]
की है। और यदि आप उनमें से पांच को अपने उदाहरण के रूप में जोड़ते हैं, तो यह Parser[((((T1, T2), T3), T4), T5)]
होगा। फिर जब आप परिणाम पर पैटर्न मिलान करते हैं, तो आपके पास उन सभी पैराथेन्स भी होंगे:
case ((((_, id), _), formals), _) => ...
यह काफी असहज है।
फिर एक चालाक वाक्य रचनात्मक चाल आता है। जब किसी केस क्लास में दो पैरामीटर होते हैं, तो यह पैटर्न में उपसर्ग स्थिति के बजाय इंफिक्स में दिखाई दे सकता है। यही है, अगर आपके पास case class X(a: A, b: B)
है, तो आप case X(a, b)
के साथ पैटर्न मिलान कर सकते हैं, लेकिन case a X b
के साथ भी। (गैर खाली सूची से मेल खाने के लिए x::xs
पैटर्न के साथ ऐसा किया जाता है, ::
एक केस क्लास है)। जब आप केस a ~ b ~ c
लिखते हैं, तो इसका मतलब case ~(~(a,b), c)
है, लेकिन case ((a,b), c)
से भी अधिक सुखद और अधिक सुखद है, जो सही होने के लिए मुश्किल है।
तो ~
पार्सर में विधि Parser[(T,U)]
के बजाय Parser[~[T,U]]
लौटाती है, ताकि आप एकाधिक ~ के परिणाम पर आसानी से मिलान कर सकें। इसके अलावा, ~[T,U]
और (T,U)
उतना ही वही बात है, जैसा कि आप प्राप्त कर सकते हैं के रूप में isomorphic।
समान नाम पार्सर में संयोजन विधि के लिए चुना गया है और परिणाम प्रकार के लिए, क्योंकि परिणामी कोड पढ़ने के लिए प्राकृतिक है। एक तुरंत देखता है कि परिणाम प्रसंस्करण में प्रत्येक भाग व्याकरण नियम के सामान से कैसे संबंधित है।
parser1 ~ parser2 ~ parser3 ^^ {case part1 ~ part2 ~ part3 => ...}
टिल्डा चुना क्योंकि इसके प्राथमिकता दी जाएगी (यह कसकर बांधता है) पार्सर पर अन्य ऑपरेटरों के साथ अच्छी तरह से निभाता है।
एक अंतिम बिंदु, सहायक ऑपरेटर ~>
और <~
हैं जो ऑपरेंड में से एक के परिणाम को छोड़ देते हैं, आमतौर पर नियम में निरंतर भाग जो उपयोगी डेटा नहीं लेते हैं। तो कोई
"class" ~> ID <~ ")" ~ formals <~ ")"
और परिणामस्वरूप केवल आईडी और सूत्रों के मान प्राप्त करेगा।
आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। मैं स्कैला की "निहित रूपांतरण" सुविधा से परिचित नहीं था। उस विषय पर एक अच्छा लेख यहां पाया जा सकता है: http://scalada.blogspot.com/2008/03/implicit-conversions-magical-and.html – Jano