मेरे पास एक सिंटैक्स परिभाषा है जो इस तरह दिखती है

keyword LegendOperation = 'or' | 'and';
syntax LegendData
    = legend_data: LegendKey '=' {ID LegendOperation}+ Newlines
    ;

मुझे इसे इस तरह से फंसाने की ज़रूरत है जो मुझे इस जानकारी को बनाए रखने की अनुमति देता है कि आईडी के लिए विभाजक 'या' या 'और' है, लेकिन मुझे दस्तावेज़ों में कुछ भी नहीं मिला कि क्या विभाजक को बरकरार रखा गया है और यदि यह कर सकता है इंपोड द्वारा उपयोग किया जा सकता है। प्रारंभ में, मैंने उस जानकारी को रखने की कोशिश करने के लिए नीचे जैसा कुछ किया।

syntax LegendData
    = legend_data_or: LegendKey '=' {ID 'or'}+ Newlines
    > legend_data_and: LegendKey '=' {ID 'and'}+ Newlines
    ;

जिस मुद्दे में मैं भाग लेता हूं वह यह है कि पाठ के तीन रूप हैं जिन्हें इसे पार्स करने में सक्षम होना चाहिए

. = Background
@ = Crate and Target
# = Crate or Wall

और जब यह पहली पंक्ति को पार्स करने का प्रयास करता है तो यह एक अस्पष्टता त्रुटि हिट करता है, जब इसे एक तत्व के साथ legend_data_or के रूप में पार्स करना चाहिए (शायद मैंने प्राथमिकताओं का उपयोग करने का तरीका गलत समझा)। ईमानदारी से, मैं उस दूसरे प्रारूप का उपयोग करने में सक्षम होना पसंद करूंगा, लेकिन क्या इसे स्पष्ट करने का कोई तरीका है?

या तो विभाजक को बनाए रखते हुए पहले सिंटैक्स को फंसाने का एक तरीका या दूसरे प्रारूप को असंबद्ध करने का एक तरीका मुझे इस मुद्दे पर मदद करेगा।

1
Clement Julia 14 जुलाई 2021, 16:03

1 उत्तर

सबसे बढ़िया उत्तर

मैं अंत में एक सुरुचिपूर्ण समाधान के साथ आने का प्रबंधन नहीं कर सका। दूसरों के साथ चर्चा करने से हम सबसे अच्छे तरीके से आ सकते थे

syntax LegendOperation
    = legend_or: 'or' ID
    | legend_and: 'and' ID
    ;

syntax LegendData
    = legend_data: LegendKey '=' ID LegendOperation*  Newlines
    ;

जो काम करता है और हमें विभाजक पर जानकारी को बनाए रखने की अनुमति देता है लेकिन उपयोग करने योग्य डेटाटाइप में बदलने के लिए पोस्ट-प्रोसेसिंग की आवश्यकता होती है।

1
Clement Julia 20 जुलाई 2021, 13:50