मैं मजेदार और अभ्यास के लिए लैम्ब्डा कैलकुस दुभाषिया लिख रहा हूं। मैं एक ctype
पहलू जो खाली स्थान के रूप में परिभाषित करता है विराम चिह्न जोड़कर ठीक से tokenize पहचानकर्ता को iostreams मिला: (! classic_table()
शायद क्लीनर होगा, लेकिन है कि ओएस एक्स पर काम नहीं करता है)ओवरराइडिंग सीटीपी <wchar_t>
struct token_ctype : ctype<char> {
mask t[ table_size ];
token_ctype()
: ctype<char>(t) {
for (size_t tx = 0; tx < table_size; ++ tx) {
t[tx] = isalnum(tx)? alnum : space;
}
}
};
और फिर स्वैप जब मैं एक पहचानकर्ता हिट में पहलू:
locale token_loc(in.getloc(), new token_ctype);
…
locale const &oldloc = in.imbue(token_loc);
in.unget() >> token;
in.imbue(oldloc);
वेब पर आश्चर्यजनक रूप से कम लैम्ब्डा पथरी कोड हो रहा है। जो कुछ मैंने अभी तक पाया है, वह यूनिकोड λ
वर्णों से भरा है। तो मैंने यूनिकोड समर्थन जोड़ने का प्रयास करने के लिए सोचा।
लेकिन ctype<wchar_t>
ctype<char>
से पूरी तरह से अलग तरीके से काम करता है। कोई मास्टर टेबल नहीं है; चार विधियां do_is
x2, do_scan_is
, और do_scan_not
हैं। तो मैं इस किया था:
struct token_ctype : ctype<wchar_t> {
typedef ctype<wchar_t> base;
bool do_is(mask m, char_type c) const {
return base::do_is(m,c)
|| (m&space) && (base::do_is(punct,c) || c == L'λ');
}
const char_type* do_is
(const char_type* lo, const char_type* hi, mask* vec) const {
base::do_is(lo,hi,vec);
for (mask *vp = vec; lo != hi; ++ vp, ++ lo) {
if (*vp & punct || *lo == L'λ') *vp |= space;
}
return hi;
}
const char_type *do_scan_is
(mask m, const char_type* lo, const char_type* hi) const {
if (m & space) m |= punct;
hi = do_scan_is(m,lo,hi);
if (m & space) hi = find(lo, hi, L'λ');
return hi;
}
const char_type *do_scan_not
(mask m, const char_type* lo, const char_type* hi) const {
if (m & space) {
m |= punct;
while (* (lo = base::do_scan_not(m,lo,hi)) == L'λ' && lo != hi)
++ lo;
return lo;
}
return base::do_scan_not(m,lo,hi);
}
};
(फ्लैट प्रारूपण के लिए क्षमा याचना, पूर्वावलोकन टैब को अलग ढंग से बदल दिया।)
कोड रास्ता कम सुरुचिपूर्ण है। मैं बेहतर धारणा व्यक्त करता हूं कि केवल विराम चिह्न अतिरिक्त सफेद जगह है, लेकिन मूल में यह ठीक होगा कि मेरे पास classic_table
था।
क्या ऐसा करने का कोई आसान तरीका है? क्या मुझे वास्तव में उन सभी अधिभारों की आवश्यकता है? (परीक्षण दिखाया गया है do_scan_not
यहां अपरिहार्य है, लेकिन मैं अधिक व्यापक रूप से सोच रहा हूं।) क्या मैं पहले स्थान पर पहलुओं का दुरुपयोग कर रहा हूं? क्या ऊपर भी सही है? कम तर्क लागू करने के लिए बेहतर शैली होगी?
उदाहरण कोड के मामले में, आप योजना या LISP को देखना चाहेंगे, क्योंकि ये दोनों भाषाएं लैम्ब्डा कैलकुस में आधारित हैं। कुछ एलआईएसपी या स्कीम कोड होना चाहिए जिनके साथ आप खेल सकते हैं। –
सभी मानक कार्यात्मक भाषाएं अच्छी हैं, लेकिन मैं फॉर्म के कुछ कट-एंड-सूखे स्रोतों को ढूंढने की उम्मीद कर रहा था '(\ foo bar। Foo foo \ baz। ...' विज्ञापन मतली। मैं बाइनरी लैम्ब्डा के साथ खेलना चाहता हूं कैलकुस (http://en.wikipedia.org/wiki/Binary_lambda_calculus, http://homepages.cwi.nl/~tromp/cl/cl.html) गूढ़ कोड लिखने में समय बिताने के बजाय। लेकिन यह सवाल iostreams के बारे में है और व्यापक और संकीर्ण पात्रों के बीच लालित्य की असमानता। – Potatoswatter
आप क्या हैं? आप टोकनिंग पार्सर बनाने के लिए पहलुओं का दुरुपयोग कर रहे हैं। मुझे उम्मीद है कि यह भी भंगुर और धीमी दोनों हो। फिर फिर, यह संभवतः _the_ सीखने का सबसे सीधा तरीका है Iostreams के इन्स और आउट। हमें दिखाने के लिए धन्यवाद! – sehe