2009-06-25 22 views
6

http://www.cs.chalmers.se/Cs/Research/Language-technology/BNFC/मैं बीएनएफसी का उपयोग कर आईएनआई फ़ाइल व्याकरण को कैसे परिभाषित कर सकता हूं?

मैं कैसे लिखना चाहिए मेरी लेबल BNF BNFC मेरे लिए एक INI पार्सर उत्पन्न करने के लिए प्राप्त करने के लिए?

मुझे अभी तक ओजीओ मिल गया है!

entrypoints File ; 

comment "#" ; 

token ID (letter | digit | ["-_'"])+ ; 

Ini. File ::= [Section] ; 
Sect. Section ::= "[" ID "]" [Statement] ; 
Bind. Statement ::= ID "=" ID ; 

separator Statement "\n" ; 
terminator Section "" ; 

[name] 
#x = 10 
y = 20 

Parse Successful! 

[Abstract Syntax] 

Ini [Sect (ID "name") [Bind (ID "y") (ID "20")]] 

[Linearized tree] 

[name]y = 20 

[name] 
x = 10 
#y = 20 

Parse Successful! 

[Abstract Syntax] 

Ini [Sect (ID "name") [Bind (ID "x") (ID "10")]] 

[Linearized tree] 

[name]x = 10 

o__O मैं अटक हूँ ...

+0

आप अगला क्या करना चाहते हैं? ऐसा लगता है कि यह बहुत अधिक है ini फ़ाइलों को पार्स करने के लिए जरूरतों को पूरा करता है –

+0

वास्तव में नहीं क्योंकि उपर्युक्त व्याकरण खंडों के साथ केवल एक बाध्यकारी हो सकता है। मैं सभी प्रकार की आईएनआई फाइलों को पार्स करने में सक्षम होना चाहता हूं। –

उत्तर

5

मैं BNFC devs में से एक के लिए कहा और यहाँ उसका जवाब बोली:

ऐसी नई-पंक्तियों के रूप में

अंतरिक्ष पात्रों अच्छी तरह से टोकन में समर्थित नहीं हैं, क्योंकि BNFC एक कठिन वायर्ड lexer प्रकार "अंतरिक्ष" है । विचार यह है कि रिक्त स्थान "अच्छी तरह से व्यवहार" भाषाओं में अर्थ नहीं ले सकते हैं। उन प्रतिबंधों में से एक जिसने बीएनएफसी को इतना आसान बना दिया है ... लेकिन आपको प्रीप्रोसेसर का उपयोग करके इसे हल करने में सक्षम होना चाहिए, उदा। लाइन द्वारा इनपुट पार्स इनपुट ।


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

entrypoints File ; 

comment "#" ; 

token ID (letter | digit | ["-_'"])+ ; 

Ini. File ::= [Section] ; 
Sect. Section ::= "[" ID "]" [Statement] ; 
Bind. Statement ::= ID "=" ID ; 

separator Statement "//" ; 
terminator Section "//" ; 

पढ़ें:

[name] 
x = 10 
y = 20 

preprocess:

012,
[name]// 
x = 10// 
y = 20// 

पार्स:

Ini [Sect (ID "name") [Bind (ID "x") (ID "10"), Bind (ID "y") (ID "20")]] 

रूपांतरण करें:

          ↓      ↓ 
Ini [Sect (ID "name") [Bind (ID "x") (ID "0"), Bind (ID "y") (ID "0")]] 

लिखें:

[name]// 
x = 0// 
y = 0// 

postprocess:

[name] 
x = 0 
y = 0 

(चेक नहीं किया गया है, अगर यह काम करता है पता नहीं है, सिर्फ एक विचार देने के लिए !!)

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

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