xml parsing - साइलन/फ्लेक्स में सरल एक्सएमएल पार्सर




xml-parsing bison (2)

आपकी आवश्यकताओं के लिए, मुझे लगता है कि yax सिस्टम अच्छी तरह से काम करेगा README से:

Yax प्रोजेक्ट का लक्ष्य YACC (ग्नू बायसन वास्तव में) के उपयोग को XML दस्तावेज़ों को पार्स / प्रोसेस करने की अनुमति देना है।

उपर्युक्त लक्ष्य को प्राप्त करने के लिए सॉफ्टवेयर का प्रमुख हिस्सा एक पुस्तकालय प्रदान करना है जो XML दस्तावेज़ से एक्सएमएल लेक्सिकल टोकन स्ट्रीम का उत्पादन कर सकता है।

एक्सएमएल दस्तावेज़ को पार्स और प्रोसेस करने के लिए टोकन को एक बाइसन व्याकरण के लिए फ़ीड करने के लिए yylex () का एक उदाहरण बनाने के लिए इस स्ट्रीम को लपेटा जा सकता है।

स्ट्रीम के साथ एक बाइसन व्याकरण का उपयोग करना, कम से कम निम्न प्रकार की गतिविधियों को लेना संभव है।

  1. XML दस्तावेज़ मान्य करें,
  2. आंतरिक डेटा संरचनाओं को बनाने के लिए सीधे XML दस्तावेज़ों को पार्स करें,
  3. डोम पेड़ का निर्माण

मैं साधारण एक्सएमएल पार्सर को बायसन / फ्लेक्स का उपयोग करना चाहूंगा मुझे सत्यापन, टिप्पणियां, तर्क, केवल <tag>value</tag> , जहां मान संख्या, स्ट्रिंग या अन्य <tag>value</tag>

उदाहरण के लिए:

<div>
  <mul>
    <num>20</num>
    <add>
      <num>1</num>
      <num>5</num>
    </add>
  </mul>
  <id>test</id>
</div>

यदि यह मदद करता है, तो मुझे पता है कि हो सकता है कि सभी टैग के नाम पता है। मुझे पता है कि दिए गए टैग द्वारा कितने उप-टैग को पकड़ किया जा सकता है क्या बीज़न पार्सर बनाना संभव है, जो ऐसा कुछ करेगा:

- new Tag("num", 1)           // tag1
- new Tag("num", 5)           // tag2
- new Tag("add", tag1, tag2)  // tag3
- new Tag("num", 20)          // tag4
- new Tag("mul", tag4, tag3)
...
- root = top_tag

टैग और उप-टैग की संख्या:

  • संख्या: 1 (केवल मान)
  • str: 1 (केवल मान)
  • जोड़ें | उप | मुल | div: 2 (num | str टैग | num | str | tag)

क्या आप ऊपर दिए गए एएसटी को बनाने में सक्षम होने के लिए व्याकरण के साथ मेरी सहायता कर सकते हैं?


मुझे नहीं लगता है कि यह एक XML उपकरण बनाने के लिए उपयोग करने का सबसे अच्छा उपकरण है अगर मुझे यह काम करना है, तो मैं इसे हाथ से कर दूँगा

फ्लेक्स कोड में होगा: इस उदाहरण में NUM मैच पूर्णांक। एसटीआर मैच किसी भी स्ट्रिंग से मेल खाता है जिसमें '<' या '>' शामिल नहीं है बंद सभी समापन टैग मैच। स्टार्ट मैच शुरू टैग

<\?.*\?> { ;} 
<[a-z]+> { return START; }
</[a-z]+> { return STOP; }
[0-9]+ { return NUM; }
[^><]+ { return STR; }

बाइसन कोड ऐसा दिखेगा

%token START, STOP, STR, NUM
%%
simple_xml : START value STOP
;
value : simple_xml 
| STR
| NUM
| value simple_xml
;




flex-lexer