Эта статья требует дополнительных ссылок для проверки . ( октябрь 2016 г. ) ( Узнайте, как и когда удалить это сообщение-шаблон ) |
Трансляционная форма Бэкуса – Наура ( TBNF или Translational BNF ) относится к форме Бэкуса – Наура , которая представляет собой формальную грамматическую нотацию, используемую для определения синтаксиса компьютерных языков, таких как Algol , Ada , C ++ , COBOL , Fortran , Java , Perl , Python. , и много других. TBNF выходит за рамки BNF и расширенной грамматической нотации BNF (EBNF), потому что он не только определяет синтаксис языка, но также определяет структуру абстрактного синтаксического дерева.(AST), который будет создан в памяти, и выходной промежуточный код, который будет сгенерирован. Таким образом, TBNF определяет полный процесс трансляции от исходного исходного кода до промежуточного кода. Указание выходного промежуточного кода не является обязательным, и в этом случае вы все равно получите автоматическое создание AST и сможете определять его структуру в грамматике.
Обзор [ править ]
Концепция TBNF была впервые опубликована в апреле 2006 года в документе SIGPLAN Notices, специальной группы ACM .[1]
Вот пример грамматики, указанной в TBNF:
/ * TBNF Грамматика для простого языка. В этой грамматике используются пять аргументов узла, чтобы избежать необходимости создавать действия узла. * / / * Ввод токенов. * / < ошибка > => ошибка () ; < идентификатор > => lookup (); // Поиск и сохранение в таблице символов. < целое число > => lookup (); // Поиск и сохранение в таблице символов. < eof > ;/ * Приоритет оператора. * / { ' == ' ' ! = ' } << // Самый низкий приоритет. { '+' '-' } << { '*' '/' } << // Наивысший приоритет./ * Производство. * / Цель -> Программа ... < eof > *> goal_ ( 0 ,, " \ t \ t START \ n " ,, " \ t \ t EOF \ n \ n " ) Программа -> ' program ' < идентификатор > '{' Stmt ... '}' *> program_ ( 2 ,, " \ t \ t PROGRAM% s \ n " ,, " \ t \ t КОНЕЦ ПРОГРАММЫ% s \ n " ) Stmt -> Назначение -> IfThen -> IfElse -> IfThenElse Назначение ~> Target '=' Exp ';' *> assign_ ( 0 ,, ,, " \ t \ t STORE \ n " ) IfThen -> ' if ' RelExp Then ' endif ' *> if_ ( 0 ,, "if & 0: \ n " ,, "endif & 0: \ n " ) IfElse -> ' if ' RelExp Else ' endif ' *> if_ (0 ,, "if & 0: \ n " ,, "endif & 0: \ n " ) IfThenElse -> ' if ' RelExp Then2 Else2 ' endif ' *> if_ ( 0 ,, "if & 0: \ n " ,, "endif & 0: \ n " ) Цель -> < идентификатор > *> identity_ ( 1 ,,,, " \ t \ t LADR% s \ n " ) RelExp -> Exp ' == ' Exp *> eq_ ( 0 ,,,, " \ t \ t EQ \ n " ) -> Exp ' ! = ' Exp *> ne_ ( 0 ,,,, " \ t \ t NE \ n " ) Exp -> Primary -> Exp '+' Exp *> add_ ( 0 ,,,, " \ t \ t ADD \ n " ) -> Exp '-' Exp *> sub_ ( 0 ,,,, " \ t \ t SUB \ n " ) -> Exp '*' Exp *> mul_ ( 0 ,,,, " \ t \ t MUL \ n " ) -> Exp '/' Exp *> div_ (0 ,,,, " \ t \ t DIV \ n " ) Первичный -> < целое число > *> intr_ ( 1 ,,,, " \ t \ t LOAD% s \ n " ) -> < идентификатор > *> identity_ ( 1 ,,,, " \ t \ t LOAD% s \ п " ) -> '(' Опыт ')' Затем -> ' then ' Stmt ... *> then_ ( 0 ,, " \ t \ t BR NZ endif & 1 \ n then & 1: \ n " ,,) Else -> ' else ' Stmt ... *> else_ ( 0 ,, " \ t \ t BR Z endif & 1 \ n else & 1: \ n " ,,) Then2 -> ' then ' Stmt ... *> then2_ ( 0 ,,"\ t \ t BR NZ else & 1 \ n then & 1: \ n " ,,) Else2 -> ' else ' Stmt ... *> else2_ ( 0 ,, " \ t \ t BR endif & 1 \ n else & 1: \ n " ,, )/ * Конец грамматики. * /
Учитывая этот ввод:
тест программы{ если a == 0 тогда если x == 0 тогда b = 10; иначе b = 20; endif еще если x == 1 тогда b = 30; иначе b = 40; endif endif}
Запуск переводчика, созданного на основе приведенной выше грамматики, приведет к следующему результату:
START PROGRAM test if1: LOAD a LOAD 0 EQ BR NZ else1 then1 : if2: LOAD x LOAD 0 EQ BR NZ else2 then2: LOAD 10 LADR b STORE BR endif2 else2: LOAD 20 LADR b STORE endif2: BR endif1 else1: if3: LOAD х Руководство разница между покупной и продажной ценой акции 1 EQ BR NZ else3 then3: НАГРУЗКИ 30 LADR б STORE BR endif3 else3: НАГРУЗКА 40 LADR б STORE endif3: endif1: END ПРОГРАММА тест - EOF
Ссылки [ править ]
- Перейти ↑ Mann, Paul B (2006). «Трансляционная грамматическая нотация BNF (TBNF)». Уведомления SIGPLAN . 41 (4): 16–23. DOI : 10.1145 / 1147214.1147218 .