Jump to content

ДЕРЕВО-МЕТА

ДЕРЕВО-МЕТА
Оригинальный автор(ы) Дональд Эндрюс, Джефф Рулифсон
Первоначальный выпуск 1968?

Система письма переводчика TREE-META (или Tree Meta , TREEMETA ) — это система компилятора-компилятора для контекстно-свободных языков, первоначально разработанная в 1960-х годах. Операторы синтаксического анализа метаязыка напоминают расширенную форму Бэкуса-Наура со встроенными директивами построения дерева. Разбор [1] правила включают обширные конструкции сканирования деревьев и генерации кода.

История [ править ]

TREE-META сыграла важную роль в разработке NLS (on-Line System) и была портирована на многие системы, включая UNIVAC 1108 , GE 645 , SDS 940 , ICL 1906A , PERQ и UCSD p-System . [2] [3]

Пример [ править ]

Это полный пример программы TREE-META, извлеченный (и непроверенный) из более полного (объявления, условные выражения и блоки) примера в Приложении 6 руководства ICL 1900 TREE-META. [4] В этом документе также есть определение TREE-META в TREE-META в Приложении 3. Эта программа является не просто распознавателем, но также выводит ассемблерный язык для ввода. Он демонстрирует одну из ключевых особенностей TREE-META — сопоставление с образцом дерева. Он используется как в LHS (например, GET и VAL), так и в RHS (ADD и SUB).

% Это комментарий в стиле ALGOL, разделенный знаком %.

% ====================== INPUT PARSE RULES ======================= %

.META PROG 
% A program defining driving rule is required.                     %
% This PROG rule is the driver of the complete program.            %

PROG  = $STMT ;
% $ is the zero or more operator.                                  %
% PROG (the program) is defined as zero or more STMT (statements). %

STMT = .ID ':=' AEXP :STORE[2]*;
% Parse an assignment statement from the source to the tree.       % 
% ':=' is a string constant, :STORE creates a STORE node,          %
% [2] defines this as having two branches i.e. STORE[ID,AEXP].     %
% * triggers a unparse of the tree, Starting with the last created %
% tree i.e. the STORE[ID,AEXP] which is emitted as output and      %
% removed from the tree.                                           %

AEXP = FACTOR $('+' FACTOR :ADD[2] / '-' FACTOR :SUB[2]);
% Here we have the recognizer for arithmetic '+' :ADD and '-' :SUB %
% tree building. Again the [2] creates a 2-branch ADD or SUB tree. %
% Unparsing is deferred until an entire statement has been parsed. %
% ADD[FACTOR,FACTOR] or SUB[FACTOR,FACTOR]                         %

FACTOR = '-' PRIME :MINUSS[1] / PRIME ;

PRIME =  .ID / .NUM / '(' AEXP ')' ?3? ;
% ?3? is a hint for error messages.                                %
    
% ===================== OUTPUT UNPARSE RULES ===================== %

STORE[-,-] => GET[*2] 'STORE ' *1 ;
% *1 is the left tree branch. *2 is the right                      %
% GET[*2] will generate code to load *2.                           %
% The 'STORE' string will be output                                %
% followed by left branch *1 a symbol                              %
% Whatever *2, it will be loaded by GET[*2].                       %

GET[.ID] => 'LOAD ' *1 /
   [.NUM] => ' LOADI ' *1 /
   [MINUSS[.NUM]] => 'LOADN ' *1:*1 /
   [-]  => *1 ;
% Here an .ID or a .NUM will simply be loaded. A MINUSS node       %
% containing a .NUM will have this used, the notation *1:*1 means  %
% the first branch (a .NUM) of the first branch (MINUSS).          %
% Anything else will be passed on for node recognition             %
% The unparse rules deconstruct a tree outputing code.             %

ADD[-,-] =>  SIMP[*2] GET[*1] 'ADD' VAL[*2]  / 
             SIMP[*1] GET[*2] 'ADD' VAL[*1] / 
             GET[*1] 'STORE T+' < OUT[A] ; A<-A+1 > /
             GET[*2] 'ADD T+' < A<-A-1 ; OUT[A] > ;
% Chevrons < > indicate an arithmetic operation, for example to    %
% generate an offset A relative to a base address T.               %

SUB[-,-]  => SIMP[*2] GET[*1] 'SUB' VAL[*2] / 
             SIMP[*1] GET[*2] 'NEGATE' % 'ADD' VAL[*1] /
             GET[*2] 'STORE T+' < OUT[A] ; A<-A+1 > / 
             GET[*1] 'SUB T+' < A<-A-1 ; OUT[A] > ;
% A percent character in an unparse rule indicates a newline.      %

SIMP[.ID]           => .EMPTY /
    [.NUM]          => .EMPTY /
    [MINUSS[.NUM]]  => .EMPTY;

VAL[.ID]             => ' ' *1 /
   [.NUM]            => 'I ' *1 /
   [MINUSS[.NUM]]    => 'N ' *1:*1 ;

MINUSS[-]            => GET[*1] 'NEGATE' ;

.END

См. также [ править ]

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

  1. ^ Дональд И. Эндрюс, Дж. Ф. Рулифсон (1967). Мета дерева (рабочий проект): метакомпилятор для SDS 940 , Стэнфордский исследовательский институт, Менло-Парк, Калифорния. Коллекция Энгельбарта, Архив Стэнфордского университета, M 638, ящик 16, папка 3.
  2. ^ Боулз, К.Л., 1978. (Почти) машинно-независимая система программного обеспечения для микро- и мини-компьютеров. SIGMINI Newsl., 4 (1), 3–7. дои : 10.1145/1041256.1041257
  3. ^ Боулз, КЛ (май 1978 г.). «UCSD Pascal: (почти) машинно-независимая система программного обеспечения для микро- и мини-компьютеров» . Байт . Том. 3, нет. 5. стр. 46, 170–173 – в Интернет-архиве. {{cite magazine}}: CS1 maint: дата и год ( ссылка )
  4. ^ Хопгуд, FRA 1974, «Руководство TREE-META», Компьютерная лаборатория Атласа.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 09b450f53dc9f5b8c7badd65e8cb55c2__1678034640
URL1:https://arc.ask3.ru/arc/aa/09/c2/09b450f53dc9f5b8c7badd65e8cb55c2.html
Заголовок, (Title) документа по адресу, URL1:
TREE-META - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)