पूरी तरह अकादमिक अभ्यास के रूप में, मैं एएनटीएलआर या लेक्स/वाईएसी का उपयोग किये बिना स्क्रैच से एक रिकर्सिव वंश पार्सर लिख रहा हूं।स्क्रैच से रिकर्सिव वंश पार्सर कैसे लिखें?
मैं एक साधारण कार्य लिख रहा हूं जो गणित अभिव्यक्तियों को उनके समकक्ष एएसटी में परिवर्तित करता है।
// grammar
type expr =
| Lit of float
| Add of expr * expr
| Mul of expr * expr
| Div of expr * expr
| Sub of expr * expr
// tokens
type tokens =
| Num of float
| LParen | RParen
| XPlus | XStar | XMinus | XSlash
let tokenize (input : string) =
Regex.Matches(input.Replace(" ", ""), "\d+|[+/*\-()]")
|> Seq.cast<Match>
|> Seq.map (fun x -> x.Value)
|> Seq.map (function
| "+" -> XPlus
| "-" -> XMinus
| "/" -> XSlash
| "*" -> XStar
| "(" -> LParen
| ")" -> RParen
| num -> Num(float num))
|> Seq.to_list
तो, tokenize "10 * (4 + 5) - 1"
रिटर्न निम्न टोकन धारा: मैं निम्नलिखित है
[Num 10.0; XStar; LParen; Num 4.0; XPlus; Num 5.0; RParen; XMinus; Num 1.0]
इस बिंदु पर, मैं ऑपरेटर पूर्वता के संबंध में इसकी एएसटी को टोकन धारा मैप करने के लिए करना चाहते हैं:
Sub(
Mul(
Lit 10.0
,Add(Lit 4.0, Lit 5.0)
)
,Lit 1.0
)
हालांकि, मैं एक खाली चित्रण कर रहा हूं। मैंने कभी भी खरोंच से एक पार्सर नहीं लिखा है, और मैं सिद्धांत में भी कैसे शुरू करना है, यह भी नहीं जानता।
मैं अपने प्रतिनिधि एएसटी को टोकन स्ट्रीम कैसे परिवर्तित करूं?
क्या एक संयोग है! मैं सिर्फ एफ # में एक पार्सर लिखने के लिए प्रोजेक्ट बना रहा था! अंतिम संदर्भ = ड्रैगन बुक। –
http://stackoverflow.com/a/2336769/120163 –