2012-05-07 22 views
13
समर्थित नहीं

Parsec.Expr.buildExpressionParser के लिए दस्तावेज़ का कहना है:Parsec.Expr दोहराया उपसर्ग/पोस्टफिक्स ऑपरेटर

उपसर्ग और पोस्टफ़िक्स ही पूर्वता के ऑपरेटरों केवल एक बार हो सकता है (यानी -2 यदि अनुमति नहीं है - उपसर्ग है नकारना)।

और वास्तव में, यह, मुझे काट भाषा मैं पार्स करने के लिए कोशिश कर रहा हूँ का उपसर्ग और पोस्टफ़िक्स ऑपरेटरों की मनमानी पुनरावृत्ति (**a[1][2] की तरह एक सी अभिव्यक्ति के बारे में सोच) की अनुमति देता है के बाद से किया गया है।

तो, Parsec क्यों इस प्रतिबंध को बनाते हैं, और मैं इसके आसपास कैसे काम कर सकता हूं?

मुझे लगता है कि मैं अपने उपसर्ग/पोस्टफिक्स पार्सर्स को term पार्सर में नीचे ले जा सकता हूं क्योंकि उनके पास सबसे ज्यादा प्राथमिकता है।

यानी

**a + 1 

(*(*(a)))+(1) 

लेकिन क्या के रूप में पार्स किया गया है मैं अगर मैं के रूप में

*(*((a)+(1))) 

है कि मैं क्या चाहता हूँ buildExpressionParser था कि यह पार्स करने के लिए चाहता था कर सकता था, मैं मेज में ऑपरेटरों के आदेश को फिर से व्यवस्थित कर सकता था।

नोट एक बेहतर समाधान के लिए here देखें

उत्तर

13

मैं इसे अपने आप chainl1 का उपयोग करके हल:

prefix p = Prefix . chainl1 p $ return  (.) 
postfix p = Postfix . chainl1 p $ return (flip (.)) 

ये combinators एक op पार्सर कि हमेशा सफल होता है, और बस के साथ chainl1 का उपयोग कार्यों लौटे तैयार करता term पार्सर बाएं से दाएं या दाएं से बाएं क्रम में। इनका उपयोग buildExprParser तालिका में किया जा सकता है; जहाँ आप इस किया होता:

exprTable = [ [ Postfix subscr 
       , Postfix dot 
       ] 
      , [ Prefix pos 
       , Prefix neg 
       ] 
      ] 

अब आप ऐसा करते हैं: इस तरह से

, buildExprParser अभी भी ऑपरेटर पूर्वता सेट करने के लिए इस्तेमाल किया जा सकता है, लेकिन अब केवल एक ही Prefix या Postfix ऑपरेटर देखता है प्रत्येक प्राथमिकता पर। हालांकि, उस ऑपरेटर के पास जितनी प्रतियां हो सकती हैं उतनी प्रतिलिपि बनाने की क्षमता है, और एक फ़ंक्शन लौटाता है जो ऐसा लगता है कि केवल एक ही ऑपरेटर था।

+0

मुझे आपका उत्तर बहुत उपयोगी पाया गया, लेकिन मैं एक और समस्या में भाग गया, विस्तृत [यहां] (http://stackoverflow.com/questions/11174775), और यदि आप एक नज़र डाल सकते हैं, तो मैं इसकी सराहना करता हूं मौका है कि आपके पास समाधान है। –

+0

उपयोगी उत्तर के लिए धन्यवाद। मुझे इस समस्या के सामान्यीकरण के साथ कुछ कठिनाइयों का सामना करना पड़ रहा है। यदि आपके पास कोई सुझाव है, तो उनका बहुत स्वागत होगा (देखें http://stackoverflow.com/questions/33214163/parsec-expr-repeated-prefix-with-different-priority/33217888#33217888) – BartBog

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