मैं विश्वविद्यालय प्रोजेक्ट के लिए एक कंपाइलर लिख रहा हूं, और मैं अपने सार सिंटेक्स ट्री को एक नियंत्रण प्रवाह ग्राफ (सीएफजी) में बदलना चाहता हूं।औपचारिक रूप से नियंत्रण प्रवाह ग्राफ
मुझे लगता है कि सीएफजी में नोड्स (V
) एएसटी से नोड्स होना चाहिए। मैं एल्गोरिदम रूप से पता बढ़त सेट (G=(V,E)
) के निर्माण के लिए कैसे, लेकिन मैं एक कठिन समय प्रक्रिया में थोड़ा और अधिक औपचारिक रूप से लिखने के लिए होने
मैं इस स्केला शैली से मेल खाते पैटर्न (छद्म) बना लिया है:
def edges(n:Node)(nestedin_next: Node) : List[(Node,Node)] =
n match {
case (c_1 :: c_2::tl) => (c1,c2) :: edges(c2::tl)(nestedin_next)++
edges(c_1)(c_2)//recurse
case c_1 :: Nil => (c_1,nestedin_next)::Nil
case [email protected] IF(_,c1,c2) => (i,c1)::(i,c2)::edges(c1)(nestedin_next)++
edges(c2)(nestedin_next)
case _ => Nil
}
कौन सा की तरह एक एएसटी संरचना से मेल खाना चाहिए:
(IF(1,
ASSIGN(x,1), // ia1
ASSIGN(x,2) // ia2
) :: // i1
ASSIGN(y,2) :: // a1
ASSIGN(z,ADD(x,y)) :: //a2
IF(z,
RET(z), //i2r1
assign(z,0):: // i2a1
ret(z) // i2r2
) :://i2
Nil
)
और की तरह एक edgeset प्रदान करते हैं:
{ i1 -> ia1,
i1 -> ia2,
ia1 -> a1,
ia2 -> a1,
a1 -> a2,
a2 -> i2,
i2 -> i2r1
i2-> i2a1
i2a1 -> i2r2
i2r2 -> _|_
i2r1 -> _|_
}
किसी को भी कैसे स्केला "स्यूडोकोड" की तुलना में अधिक औपचारिक रूप से इस एक सा करने के लिए पर किसी भी संकेत मिल गया?
इम आगमनात्मक तरह कुछ सोच:
e[[ IF(_,b1,b2) ]] = (if -> b1) + (if -> b2) \cup e[[ b1 ]] \cup e[[ b2 ]]
e[[ b1, b2 ]] = e[[b1]] \cup e[[b2]]
(ऊपर केवल एक पेड़ और एक ग्राफ हालांकि नहीं देना होगा उदाहरण के लिए अगले बयान के तत्कालीन शाखा के किनारे से कोई बढ़त।)
संपादित करें :
मैं स्केल के लिए kiama and dataflows पर पढ़ रहा हूं, और मुझे "succ" और "निम्न" दृष्टिकोण पसंद है। फिर भी, मुझे अधिक औपचारिक वर्णन में उबालने में कठिनाई हो रही है, ज्यादातर निफ्टी childAttr
, s.next
की वजह से, जो कुछ औपचारिक रूप से निर्दिष्ट करने का प्रयास करते समय बदसूरत हो जाता है।
EDIT2:
मैं के माध्यम से ड्रैगन बुक और "एमएल में आधुनिक संकलक कार्यान्वयन" के रूप में अच्छी Learning to write a compiler से अन्य सामग्री में से कुछ और कुछ/सबसे उल्लेख डाटा प्रवाह और नियंत्रण प्रवाह, लेकिन कभी छूता है के रूप में किया गया है किसी भी औपचारिक तरीके से सीएफजी बनाने के तरीके पर बहुत कुछ।
EDIT3:
वाया Kiama लेखक, Associate Professor Dr. Tony Sloane मैं कुछ additional book references to look up प्राप्त।
जहां तक मैं उन पुस्तकों के अनुसार "इसे करने का तरीका" देख सकता हूं, एएसटी से अधिक कार्यक्रम के "प्रति कथन" पर आधारित है और मूल ब्लॉक्स पर आधारित है। फिर भी महान इनपुट!
मुझे आशा है कि आपको कोई फर्क नहीं पड़ता कि मैंने टैग में "स्कैला" जोड़ा है। –
@ रैंडल बिल्कुल नहीं :) मैंने लगभग इतना किया है कि मेरा स्वयं – svrist