TRÄD-META

TRÄD-META
Originalförfattare Donald Andrews, Jeff Rulifson
Initial release 1968?

TREE -META (eller Tree Meta , TREEMETA ) Translator Writing System är ett kompilator-kompilatorsystem för sammanhangsfria språk som ursprungligen utvecklades på 1960-talet. Att analysera uttalanden av metaspråket liknar utökad Backus-Naur-form med inbäddade trädbyggande direktiv. Avparsningsregler inkluderar omfattande trädskanning och kodgenereringskonstruktioner.

Historia

TREE-META var avgörande i utvecklingen av NLS (on-Line System) och portades till många system inklusive UNIVAC 1108 , GE 645 , SDS 940 , ICL 1906A , PERQ och UCSD p-System .

Exempel

Detta är ett komplett exempel på ett TREE-META-program extraherat (och opröstat) från det mer kompletta exemplet (deklarationer, villkor och block) i bilaga 6 i ICL 1900 TREE-META-manualen. Det dokumentet har också en definition av TREE-META i TREE-META i bilaga 3. Detta program är inte bara en igenkännare, utan matar också ut assemblerspråket för inmatningen. Det visar en av nyckelfunktionerna i TREE-META, vilket är matchning av trädmönster. Den används på både LHS (GET och VAL till exempel) och RHS (ADD och SUB).

% Detta är en kommentar i ALGOL-stil avgränsad med %

% ======================= INPUT PARSE REGLER ======================== % .META PROG % En programdefinierande körregel krävs. % % Denna PROG-regel är drivrutinen för hela programmet. % PROG = $STMT ; % $ är noll eller fler operatorn. % % PROG (programmet) definieras som noll eller fler STMT (påståenden). % STMT = .ID ':=' AEXP :STORE[2]*; % Analysera en tilldelningssats från källan till trädet. % % ':=' är en strängkonstant, :STORE skapar en STORE-nod, % % [2] definierar detta som att ha två grenar dvs STORE[ID,AEXP]. % % * utlöser en avparsning av trädet, med början med det senast skapade % %-trädet dvs STORE[ID,AEXP] som sänds ut som utdata och % % tas bort från trädet. % AEXP = FAKTOR $('+' FAKTOR :ADD[2] / '-' FAKTOR :SUB[2]); % Här har vi igenkännaren för aritmetisk '+' :ADD och '-' :SUB % % trädbyggnad. Återigen skapar [2] ett ADD- eller SUB-träd med två grenar. % % Unparsing skjuts upp tills en hel sats har tolkats. % % ADD[FAKTOR,FAKTOR] eller SUB[FAKTOR,FAKTOR] % FAKTOR = '-' PRIME :MINUSS[1] / PRIME ; PRIME = .ID / .NUM / '(' AEXP ')' ?3? ; %?3? är ett tips för felmeddelanden. % % ====================== OUTPUT UNPARSE REGLER =============================================================== -,-] => HÄMTA[*2] 'BUTIKA ' *1 ; % *1 är den vänstra trädgrenen. *2 är rätt % % GET[*2] kommer att generera kod för att ladda *2. % % 'STORE'-strängen kommer att matas ut % % följt av vänster gren *1 en symbol % % Oavsett *2, den kommer att laddas av GET[*2]. % GET[.ID] => 'LOAD ' *1 / [.NUM] => ' LOADI ' *1 / [MINUSS[.NUM]] => 'LOADN ' *1:*1 / [-] => * 1; % Här kommer ett .ID eller ett .NUM helt enkelt att laddas. En MINUSS-nod % % som innehåller ett .NUM kommer att använda detta, notationen *1:*1 betyder % % den första grenen (ett .NUM) av den första grenen (MINUSS). % % Allt annat kommer att skickas vidare för nodigenkänning % % Unparse-reglerna dekonstruerar en trädutmatningskod. % ADD[-,-] => SIMP[*2] GET[*1] 'ADD' VAL[*2] / SIMP[*1] GET[*2] 'ADD' VALUE[*1] / GET[* 1] 'STORE T+' < OUT[A] ; A<-A+1 > / GET[*2] 'ADD T+' < A<-A-1 ; UT[A] > ; % Chevrons < > indikerar en aritmetisk operation, till exempel att % % genererar en offset A i förhållande till en basadress 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 ; UT[A] > ; % Ett procenttecken i en avtolkningsregel indikerar en nyrad. % SIMP[.ID] => .EMPTY / [.NUM] => .EMPTY / [MINUSS[.NUM]] => .EMPTY; VAL[.ID] => ' ' *1 / [.NUM] => 'JAG ' *1 / [MINUSS[.NUM]] => 'N ' *1:*1 ; MINUS[-] => FÅ[*1] 'NEGATE' ; .SLUTET

Se även

externa länkar