calc_ast.sa
上传用户:afrynkmhm
上传日期:2007-01-06
资源大小:1262k
文件大小:2k
源码类别:

编译器/解释器

开发平台:

Others

  1. abstract class $CALC_AST < $ANTLR_AST{$CALC_AST} is
  2.    val : INT;
  3.    
  4. end;
  5. class HETERO_AST{AST < $ANTLR_AST{AST}} < $ANTLR_AST{AST} is
  6.    include ANTLR_BASE_AST{AST};
  7.  
  8.    -- The AST Null object; the parsing cursor is set to this when
  9.    -- it is found to be null.  This way, we can test the
  10.    -- token type of a node without having to have tests for null
  11.    -- everywhere.
  12.    const ASTNULL : SAME := 
  13.  SAME::create( ANTLR_COMMON_TOKEN::NULL_TREE_LOOKAHEAD, "<ASTNULL>" );
  14.       
  15.    attr ttype : INT;
  16.    attr text : STR;
  17.    create : SAME is
  18.       res : SAME := new;
  19.       return res;
  20.    end;
  21.    
  22.    dup : SAME is
  23.       if ( void(self) ) then
  24.  return void;
  25.       end;
  26.       return #SAME( ttype, text );
  27.    end;
  28.    create( typ : INT, txt : STR ) : SAME is
  29.       res : SAME := new;
  30.       res.ttype := typ;
  31.       res.text  := txt;
  32.       return res;
  33.    end;
  34.    create_from_ast( t : AST ) : SAME is
  35.       res : SAME := create( t.ttype, t.text );
  36.       return res;
  37.    end;
  38.    create_from_token( t : $ANTLR_TOKEN ) : SAME is
  39.       res : SAME := create( t.ttype, t.text );
  40.       return res;
  41.    end;
  42. end;
  43. -- A simple node to represent an INT 
  44. class INT_NODE < $CALC_AST is
  45.    
  46.    include HETERO_AST{$CALC_AST};
  47.    attr val : INT;
  48.    create_from_token( t : $ANTLR_TOKEN ) : SAME is
  49.       res ::= new;
  50.       res.val := INT::create( t.text );
  51.       return res;
  52.    end;
  53.    
  54.    str : STR is
  55.       return " " + val;
  56.    end;
  57.    
  58. end;
  59. partial class BINARY_OPERATOR_AST < $CALC_AST is
  60.    include HETERO_AST{$CALC_AST};
  61.    
  62.    Left : $CALC_AST is
  63.       return first_child;
  64.    end;
  65.    Right : $CALC_AST is
  66.       t : $CALC_AST := Left;
  67.       if ( void(t) ) then 
  68.  return void;
  69.       else
  70.  return t.next_sibling;
  71.       end;
  72.    end;
  73.    stub val : INT;
  74.    
  75. end;
  76. -- A simple node to represent MULT operation 
  77. class MULT_NODE < $CALC_AST is
  78.    include BINARY_OPERATOR_AST;
  79.    
  80.    -- Compute value of subtree; this is heterogeneous part :)
  81.    val : INT is 
  82.       return Left.val * Right.val;
  83.    end;
  84.    const str : STR := " *";
  85. end;
  86. -- A simple node to represent PLUS operation 
  87. class PLUS_NODE < $CALC_AST is
  88.    include BINARY_OPERATOR_AST;
  89.    
  90.    -- Compute value of subtree; this is heterogeneous part :)
  91.    val : INT is 
  92.       return Left.val + Right.val;
  93.    end;
  94.    const str : STR := " +";
  95. end;