WikiDer > Трансляционная форма Бэкуса – Наура

Translational Backus–Naur form

Трансляционная форма Бэкуса – Наура (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

Рекомендации

  1. ^ Манн, Пол Б. (2006). «Трансляционная грамматическая нотация BNF (TBNF)». Уведомления SIGPLAN. 41 (4): 16–23. Дои:10.1145/1147214.1147218.