Я пишу компилятор для университетского проекта, и я хотел бы преобразовать свое абстрактное дерево синтаксиса в график потока управления (CFG).Формально построение диаграммы потока управления
Im думает, что узлы (V
) в CFG должны быть узлами из AST. Я знаю, алгоритмический, как построить множество ребер (G=(V,E)
), но Im трудное время написания процесса немного более формально
Я создал этот шаблон стиля Scala соответствия (Псевдо):
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
}
Какой должны соответствовать структуру AST, как:
(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 -> _|_
}
Кто есть какие-либо намеки на то, как сделать это немного более формально, чем Скала «псевдокод»?
Im думая что-то индуктивное, как:
e[[ IF(_,b1,b2) ]] = (if -> b1) + (if -> b2) \cup e[[ b1 ]] \cup e[[ b2 ]]
e[[ b1, b2 ]] = e[[b1]] \cup e[[b2]]
(выше будет дать только дерево, а не график, хотя нет края от края тогдашней ветви к следующему утверждению, например.)
EDIT :
Я читал kiama and dataflows для scala, и мне нравится подход «succ» и «follow», который они используют. Тем не менее, мне сложно переварить это более формальное описание, главным образом из-за отличного childAttr
, s.next
, который скрывает некоторые детали, которые становятся уродливыми, когда я пытаюсь его формально указать.
EDIT2:
Я прошел через Дракона книги и «Современные Compiler внедрения в ML», а также некоторые другие вещества из Learning to write a compiler и некоторых/большинства упоминает поток данных и поток управления, но не касается многое, КАК создать CFG любым формальным способом.
EDIT3:
Via Kiama автора, Associate Professor Dr. Tony Sloane я получил некоторые additional book references to look up.
Насколько я могу видеть, «способ сделать это» в соответствии с этими книгами основан на «за утверждение» программы больше, чем на АСТ и основан на базовых блоках. Тем не менее!
Надеюсь, вы не против, что я добавил «scala» в теги. –
@ Randall Совсем нет :) Я почти сделал это сам – svrist