Часть II. Формальное описание языков программирования ( Формальная спецификация формальных языков ) Приложение. Атрибутная грамматика языка IMP
Атрибутная грамматика ::=.symtab := emptystack ::= begin ; end.symtab := push(.tbl,.symtab) 1 ::=.symtab := 1.symtab | ; 2.symtab := 1.symtab 2.symtab := 1.symtab
Декларации 1 ::= 1.tbl :=.tbl | ; 2 1.tbl :=.tbl 2.tbl Условие: ids(.tbl) ids( 2.tbl) = ids – функция, которая получает множество вида имя-тип и возвращает множество всех имен
Возврат к.symtab ::= begin ; end.symtab := push(.tbl,.symtab).symtab := push(.tbl,.symtab)
Декларации ::= int.tbl := { (.name, INT) } | bool.tbl := { (.name, BOOL) } | fun ( ) : int =.tbl := { (.name, FUN(.types, INT) ) }.symtab := push(.tbl,.symtab)
Операторы ::=.symtab :=.symtab |.symtab :=.symtab | if then else....symtab :=.symtab
Операторы ::= :=.symtab :=.symtab Cond: (typeof(.name,.symtab) = INT) (typeof(.name,.symtab) = FUN) | :=.symtab :=.symtab Cond: typeof(.name,.symtab) = BOOL
Арифметические выражения 1 ::= | Cond: typeof(.name, 1.symtab) = INT | symtab := 1.symtab 3.symtab := 1.symtab
Булевские выражения ::= true | false | Cond: typeof(.name,.symtab) = BOOL | |
Вызов функции (Function Call) ::= ( ) Cond: typeof(.name,.symtab) = FUN Cond: rettype(.name,.symtab) = INT.expTypes := paramtypes(.name,.symtab).symtab :=.symtab Cond: are_equal_lists(.expTypes, argtypes( ),.symtab)
Аргументы функции ::= |, ::= |