2012-09-16 11 views
6

मैं वर्तमान में एक सॉफ्टवेयर घटक है कि इस तरह के रूप में गतिशील तार interprete करने में सक्षम होगा बनाने के लिए कोशिश कर रहा हूँ:कैसे नियमित अभिव्यक्ति के बिना एक स्ट्रिंग पार्स करने

%TO_LOWER%(%DELETE_WHITESPACES%("A SAMPLE TEXT")) 

कौन इस स्ट्रिंग में परिणाम होगा:

asampletext 

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

मेरे प्रश्न हैं:

  • इस तरह के एक उद्देश्य के लिए जिस तरह से regexp की तुलना में बेहतर पार्स करने lexing है /, या मैं सिर्फ regexp साथ जाने के लिए और है कि के बारे में भूल जाना चाहिए?
  • क्या ऐसी लाइब्रेरी जावा में पहले से मौजूद है?
  • क्या आप कुछ नमूना पार्सिंग/लेक्सिंग एल्गोरिदम दिखाते हुए कोई ट्यूटोरियल जानते हैं?

धन्यवाद!

+5

हां, एंटर एक समाधान है। आपको भाषा पार्सिंग के भारी उठाने के लिए रेगेक्स का उपयोग नहीं करना चाहिए। एक बहुत अच्छा उदाहरण स्टैक ओवरफ़्लो में है - http://stackoverflow.com/questions/1931307/antlr-is-there-a-simple-example –

+0

अक्सर, विशिष्ट उद्देश्यों के लिए ये कस्टम भाषाएं [डोमेन विशिष्ट भाषा] (http : //en.wikipedia.org/wiki/Domain-specific_language)। –

उत्तर

7

क्या इस उद्देश्य के लिए regexp से बेहतर lexing/पार्सिंग तरीका है, या क्या मुझे बस regexp के साथ जाना चाहिए और इसके बारे में भूल जाना चाहिए?

रेगेक्स एक रिकर्सिव व्याकरण व्यक्त नहीं कर सकते हैं, और आपके वाक्यविन्यास को एक पुनरावर्ती व्याकरण की आवश्यकता होगी। यदि यह मामला है, तो regexes बस समस्या को हल नहीं करेगा।

क्या ऐसी लाइब्रेरी जावा में पहले से मौजूद है?

यह कोई समस्या नहीं है कि लाइब्रेरी हल करेगी। लेक्सर और पार्सर उत्पन्न करने के लिए या तो इसे एक पार्सर जनरेटर सिस्टम (जैसे एंटर या जैवैक) का उपयोग करने की आवश्यकता है, या इसे स्क्रैच से वर्चुअल रूप से लिखें। पूर्व दृष्टिकोण शायद बेहतर है ... जब तक कि आप इस क्षेत्र को कवर करने वाले यूनी-स्तरीय विषय नहीं लेते हैं, या व्यापक पढ़ने के लिए तैयार होते हैं।

क्या आप कुछ नमूना पार्सिंग/लेक्सिंग एल्गोरिदम दिखाते हुए कोई ट्यूटोरियल जानते हैं?

एंटर और जैवैक दोनों में व्यापक ट्यूटोरियल सामग्री और उदाहरण हैं।

0

जब जावा-केवल बंधे नहीं होते हैं, तो आप किसी अन्य भाषा के पीईजी पार्सर या रीबोल का उपयोग कर सकते हैं (इसमें एक पार्स "बोली" है जो पीईजी समकक्ष है) - या आइकन या यूनिकॉन या अब ऑब्जेक्ट आइकन के लिए वापस वापस पहुंचें code.google.com/p/objecticon

यह एक खेदजनक क्षण था जब मुझे एहसास हुआ कि एमआईटी कर्ल वेब सामग्री भाषा (www.curl.com) ने उपयोगकर्ताओं के लिए regexp का चयन किया है, भले ही कर्ल में मैक्रोज़ है और पहुंच प्रदान करता है एक एएसटी के लिए।

सामान्य विषय: सामान्य रूप से पार्सर अभिव्यक्ति व्याकरण (पीईजी) और पैक्रेट पार्सिंग।

पर्ल उपयोग ने हमें पीसीआरई दिया है, तो हम क्या कर सकते हैं लेकिन आवश्यकता होने पर इसे टालने के लिए (एंटीलर और बाइसन हैं ...और इसमें कोई संदेह नहीं है कि उनके पास भी उनकी जगह है जहां वे आसानी से फिट होते हैं)

नोट: रीबोल, आइकन और कर्ल अभिव्यक्ति-आधारित भाषाएं हैं (आइकन में बैक-ट्रैकिंग सीमित है)।

अन्य बाहर एक रास्ता विकल्पों में शामिल हैं ओज और बुध (उत्तरार्द्ध कर सकते हैं उत्पादन erlang)

मैं pyPEG उपयोग नहीं कर रहा है क्योंकि मैं अजगर 2.6.6 तक ही सीमित रहा हूँ; पायथन पार्स लीप्ल अब समर्थित नहीं है - लेकिन 2.6

पायथन में पार्सिंग विकल्पों में YAPPS http://theory.stanford.edu/~amitp/yapps/ और कई अन्य शामिल हैं; ध्यान दें: pyparsing में स्थापित करने के लिए विफल रहता है कुछ अजगर env के

और स्काला/जावा के लिए इस पेग परियोजना है: https://github.com/sirthias/parboiled/wiki

आप खूंटी करने के लिए एक जावा समतुल्य और प्रति http://piumarta.com/software/peg/

CiteSeer पैर मिल सकता है राल्फ है पैकेट पार्सिंग और बुध (पीईजी पार्स पारा साइट के लिए Google: psu.edu) के लिए बेकेट लेख

एडवेंचर्स इनक्रैरी ब्लॉग में 3 ब्लॉग पोस्टों की एक श्रृंखला भी है।

संबंधित मुद्दे