2016-11-04 15 views
9

मैं अपने प्रोजेक्ट में std::regex साथ काम कर रहा हूँ के निर्माण। जब से मैं compiletime पर regexes जानते हैं, और एक regex के निर्माण (2^मी) हे में है, जहां मीटर सी regex की लंबाई, मैं compiletime में regex का निर्माण करना अच्छा लगेगा। std :: regex के साथ यह संभव है? (मुझे ऐसा लगता है न, क्योंकि मैं basic_regex के लिए किसी भी constexpr ctor देख न) और अगर नहीं वहाँ एक regex पुस्तकालय जो निर्माण compiletime पर मेरे regexesCompiletime std :: regex

+0

व्यक्तिगत रूप से मैं संकलन समय, स्टार्टअप समय और रनटाइम के बीच अंतर करता हूं। (तकनीकी रूप से स्टार्टअप समय रनटाइम है)। मैं स्टार्टअप समय पर अपना 'रेगेक्स' बनाता हूं। – knivil

उत्तर

5

हम अलग करने के लिए की जरूरत है सकते हैं कार्यक्रम संकलन और regex संकलन के बीच। उत्तरार्द्ध वास्तव में एक प्रोग्राम रनटाइम पर किया जाता है और इसका मतलब है कि विभिन्न तारों के खिलाफ तेजी से मेल खाने के लिए उपयुक्त एक बड़ी लेकिन कुशल संरचना (राज्य मशीन) का निर्माण करना।

C++ 11 regex, regex संकलन किया जाता है जब आप तार का एक regex वस्तु का निर्माण

: आप regex_match में इस तरह के एक वस्तु, regex_search, regex_replace का उपयोग करते हैं

std::regex e (your_re_string); 

, आप काम कर का लाभ लेने पहले से संकलित नियमित अभिव्यक्ति के साथ। तो, अगर आप जानते हैं कि कार्यक्रम में अपने स्ट्रिंग समय संकलन, सबसे अच्छी बात आप गति के लिए क्या कर सकते हैं प्रोग्राम रन प्रति सिर्फ एक बार एक इसी regex वस्तु का निर्माण, मान लीजिए कि वह कहीं प्रारंभकर्ता साथ एक स्थिर चर के रूप में घोषित करने के लिए है:

static std::regex e (your_constant_re_string); 

शायद यह वही है जो आप चाहते हैं।

regex_match के कुछ रूप, ... फ़ंक्शन इसके बजाय नियमित अभिव्यक्ति तारों के साथ तुरंत काम कर सकता है। लेकिन कृपया ध्यान दें कि यद्यपि यह आमतौर पर प्रोग्रामर के लिए अधिक सुविधाजनक होता है, यदि आप उनका उपयोग करते हैं, तो प्रदर्शन हर बार ऐसे फ़ंक्शन को संकलित करने के लिए रेगेक्स संकलन करने का सामना करेगा।

पीएस यदि आप वास्तव में, वास्तव में, प्रोग्राम प्रोग्राम संकलन समय में संकलित करना चाहते हैं, तो आप (1) बाहरी रेगेक्सपी/लेक्सर कंपाइलर सॉफ़्टवेयर (जैसे https://github.com/madelson/PrecompiledRegex.Fody, फ्लेक्स https://en.wikipedia.org/wiki/Flex_(lexical_analyser_generator) या इसी तरह) का उपयोग करें (2) std::regex ऑब्जेक्ट संकलित करें , फिर सीरियलाइज करें और सी ++ इनपुट में कनवर्ट करें (जो वास्तव में (1) का एक DIY संस्करण है) लेकिन मुझे पूरा यकीन है कि यह केवल प्रोग्राम के प्रति एक रेगेक्स संकलन को सहेजने के लिए नहीं चाहता था। शायद जब तक कि आप वास्तव में भारी अभिव्यक्ति नहीं है।

+2

आपके उत्तर के लिए धन्यवाद। लेकिन संकलन पर रेगेक्स के लिए एनएफए/डीएफए बनाना संभव नहीं है? C++ 11 और constexpr के साथ यह संभव होना चाहिए मुझे लगता है। – Exagon

+0

सैद्धांतिक रूप से हां लेकिन आपको कॉन्सएक्सप्रस्ट्रक्टर लिखना चाहिए या इसे जोड़ने के लिए प्रतीक्षा करें। 2014 तक, सी ++ 14 या सी ++ 17 में इसकी अपेक्षा की गई थी। फिर भी मुझे यकीन नहीं है कि यह जोड़ा गया था। यदि नहीं, तो आप इसका योगदान कर सकते हैं। यह तकनीकी काम है लेकिन ऐसा हो सकता है कि कुछ ऑपरेटर अभी तक constexpr का समर्थन नहीं करता है। कि सी ++ मानकों हमेशा आगे उनके क्रियान्वयन :) –

+0

चल रहा है मैं, मैं बस एक समारोह "storeAsCPPSource (स्थिरांक regex और)" लिखते थे और उस संकलित करता है तथा भंडार वस्तु एक सरल अनुप्रयोग बनाने के इस तरह के एक संकलक चाहता था याद रखें। –

3

हाना दुसुकोवा "Regular Expressions Redefined in C++” द्वारा एक सीपीपीकॉन 2017 बिजली की बात रेगेक्स स्ट्रिंग्स के लिए उपयोगकर्ता द्वारा परिभाषित शाब्दिक और मिलान करने वाले फ़ंक्शन को उत्पन्न करने के लिए संकलन-समय दृष्टिकोण का उपयोग करके संकलित समय नियमित अभिव्यक्तियों के दृष्टिकोण का वर्णन करती है। code is on GitHub, लेकिन इस समय अभी भी प्रयोगात्मक और अत्यधिक तरल पदार्थ है। तो ऐसा लगता है कि संकलन-समय regexes शायद कुछ समय जल्द ही दिखाई देने जा रहे हैं।