WikiDer > Трансляционная форма Бэкуса – Наура
Эта статья нужны дополнительные цитаты для проверка. (Октябрь 2016) (Узнайте, как и когда удалить этот шаблон сообщения) |
Трансляционная форма Бэкуса – Наура (TBNF или же Трансляционный BNF) относится к Форма Бэкуса – Наура, который представляет собой формальную грамматическую нотацию, используемую для определения синтаксиса компьютерных языков, таких как Алгол, Ада, C ++, КОБОЛ, Фортран, Ява, Perl, Python, и много других. TBNF выходит за рамки BNF и расширенный BNF (EBNF) грамматическая нотация, потому что она не только определяет синтаксис языка, но также определяет структуру абстрактное синтаксическое дерево (AST), который должен быть создан в памяти, и выходной промежуточный код, который должен быть сгенерирован. Таким образом, TBNF определяет полный процесс трансляции от исходного исходного кода до промежуточного кода. Указание выходного промежуточного кода не является обязательным, и в этом случае вы все равно получите автоматическое создание AST и сможете определять его структуру в грамматике.
Обзор
Концепция TBNF была впервые опубликована в апреле 2006 г. в документе на сайте SIGPLAN Notices, специальной группе по интересам ACM.[1]
Вот пример грамматики, указанной в TBNF:
/ * TBNF Грамматика для простого языка. В этой грамматике используются пять аргументов узла, чтобы избежать необходимости создавать действия узла.*// * Ввод токенов. * / <ошибка> => ошибка() ; <идентификатор> => искать(); // Поиск и сохранение в таблице символов. <целое число> => искать(); // Поиск и сохранение в таблице символов. <eof> ;/ * Приоритет оператора. * / { '==' '!=' } << // Самый низкий приоритет. { '+' '-' } << { '*' '/' } << // Наивысший приоритет./ * Производство. * / Цель -> Программа... <eof> *> Цель_ (0,," НАЧНИТЕ" ,," EOF") Программа -> 'программа' <идентификатор> '{' Stmt... '}' *> program_ (2,," ПРОГРАММА% s",," КОНЕЦ ПРОГРАММЫ% s") Stmt -> Назначение -> Если тогда -> Если еще -> IfThenElse Назначение ~> Цель '=' Опыт ';' *> назначать_ (0,, ,," ХРАНИТЬ") Если тогда -> 'если' RelExp потом 'endif' *> если_ (0,,"если & 0:",,"endif & 0:" ) Если еще -> 'если' RelExp Еще 'endif' *> если_ (0,,"если & 0:",,"endif & 0:" ) IfThenElse -> 'если' RelExp Тогда2 Else2 'endif' *> если_ (0,,"если & 0:",,"endif & 0:" ) Цель -> <идентификатор> *> идентификатор_ (1,,,," LADR% s") RelExp -> Опыт '==' Опыт *> eq_ (0,,,," Эквалайзер" ) -> Опыт '!=' Опыт *> ne_ (0,,,," NE" ) Опыт -> Начальный -> Опыт '+' Опыт *> Добавить_ (0,,,," ДОБАВИТЬ") -> Опыт '-' Опыт *> sub_ (0,,,," SUB") -> Опыт '*' Опыт *> mul_ (0,,,," MUL") -> Опыт '/' Опыт *> div_ (0,,,," DIV") Начальный -> <целое число> *> intr_ (1,,,," ЗАГРУЗИТЬ% s") -> <идентификатор> *> идентификатор_ (1,,,," ЗАГРУЗИТЬ% s") -> '(' Опыт ')' потом -> 'тогда' Stmt... *> тогда_ (0,," BR NZ endif & 1затем & 1:",,) Еще -> 'еще' Stmt... *> еще_ (0,," BR Z endif & 1еще & 1:" ,,) Тогда2 -> 'тогда' Stmt... *> then2_ (0,," BR NZ else & 1затем & 1:" ,,) Else2 -> 'еще' Stmt... *> else2_ (0,," BR endif & 1еще & 1:" ,,)/ * Конец грамматики. * /
Учитывая этот ввод:
программный тест {если a == 0, то если x == 0, то b = 10; иначе b = 20; endif else if x == 1 then b = 30; иначе b = 40; endif endif}
Запуск переводчика, созданного на основе приведенной выше грамматики, даст следующий результат:
НАЧНИТЕ ПРОГРАММА тестif1: НАГРУЗКА а НАГРУЗКА 0 Эквалайзер BR NZ else1then1:if2: НАГРУЗКА Икс НАГРУЗКА 0 Эквалайзер BR NZ else2then2: НАГРУЗКА 10 LADR б ХРАНИТЬ BR endif2else2: НАГРУЗКА 20 LADR б ХРАНИТЬendif2: BR endif1else1:if3: НАГРУЗКА Икс НАГРУЗКА 1 Эквалайзер BR NZ else3then3: НАГРУЗКА 30 LADR б ХРАНИТЬ BR endif3else3: НАГРУЗКА 40 LADR б ХРАНИТЬendif3:endif1: КОНЕЦ ПРОГРАММА тест EOF
Рекомендации
- ^ Манн, Пол Б. (2006). «Трансляционная грамматическая нотация BNF (TBNF)». Уведомления SIGPLAN. 41 (4): 16–23. Дои:10.1145/1147214.1147218.