Překladová forma Backus – Naur - Translational Backus–Naur form
![]() | tento článek potřebuje další citace pro ověření.Říjen 2016) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Překladová forma Backus – Naur (TBNF nebo Translační BNF) odkazuje na Backus – Naurova forma, což je formální gramatická notace používaná k definování syntaxe počítačových jazyků, například Algol, Ada, C ++, COBOL, Fortran, Jáva, Perl, Krajta, a mnoho dalších. TBNF jde nad rámec BNF a prodloužený BNF (EBNF) gramatická notace, protože nejen definuje syntaxi jazyka, ale také definuje strukturu abstraktní syntaxový strom (AST), který má být vytvořen v paměti a výstupní mezikód, který má být generován. TBNF tedy definuje kompletní proces překladu ze vstupního zdrojového kódu do mezikódu. Specifikace výstupního mezikódu je volitelná, v takovém případě stále získáte automatické vytváření AST a máte možnost definovat jeho strukturu v gramatice.
Přehled
Koncept TBNF byl poprvé publikován v dubnu 2006 v příspěvku ve zvláštní zájmové skupině SIGPLAN Notices ACM.[1]
Zde je ukázková gramatika specifikovaná v TBNF:
/ * TBNF gramatika pro jednoduchý jazyk. V této gramatice se používá pět argumentů uzlů, aby se zabránilo vytváření akcí uzlů.*// * Vstupní tokeny. * / <chyba> => chyba() ; <identifikátor> => vzhlédnout(); // Vyhledání a uložení v tabulce symbolů. <celé číslo> => vzhlédnout(); // Vyhledání a uložení v tabulce symbolů. <eof> ;/ * Priorita operátora. * / { '==' '!=' } << // Nejnižší priorita. { '+' '-' } << { '*' '/' } << // Nejvyšší prioritou./ * Produkce. * / Fotbalová branka -> Program... <eof> *> fotbalová branka_ (0,," START" ,," EOF") Program -> 'program' <identifikátor> '{' Stmt... '}' *> program_ (2,," PROGRAM% s",," KONEC PROGRAMU% s") Stmt -> Úkol -> IfThen -> IfElse -> Jestliže pak jinak Úkol ~> cílová '=' Exp ';' *> přiřadit_ (0,, ,," UKLÁDAT") IfThen -> '-li' RelExp Pak 'endif' *> li_ (0,,"pokud & 0:",,"endif a 0:" ) IfElse -> '-li' RelExp Jiný 'endif' *> li_ (0,,"pokud & 0:",,"endif a 0:" ) Jestliže pak jinak -> '-li' RelExp Pak2 Else2 'endif' *> li_ (0,,"pokud & 0:",,"endif a 0:" ) cílová -> <identifikátor> *> ident_ (1,,,," LADR% s") RelExp -> Exp '==' Exp *> eq_ (0,,,," EQ" ) -> Exp '!=' Exp *> ne_ (0,,,," NE" ) Exp -> Hlavní -> Exp '+' Exp *> přidat_ (0,,,," PŘIDAT") -> Exp '-' Exp *> sub_ (0,,,," SUB") -> Exp '*' Exp *> mul_ (0,,,," MUL") -> Exp '/' Exp *> div_ (0,,,," DIV") Hlavní -> <celé číslo> *> intr_ (1,,,," ZATÍŽIT% s") -> <identifikátor> *> ident_ (1,,,," ZATÍŽIT% s") -> '(' Exp ')' Pak -> 'pak' Stmt... *> pak_ (0,," BR NZ endif a 1pak & 1:",,) Jiný -> 'jiný' Stmt... *> jiný_ (0,," BR Z endif a 1else & 1:" ,,) Pak2 -> 'pak' Stmt... *> then2_ (0,," BR NZ else & 1pak & 1:" ,,) Else2 -> 'jiný' Stmt... *> else2_ (0,," BR endif & 1else & 1:" ,,)/ * Konec gramatiky. * /
Vzhledem k tomuto vstupu:
test programu {if a == 0, pak pokud x == 0, pak b = 10; jinak b = 20; endif else if x == 1 pak b = 30; jinak b = 40; endif endif}
Spuštění překladače generovaného z výše uvedené gramatiky by vytvořilo tento výstup:
START PROGRAM testif1: ZATÍŽENÍ A ZATÍŽENÍ 0 EQ BR NZ else1then1:if2: ZATÍŽENÍ X ZATÍŽENÍ 0 EQ BR NZ else2then2: ZATÍŽENÍ 10 LADR b UKLÁDAT BR endif2else2: ZATÍŽENÍ 20 LADR b UKLÁDATendif2: BR endif1else1:if3: ZATÍŽENÍ X ZATÍŽENÍ 1 EQ BR NZ else3then3: ZATÍŽENÍ 30 LADR b UKLÁDAT BR endif3else3: ZATÍŽENÍ 40 LADR b UKLÁDATendif3:endif1: KONEC PROGRAM test EOF
Reference
- ^ Mann, Paul B (2006). "Translační notace gramatiky BNF (TBNF)". Oznámení SIGPLAN. 41 (4): 16–23. doi:10.1145/1147214.1147218.