कुछ पृष्ठभूमि पहले। मैं वर्तमान में मोनैडिक पार्सर संयोजकों के बारे में कुछ सामान सीख रहा हूं। मैं से this paper (पी। 16-17) 'chainl1' समारोह हस्तांतरण करने के लिए कोशिश की, मैं इस समाधान के साथ आया था:गणना अभिव्यक्तियों में रिकर्सिव फ़ंक्शन
let chainl1 p op = parser {
let! x = p
let rec chainl1' (acc : 'a) : Parser<'a> =
let p' = parser {
let! f = op
let! y = p
return! chainl1' (f acc y)
}
p' <|> succeed acc
return! chainl1' x
}
मैं कुछ बड़े निवेश के साथ समारोह का परीक्षण किया और एक StackOverflowException मिला है। अब मैं सोच रहा हूं, क्या यह एक रिकर्सिव फ़ंक्शन को फिर से लिखना उचित है, जो कुछ गणना अभिव्यक्ति का उपयोग करता है, इस तरह से यह पूंछ रिकर्सन का उपयोग कर रहा है?
जब मैं गणना अभिव्यक्ति का विस्तार करता हूं, तो मैं नहीं देख सकता कि यह आम तौर पर कैसे संभव होगा।
let chainl1 p op =
let b = parser
b.Bind(p, (fun x ->
let rec chainl1' (acc : 'a) : Parser<'a> =
let p' =
let b = parser
b.Bind(op, (fun f ->
b.Bind(p, (fun y ->
b.ReturnFrom(chainl1' (f acc y))))))
p' <|> succeed acc
b.ReturnFrom(chainl1' x)))
यह उपयोगकर्ता कोड के माध्यम से रिकर्सन से छुटकारा पाता है, लेकिन यहां मेरे कार्यान्वयन में http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!1772.entry यह अभी भी पार्सर कार्यान्वयन के माध्यम से StackOverflows है। अब मैं 'निरंतरता वाले पार्सर्स' की जांच करने के लिए प्रेरित हो जाऊंगा ... – Brian
क्या FParsec http://www.quanttec.com/fparsec/ इसे संभालता है? – Brian
ब्रायन, मैंने आपके ब्लॉग श्रृंखला को सीखने के स्रोत के रूप में भी इस्तेमाल किया। यह बहुत मदद की। इस बीच मैंने माउ के जवाब ('seq') की तुलना मेरे पार्सर के साथ की। और मुझे लगता है कि मोनड में देरी विधि आयात है। लेकिन मैं वास्तव में नहीं जानता। FParsec 'while' का उपयोग करता है ... लेकिन मैं एक कार्यात्मक समाधान का उपयोग करना चाहता हूं: डी – PetPaulsen