में एक शिफ्ट-कम संघर्ष को हल करने में समस्या Irony के साथ मैं एक छोटा पार्सर लिखने की कोशिश कर रहा हूं। दुर्भाग्य से मुझे "शिफ्ट-कम संघर्ष" मिलता है। ग्रामर मेरे मजबूत बिंदु नहीं हैं, और मुझे केवल यह एक छोटी सी काम करने की आवश्यकता है। यहाँ कम व्याकरण कि त्रुटि पैदा करता है:मेरे व्याकरण
ExpressionTerm := "asd"
LogicalExpression :=
ExpressionTerm |
LogicalExpression "AND" LogicalExpression |
LogicalExpression "OR" LogicalExpression
क्या करता है "पाली-कम कर संघर्ष" मतलब और मैं इसे कैसे हल कर सकते हैं? मैं इकट्ठा करता हूं कि इसका मतलब है कि मेरा व्याकरण संदिग्ध है, लेकिन मैं यह देखने के लिए पर्याप्त रूप से अपने तर्क को मोड़ नहीं सकता।
जोड़ा गया: स्पष्ट करने के लिए - "asd" बस एक शाब्दिक स्ट्रिंग "asd" है। इसलिए मैं उम्मीद होती है कि निम्न भाव इस व्याकरण द्वारा पार्स किए जाते हैं:
asd
asd AND asd
asd AND asd OR asd
asd OR asd AND asd OR asd
जोड़ा गया 2: कहने के लिए, व्याकरण की जड़ LogicalExpression
है भूल।
जोड़ा गया 3: आह, मुझे मिल गया!
(asd AND asd) OR asd
asd AND (asd OR asd)
लेकिन मैं यह कैसे हल कर सकते हैं: अस्पष्टता क्योंकि
asd AND asd OR asd
की तरह एक अभिव्यक्ति दो अलग तरीके से व्याख्या की जा सकती है? ठीक है, मैं एक और या OR को दूसरे की तुलना में मजबूत कर सकता हूं (मैंने वैसे भी किया था)। लेकिन अब मैं देखता हूं कि त्रुटि तब भी दिखाई देती है जब केवल एक ऑपरेटर होता है। दूसरे शब्दों में, यह भी एक ही त्रुटि पैदा करता है:
LogicalExpression := "asd" | LogicalExpression "OR" LogicalExpression
इस मामले में मैं यह चाहता हूँ:
asd OR asd OR asd
यह करने के लिए पार्स किया जा सकता:
(asd OR asd) OR asd
गैर क्या है ऐसा करने का अस्पष्ट तरीका?
जोड़ा गया 4: समझ गया!
LogicalExpression1 := LogicalExpression1 "OR" LogicalExpression2 | LogicalExpression2
LogicalExpression2 := LogicalExpression2 "AND" LogicalExpression3 | LogicalExpression3
LogicalExpression3 := "NOT" LogicalExpression4 | LogicalExpression4
LogicalExpression4 := "asd" | "(" LogicalExpression1 ")"
इस रूप में नहीं-> and- ऑपरेटर पूर्वता> या के साथ सभी बूलियन भाव पार्स करते। "asd" को आपकी शर्तों के लिए अभिव्यक्ति के साथ प्रतिस्थापित किया जा सकता है।
हे, यह सोचने के लिए, मैं इस याद करने के लिए शुरू कर आ
ExpressionTerm
में प्रतिस्थापित किया जा सकता है और यह भीLogicalExpression
व्याकरण के नियमों समतल विश्वविद्यालय में मेरे दिनों से पैटर्न। : डी –