Часть II. Формальное описание языков программирования ( Формальная спецификация формальных языков ) Приложение. Атрибутная грамматика языка SIL. Генерация кода
Простой императивный язык (SIL) 1 ::= skip | := | 2 ; 3 | if then 2 else 3 | while do 2 1 ::= | | | | 2 * 3 1 ::= true | false | 1 = 2 | 1 2 | ¬ 2 | 2 3 | 2 3
Генерация кода операторов (1) ::=.code :=.code.labin := 0 1 ::= 2 ; 3 1.code := append( 2.code, 3.code) 2.labin := 1.labin 3.labin := 2.labout 1.labout := 3.labout
Генерация кода операторов (2) ::= skip.code :=.labout :=.labin |.code :=.code.labout :=.labin
Генерация кода операторов (3) 1 ::= if then 2 else 3 2.labin := 1.labin labin := 2.labout 1.labout := 3.labout 1.code := append(.code, ( "BZ" label( 1.labin) ), 2.code, ( "BR" label( 1.labin + 1) ), ( label( 1.labin) "NOP ), 3.code, ( label( 1.labin+1) "NOP ) )
Генерация кода операторов (4) 1 ::= while do 2 2.labin := 1.labin labout := 2.labout 1.code := append( ( label( 1.labin) "NOP ),.code, ( "BZ" label( 1.labin + 1) ), 2.code, ( "BR" label( 1.labin) ), ( label( 1.labin+1) "NOP ) )
Генерация кода операторов (5) ::= :=.temp := 1.code := append(.code, ("STO".name))
Генерация кода выражений 1 ::= 1.code :=.value) > | 1.code :=.name) > | temp := 1.temp 3.temp := 1.temp code := append( 2.code, ( "STO" temp( 1.temp) ), 3.code, ( "ADD" temp( 1.temp) ) )