मैं ईमेल के माध्यम से श्री स्वीनी पूछा और इस उत्तर प्राप्त किया: टेम्पलेट वर्गों
सी ++ कोड उपयोग कर रहा है मैं ने लिखा है कि लागू पार्सर संयोजक। विचार कुछ मूल पार्सर्स के साथ शुरू करना है, जैसे कि अक्षर < 'ए'> एक शाब्दिक चरित्र 'ए' पार्स करता है, पैनी <> किसी भी चरित्र को पार करता है लेकिन विफल होने के अंत में विफल रहता है, जब तक हम विफल नहीं होते फ़ाइल के अंत में, आदि। और फिर हम उन्हें पैन जैसे संयोजकों का उपयोग करके मनमाने ढंग से पेड़ में जोड़ते हैं जो एक बी को पार करते हैं, और केवल सफल होते हैं यदि दोनों सफल होते हैं - अन्यथा यह पार्स बिंदु से मुक्त हो जाता है। और यदि यह सफल होता है, तो नतीजा एक संरचना है जिसमें दो फ़ील्ड होते हैं, एक के परिणामस्वरूप, और बी के परिणामस्वरूप एक। और इसी तरह।
कार्यान्वयन कई कारणों से सी ++ में गन्दा है, जिसमें टेम्पलेट्स मनमानी वैरिएडिक पैरामीटर का समर्थन नहीं करते हैं, और बिना प्रथम श्रेणी के लैम्ब्स के हम पार्सर के साथ परिणाम इनलाइन को आसानी से संसाधित नहीं कर सकते हैं।
यहां टेम्पलेट कोड के कुछ स्निपेट हैं, जिनसे आप शायद ढांचे के विवरण को समझ सकते हैं।
// Parses a literal item.
UBOOL LiteralEvaluate (UClass* C,class FParseInBase& In,class FParseOutBase& Out)
{
FParseInMark M(In);
NNode* e = In.GetNextSource();
if (e && e->IsA(C))
{
Out.Callback(e);
return 1;
}
M.Restore(In);
return 0;
}
// Optional item of the specified type.
template <class U> struct Optional
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
U::Evaluate(In,Out);
return 1;
}
};
// Ignore items by absorbing them; retains boolean logic but not callback.
template <class T> struct Ignore
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
return T::Evaluate(In,GIgnore);
}
};
// Zero or more items of the specified type.
template <class T> struct ZeroOrMore
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
while (T::Evaluate(In,Out));
return 1;
}
};
// One or more items of the specified type.
template <class T> struct OneOrMore
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
for(INT i=0; T::Evaluate(In,Out); i++);
return i>0;
}
};
// Always fails.
struct RFalse
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
return 0;
}
};
// Always succeeds.
struct RTrue
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
return 1;
}
};
// Parses the first matching items of the specified subtypes of T.
template <class A,class B=RFalse,class C=RFalse,class D=RFalse > struct Or
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
return A::Evaluate(In,Out) || B::Evaluate(In,Out) || C::Evaluate(In,Out) || D::Evaluate(In,Out);
}
};
// Parses all the specified items.
template <class A,class B=RTrue,class C=RTrue,class D=RTrue> struct And
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
FParseInMark Mark(In);
Conjunction<NNode> Q;
if(A::Evaluate(In,Q) && B::Evaluate(In,Q) && C::Evaluate(In,Q) && D::Evaluate(In,Q))
{
Q.Forward(Out);
return 1;
}
Mark.Restore(In);
return 0;
}
};
// A separated list.
template <class A,class B> class SeparatedList : public Or<And<A,B,SeparatedList>,A> {};
// Integer comparison.
template <INT A,INT B> struct IsAtLeast
{
static UBOOL Evaluate (class FParseInBase& In,FParseOutBase& Out)
{
return A>=B;
}
};
Test.ae एक प्रयोगात्मक पटकथा भाषा मैं 1999-2001 में लागू करने गया था कि - कि रंग योजना ट्रेंडी था वापस तो, मैं कसम खाता हूँ। :-)
दिखाया गया कोड भाषा संरचनाओं के लिए मेटाडेटा को परिभाषित करता है। भाषा स्मालटाक "सबकुछ एक वस्तु है" मार्ग से एक लंबा रास्ता तय करती है, जो प्रथम श्रेणी के मेटाक्लास और संबंधित मुद्दों से निपटती है, लेकिन अंततः जब मैं हास्केल, केयेन, कोक और अन्य में उन्नत प्रकार के सिस्टम काम से परिचित हो गया तो मैंने इसे छोड़ दिया भाषाओं।
आजकल -
मैं के बाद से कोड हास्केल की तरह एक आधुनिक कार्यात्मक भाषा में एक ऐसी ही कार्यान्वयन की तुलना में 70-80% से फूला हुआ हो जाता है, सी ++ में पारसर्स या compilers को लागू करने के एक प्रशंसक नहीं हूँ। अधिक विस्तार के लिए हास्केल पार्सर संयोजकों पर पढ़ें - परिणामी सादगी और प्रत्यक्षता अनुकरणीय है और यह एक कठोर, प्रकार-सुरक्षित तरीके से किया जाता है।
मुझे लगता है कि विषय/रंग चौंकाने वाला हैं। अन्यथा, दिलचस्प सवाल है। – ChristopheD
@ क्रिस्टोफेड हाहा हाँ। उस समय मैं इतना प्रशंसक था कि मैंने अपना डेस्कटॉप बदल दिया - यह होना चाहिए कि कैसे * वास्तविक * प्रोग्रामर काम करते थे! मैंने हमेशा सोचा कि क्या वह सिर्फ मजाक कर रहा था। और मैंने जो तस्वीर पोस्ट की है, वह फसल है, यहां पूरी बात है: http://praeclarum.org/so/sweeney-full.png –
शायद वह जेडजेड-ओओपी के अगली पीढ़ी के संस्करण पर काम कर रहा था ... :) http : //en.wikipedia.org/wiki/ZZT-oop –