Misplaced Pages

TREE-META

Article snapshot taken from Wikipedia with creative commons attribution-sharealike license. Give it a read and then ask your questions in the chat. We can research this topic together.
TREE-META
Original author(s)Donald Andrews, Jeff Rulifson
Initial release1968?

The TREE-META (or Tree Meta, TREEMETA) Translator Writing System is a compiler-compiler system for context-free languages originally developed in the 1960s. Parsing statements of the metalanguage resemble augmented Backus–Naur form with embedded tree-building directives. Unparsing rules include extensive tree-scanning and code-generation constructs.

History

TREE-META was instrumental in the development of NLS (oN-Line System) and was ported to many systems including the UNIVAC 1108, GE 645, SDS 940, ICL 1906A, PERQ, and UCSD p-System.

Example

This is a complete example of a TREE-META program extracted (and untested) from the more complete (declarations, conditionals, and blocks) example in Appendix 6 of the ICL 1900 TREE-META manual. That document also has a definition of TREE-META in TREE-META in Appendix 3. This program is not just a recognizer, but also outputs the assembly language for the input. It demonstrates one of the key features of TREE-META, which is tree pattern matching. It is used on both the LHS (GET and VAL for example) and the RHS (ADD and SUB).

% This is an ALGOL-style comment delimited by %

% ====================== 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*;
% Parse an assignment statement from the source to the tree.       % 
% ':=' is a string constant, :STORE creates a STORE node,          %
%  defines this as having two branches i.e. STORE.     %
% * triggers a unparse of the tree, Starting with the last created %
% tree i.e. the STORE which is emitted as output and      %
% removed from the tree.                                           %
AEXP = FACTOR $('+' FACTOR :ADD / '-' FACTOR :SUB);
% Here we have the recognizer for arithmetic '+' :ADD and '-' :SUB %
% tree building. Again the  creates a 2-branch ADD or SUB tree. %
% Unparsing is deferred until an entire statement has been parsed. %
% ADD or SUB                         %
FACTOR = '-' PRIME :MINUSS / PRIME ;
PRIME =  .ID / .NUM / '(' AEXP ')' ?3? ;
% ?3? is a hint for error messages.                                %
% ===================== OUTPUT UNPARSE RULES ===================== %
STORE => GET 'STORE ' *1 ;
% *1 is the left tree branch. *2 is the right                      %
% GET 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.                       %
GET => 'LOAD ' *1 /
    => ' LOADI ' *1 /
   ] => '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 GET 'ADD' VAL  / 
             SIMP GET 'ADD' VAL / 
             GET 'STORE T+' < OUT ; A<-A+1 > /
             GET 'ADD T+' < A<-A-1 ; OUT > ;
% Chevrons < > indicate an arithmetic operation, for example to    %
% generate an offset A relative to a base address T.               %
SUB  => SIMP GET 'SUB' VAL / 
             SIMP GET 'NEGATE' % 'ADD' VAL /
             GET 'STORE T+' < OUT ; A<-A+1 > / 
             GET 'SUB T+' < A<-A-1 ; OUT > ;
% A percent character in an unparse rule indicates a newline.      %
SIMP           => .EMPTY /
              => .EMPTY /
    ]  => .EMPTY;
VAL             => ' ' *1 /
               => 'I ' *1 /
   ]    => 'N ' *1:*1 ;
MINUSS            => GET 'NEGATE' ;
.END

See also

References

  1. Donald I. Andrews, J. F. Rulifson (1967). Tree Meta (Working Draft): A Meta Compiler for the SDS 940, Stanford Research Institute, Menlo Park, CA. Engelbart Collection, Stanford University Archive, M 638, Box 16, Folder 3.
  2. Bowles, K. L., 1978. A (nearly) machine independent software system for micro and mini computers. SIGMINI Newsl., 4(1), 3–7. doi:10.1145/1041256.1041257
  3. Bowles, K. L. (May 1978). "UCSD Pascal: A (nearly) machine independent software system for micro and mini computers". Byte. Vol. 3, no. 5. pp. 46, 170–173 – via Internet Archive.{{cite magazine}}: CS1 maint: date and year (link)
  4. Hopgood, F. R. A. 1974, "TREE-META Manual", Atlas Computer Laboratory.

External links

Categories: