2015-11-05 11 views
6

मैं वर्तमान में वाक्य रचनात्मक विश्लेषण सीख रहा हूं।मेटाग्राम कैसे बनाएं?

A ⇒ A '+' C | C ; 
C ⇒ C * Q ; 
C ⇒ Q ; 
Q ⇒ a | b | 'A' | "B" | "(" A ")" | <num> ; 
<num> ⇒ <Signed Int> | Float ; 
<Signed Int> ⇒ Signe Int ; 
Signe ⇒ '-' | '+' | ~eps~ 
<Int> ⇒ Digit Int | Digit ; 
Digit ⇒ '1' | '2' | '3' | '4' | 5 | 6 | 7 | 8 | "9" | "0" ; 
Float ⇒ Int '.' Int ; 

कहाँ <> अनदेखी कर रहे हैं (अर्थात <int>int के समान है), सिंगल/डबल उद्धरण, एक स्ट्रिंग के लिए कर रहे हैं ~eps~ एप्सिलॉन के लिए है: मैं एक metagrammar जो उस विशेष व्याकरण उत्पन्न कर सकता है बनाने की कोशिश कर रहा हूँ। बाकी सब कुछ एक प्रतीक माना जाता है (चाहे वह टर्मिनल या nonterminal है)।

वर्तमान में मैं कुछ इस तरह है:

S ⇒ left "⇒" right ";" | ε 
left ⇒ symb | "<"symb">" 
right ⇒ QP 
Q ⇒ symb | """symb""" | "'"symb"'" | "<"symb">" | ε 
P ⇒ symb | '|' Q | ε 

लेकिन यह मेरे लिए इतना गलत लगता है और मैं क्या करने के लिए क्या पर इतना यकीन नहीं है। मेटाग्रामर को निर्धारित करने के लिए कोई तरीका है? मैं इस बारे में कैसे जा सकता हूं?

+0

'साइन ⇒' - 'के साथ लाइन के अंत में '' 'होना चाहिए। '+' | ~ Eps ~ '? –

उत्तर

2

खराब शुरुआत नहीं है।

letter = "A" | "B" | ... | "Z" ; 
symb = letter symb | letter ; 

लेकिन अपने metagrammar केवल अनुमति देता है एक व्याकरण नियम: आप वास्तव में symb परिभाषित करना चाहिए। अनेक नियम अनुमति देने के लिए, मुझे लगता है कि आप लिखना चाहते हैं:

S = R S | ε ; 
R = left "⇒" right ";" 

तुम बहुत उपकरण है कि खुद को और अन्य व्याकरण पर कार्रवाई करने के metagrammars का उपयोग करने में रुचि हो सकती है। इस छोटे पेपर के बारे में MetaII, (तैयार?) इस मुद्दे पर चर्चा करता है और दिखाता है कि इसका उपयोग करके कंपाइलर्स कैसे बनाएं। यह एक आश्चर्यजनक पेपर है, और यह आपके दिमाग को मोड़ देगा (एक अच्छे तरीके से!)

जब आप इस पेपर के साथ होते हैं, तो आपको बहुत मेटाग्रामर्स के साथ सहज महसूस होगा। (मैंने 1 9 70 के दशक के आरंभ में इस पीठ का उपयोग करके कंपाइलर्स बनाने के लिए सीखा)।

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