parsing - Problem with sablecc on production rule of the form prod = (expr | expr')* -


  प्रोडक्शन प्रोग्राम = सीएलएस *; Cls = clsdef नाम openbrace clsdata समापन ब्रेस; Clsdata = (clsfield | clsmethod) *; Clsfield = [variabletype]: नाम [variablename]: अर्द्ध नाम; Clsmethod = [वापसी प्रकार]: नाम [methodname]: नाम openmethodbrace closingmethodbrace ओपनब्रेस समापन ब्रेस;   

समस्या में रहता है

  clsdata = (clsfield | clsmethod) *;   

अगर मैं clsdata से

  clsdata = clsfield * सेट करता हूं;   

या

  clsdata = clsmethod *;   

यह ठीक काम करता है, हालांकि, जैसा कि आप कल्पना कर सकते हैं, इसका मतलब यह नहीं है कि मैं इसके लिए क्या करना चाहता था मैं चाहता हूँ कि एक क्लास दोनों तरीकों और क्षेत्रों (किसी विशेष क्रम में नहीं!) के लिए अनुमति दें।

तो मेरा सवाल है कि मुझे clsdata को कैसे परिभाषित करना चाहिए ताकि मैं नहीं त्रुटियों। मैं पुनरावर्ती विकल्प के बारे में सोच सकता हूं, लेकिन मैं इसे यथासंभव अधिक स्वच्छ रखना चाहूंगा!

धन्यवाद

clsdata = (clsfield | clsmethod) *;

SableCC के पास एक EBNF जैसा वाक्यविन्यास है, लेकिन इस प्रकार का समर्थन नहीं करता व्याकरण नियम का जैसा कि आपने पहले ही किया है, गैर-टर्मिनल विकल्प clsfield और clsmethod को अपने स्वयं के उत्पादन में refracted किया जाना है।

अभी तक मैं हूं यह सुनिश्चित करने के लिए यह सबसे अच्छा तरीका है

यदि आप में से किसी को भी देखें तो आप देखेंगे कि 'क्लास सदस्यों' को परिभाषित करने का मानक तरीका है। यद्यपि आप शायद clsmembers :

  प्रोडक्शंस प्रोग्राम = cls * को निकालकर अपने व्याकरण को सरल कर सकते हैं; Cls = clsdef नाम openbrace clsmember * समापन ब्रेस; Clsmember = {clsfield} clsfield | {Clsmethod} clsmethod; Clsfield = [variabletype]: नाम [variablename]: अर्द्ध नाम; Clsmethod = [returntype]: नाम [methodname]: नाम openmethodbrace closingmethodbrace ओपनब्रेस समापन ब्रेस    

Comments