2010-02-13 21 views
7

ऑपरेटरों और ऑपरेटरों की तरह दिखने वाली अधिकांश चीजें रूबी में विधियां हैं; 1 + 21.+(2) के लिए वाक्य रचनात्मक चीनी है।रुबी

हालांकि + और * तरीकों कि एक कार्यक्रम को फिर से परिभाषित कर सकते हैं, रूबी विशेष जादू 1 + 2 * 31.+(2.*(3)) बजाय 1.+(2).*(3) के रूप में मूल्यांकन करने के लिए है।

मुझे आश्चर्य है कि यह विशेष जादू रूबी में कहाँ रहता है - यदि यह दुभाषिया में हार्ड-वायर्ड है।

एरि।

उत्तर

10

सभी रूबी कार्यान्वयन में, ऑपरेटर प्राथमिकता पार्सर द्वारा संभाली जाती है। चूंकि बहुत सारे मौजूदा रूबी कार्यान्वयन एक ही पार्सर, या एक ही वाईएसीसी व्याकरण, parse.y in YARV is the file you want to look at से उत्पन्न एक पार्सर का उपयोग करते हैं। (।: src/org/jruby/parser/Ruby19Parser.y ही IronRuby के लिए: JRuby में, उदाहरण के लिए, उस फ़ाइल को अनिवार्य रूप से एक ही है। Merlin/Main/Languages/Ruby/Ruby/Compiler/Parser/Parser.y)

केवल चार रूबी क्रियान्वयन करना है कि नहीं या तो सीधे YARV पार्सर का उपयोग करें या एक YACC क्लोन उत्पन्न पार्सर का उपयोग YARV के parse.y से, कार्डिनल, टिनरब, रूबीगोलाइटली और एक्सआरबी हैं।

कार्डिनल तोते वर्चुअल मशीन के लिए रूबी कार्यान्वयन है, और चूंकि तोते में तोता व्याकरण इंजन शामिल है, कार्डिनल स्वाभाविक रूप से इसका उपयोग करता है। दिलचस्प फ़ाइल src/parser/grammar.pg है। पीजीई एक हाइब्रिड रिकर्सिव-डेसेंट पार्सर/ऑपरेटर प्राथमिकता पार्सर है, जिसका अर्थ है कि ऑपरेटर प्राथमिकता व्याकरण फ़ाइल में बहुत अच्छी तरह से दिखाई देती है।

टिनरब इयान पियामार्टा की पैर लाइब्रेरी का उपयोग करते हुए एक पीईजी पार्सर का उपयोग करता है। जैसा कि पीईजी पार्सर्स के लिए सामान्य है, वहां कोई ऑपरेटर प्राथमिकता तालिका नहीं है, बल्कि प्राथमिकता व्याकरण की पदानुक्रमिक संरचना में निहित है। विवरण के लिए vm/grammar.leg देखें। RubyGoLightly tinyrb से लिया गया है, सिवाय इसके कि यह कार्यान्वयन भाषा के रूप में सी के बजाय गो का उपयोग करता है, लेकिन यह एक ही पीईजी व्याकरण का उपयोग करता है।

एक्सआरबीई अपने पार्सर के लिए एएनटीएलआर का उपयोग करता है। यहां, दिलचस्प फ़ाइल src/com/xruby/compiler/parser/ruby.g है।

रूबिनीस मेलबर्न पार्सर का उपयोग करता है, जो अनिवार्य रूप से सीए एक्सटेंशन के रूप में पैक किया गया यारवी पार्सर है। MagLev ruby_parser का उपयोग करता है (नीचे देखें)।

रूबी कार्यान्वयन के अलावा, अन्य रूबी पार्सर्स भी उपलब्ध हैं।

रयान डेविस का रूबी_पार्सर YARV YACC व्याकरण से लिया गया है। यह पार्सर जेनरेटर के रूप में आरसीसी का उपयोग करता है। lib/ruby_parser.y देखें।

कालेब क्लॉसन के रेडपार्स कालेब के अपने हाथ से लिखे गए कंपाइलर-दुभाषिया का उपयोग करता है। दिलचस्प फ़ाइल lib/redparse/babyparser.rb है।

यह सभी पार्सर्स मुझे पता है, जो वास्तव में ऑपरेटर प्राथमिकता को संभालते हैं।आरडीओसी में एक और पार्सर बनाया गया है, और वहां यार्ड (यह अब रेडपार्स का उपयोग करता है) में एक होता था, लेकिन मॉड्यूल, कक्षाओं और विधियों, टिप्पणियों और विधि पैरामीटर सूचियों को निकालने के लिए केवल रूबी के सिंटैक्स के लिए पर्याप्त संभालते हैं। वे ऑपरेटर प्राथमिकता से निपटते नहीं हैं।

+0

धन्यवाद। आपका उत्तर बहुत विस्तृत है और इसमें लाइन नंबर सहित फ़ाइलों के लिए उत्कृष्ट पॉइंटर्स हैं। यह मेरी उम्मीदों से काफी अधिक है। मैं आपके कुछ अन्य उत्तरों को देखता हूं और रुबी कार्यान्वयन के बारे में बहुत कुछ सीखता हूं। अपना ज्ञान साझा करने के लिए आपका धन्यवाद। – iter

+0

आपका स्वागत है! –

0

हां, यह कड़ी मेहनत है, इसलिए आप नए ऑपरेटरों को जोड़ नहीं सकते हैं या मौजूदा ऑपरेटरों की प्राथमिकता को बदल नहीं सकते हैं।

2

भाषा प्रलेखन में "Operator Expressions" ऑपरेटर के साथ एक टेबल देता है जिसे विधियों के रूप में ओवरराइड किया जा सकता है। आप अपने स्वयं के ऑपरेटरों को नहीं बना सकते हैं - ऑपरेटरों के मैपिंग उनके प्रतीक नामों पर पार्सर के अंदर रहते हैं।

+0

लिंक के लिए धन्यवाद - मैं इसके बारे में परिचित हूं और इसे प्रश्न में शामिल करना चाहिए था। मैं "पार्सर के अंदर संभवतः जीवन" से अधिक विशिष्ट उत्तर की तलाश में हूं। शायद मैं इसे वाक्यांश दे सकता हूं: अगर मैं रूबी के अपने संस्करण को फोर्क करना चाहता था, जहां '*' की '' 'की तुलना में कम प्राथमिकता थी, तो मैं कौन सी फाइल बदलूंगा। एरि। – iter