2012-04-19 12 views
7

बनाने के लिए मैं एक समस्या इस के समान है:OCaml पार्स स्ट्रिंग पेड़

How to print a tree structure into a string fast in Ocaml?

लेकिन एक विपरीत तरह से, मैं पहले से ही एक स्ट्रिंग है और इसे वापस पार्स करने के लिए एक पेड़ होना चाहता हूँ कि।

उदाहरण के लिए, मैं

type expr = 
    Number of int 
|Plus of expr*expr 
|Prod of expr*expr 

है और मैं तो मैं 1 + 2 * 3 + 4 की तरह एक स्ट्रिंग (ऊपर के लिंक से थोड़ा अलग, मान लें *+ की तुलना में अधिक procedence है)
है मेरी परिणाम चाहते हैं एक expr प्रकार Prod(Plus(1,2), Plus(3, 4))

अगर यह मेरी समस्या करने का एक तरीका है मैं एक और लिंक है कि इस बारे में बात करते हैं, लेकिन यकीन है कि नहीं मिला होने के लिए:

Parsing grammars using OCaml

कृपया कुछ विचार साझा करें, धन्यवाद।

उत्तर

4

यह एक मानक पार्स समस्या है: में पेश आ रही सभी compilers/दुभाषियों/आदि ... इस समस्या को हमला करने के लिए, जो मूल रूप से निम्नलिखित के लिए नीचे उबाल तरीकों की एक संख्या हैं:

  • अपनी खुद लिखें पुनरावर्ती वंश पार्सर
  • एक पार्सर एक पार्सर जेनरेटर

यह क्या आप पर काम कर रहे की तरह लगता है से उत्पन्न का उपयोग करें कुछ जहां एक सार सिंटेक्स पेड़ ("पेड़" आप समस्या में उल्लेख) की जरूरत है। आप ऐसी चीजों को पूरा करने के लिए आसानी से ओकैमल पार्सर जेनरेटर का उपयोग कर सकते हैं, एक अच्छा Menhir. होगा, जबकि आप मेनिर या ओकंपलीक जैसे टूल का उपयोग करके अपने स्वयं के पार्सर भी लिख सकते हैं, यह आपके लिए ऐसा करने के लिए एक बहुत ही बहुमुखी और त्वरित समाधान है (इसकी तुलना में एक साधारण रिकर्सिव वंश पार्सर में गैर एलएल (1) चीजों से निपटने की जबरदस्ती के साथ गड़बड़ाना)।

4

OCaml वितरण ocamlyacc वास्तव में आप क्या जरूरत है (अन्य उपकरण मौजूद हैं, के रूप में क्रिस्टोफ़र ने बताया) करने के लिए एक उपकरण शामिल हैं।

ocamlyacc का एक अच्छा विवरण के लिए, उदाहरण के लिए this tutorial देख सकते हैं और related example जहां एक छोटे अभिव्यक्ति भाषा के लिए एक पार्सर (आपसे मिलते-जुलते) परिभाषित किया गया है।