मैं जीएनयू बाइसन 2.4.2 का उपयोग कर रहा हूं ताकि एक नई भाषा के लिए व्याकरण लिख सकूं और मैं एक प्रश्न पूछूं। जब मैं एक नियम निर्दिष्ट, मान लें:, तो मैं शासन पर एक बदलाव हैबाइसन: एक नियम में वैकल्पिक टोकन
statement : T_CLASS T_IDENT '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
उदाहरण के लिए
statement : T_CLASS T_IDENT T_EXTENDS T_IDENT_LIST '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
कहाँ (फ्लेक्स स्कैनर नियमों से):
"class" return T_CLASS;
"extends" return T_EXTENDS;
[a-zA-Z\_][a-zA-Z0-9\_]* return T_IDENT;
(और T_IDENT_LIST अल्पविराम से अलग पहचानकर्ताओं के लिए एक नियम है)।
क्या यह सब केवल एक नियम में निर्दिष्ट करने का कोई तरीका है, किसी भी तरह से "T_EXTENDS T_IDENT_LIST" को वैकल्पिक रूप से सेट करना? मैं पहले से ही
T_CLASS T_IDENT (T_EXTENDS T_IDENT_LIST)? '{' T_CLASS_MEMBERS '}' {
// create a node for the statement ...
}
साथ की कोशिश की है लेकिन बाइसन मुझे एक त्रुटि दे दी है।
धन्यवाद
यह केवल एक नियम लिखने का समाधान था। :) धन्यवाद! –
इसका एलएएलआर (1) होने के साथ कुछ लेना देना नहीं है, क्योंकि दोनों एलएएलआर (1) हैं। इसका कारण यह है कि इनपुट सिंटैक्स बीएनएफ ईबीएनएफ नहीं है। –
@ChrisDodd: क्षमा करें, लेकिन गलत है। यहां समस्या यह है कि जैसे ही उन्होंने लिखा था, उनके पार्सर को टीआईएलएलएसएस और टी_आईडीएनटी में तीन प्रतीकों को देखना होगा, यह देखने के लिए कि अगला प्रतीक '{'या T_EXTENDS था, जो देखने के लिए' कथन 'भिन्नता है। वह एलएएलआर (1) का उल्लंघन कर रहा है। ईबीएनएफ मेरे लिए एक पूर्ण लाल-हेरिंग जैसा दिखता है - मुझे कुछ भी नहीं दिखता है जो प्रश्न में कहीं भी ईबीएनएफ जैसा दिखता है। –