Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

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

Ссылки [ править ]

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