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

编译器/解释器

开发平台:

Others

  1. (* 
  2.   ANTLR Translator Generator
  3.   Project led by Terence Parr at http://www.jGuru.com
  4.   Software rights: http://www.antlr.org/RIGHTS.html
  5.  
  6.   $Id: //depot/code/org.antlr/release/antlr-2.7.0/lib/sather/Antlr/tree_parser.sa#1 $
  7. *)
  8. class ANTLR_TREE_PARSER{AST < $ANTLR_AST{AST}} is
  9.    -- Where did this rule leave off parsing; avoids a return parameter 
  10.    private attr sa_ret_tree : AST;
  11.    -- guessing nesting level; guessing=0 implies not guessing 
  12.    -- private attr guessing : INT;
  13.    -- Nesting level of registered handlers 
  14.    -- private attr exception_level : INT ;
  15.    private attr input_state : ANTLR_TREE_PARSER_SHARED_INPUT_STATE;
  16.    -- Table of token type to token names 
  17.    attr token_names : ARRAY{STR};
  18.    -- AST return value for a rule is squirreled away here 
  19.    private attr return_ast : AST;
  20.    -- AST support code; parser and treeparser delegate to this object
  21.    -- attr ast_factory : $ANTLR_AST_FACTORY;
  22.    create : SAME is 
  23.       res : SAME := new;
  24.       res.input_state := #ANTLR_TREE_PARSER_SHARED_INPUT_STATE;
  25.       -- res.ast_factory := #ANTLR_COMMON_AST_FACTORY;
  26.       return res;
  27.    end;
  28.    -- Get the AST return value squirreled away in the parser 
  29.    ast : AST is
  30.       return return_ast;
  31.    end;
  32.    token_name ( num : INT ) : STR is 
  33.       return token_names[num];
  34.    end;
  35.    
  36.    match( t : AST, ttype : INT ) is
  37.       if ( void(t) or SYS::is_eq( t , AST::ASTNULL ) or t.ttype /= ttype ) then
  38.  raise #ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}( token_names, t, ttype, false );
  39.       end;
  40.    end;
  41.    -- Make sure current lookahead symbol matches the given set
  42.    -- Throw an exception upon mismatch, which is catch by either the
  43.    -- error handler or by the syntactic predicate.
  44.    match( t : AST, b : INT_SET ) is
  45.       if ( void(t) or SYS::is_eq( t , AST::ASTNULL ) or ~b.member(t.ttype) ) then
  46.  raise #ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}( token_names, t, b, false);
  47.       end;
  48.    end;
  49.    match_not(t : AST, ttype : INT ) is
  50.       if ( void(t) or SYS::is_eq( t , AST::ASTNULL ) or t.ttype /= ttype ) then
  51.  raise #ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}( token_names, t, ttype, true );
  52.       end;
  53.    end;
  54.    panic is
  55.       #ERR + "TREE_WALKER: panicn";
  56.       UNIX::exit(1);
  57.    end;
  58.    -- Parser error-reporting function can be overridden in subclass 
  59.    report_error( ex : $ANTLR_RECOGNITION_EXCEPTION ) is
  60.       #ERR + ex.str + "n";
  61.    end;
  62.    -- Parser error-reporting function can be overridden in subclass
  63.    report_error( s : STR ) is
  64.       #ERR + "error: " + s + "n";
  65.    end;
  66.    -- Parser warning-reporting function can be overridden in subclass 
  67.    report_warning( s : STR ) is
  68.       #ERR + "warning: " + s + "n";
  69.    end;
  70.    trace_in( rname : STR, t : AST ) is
  71.       #OUT + "enter " + rname + "(";
  72.       if ( void(t) ) then
  73.  #OUT + "null";
  74.       else
  75.  #OUT + t.str;
  76.       end;
  77.       #OUT + ")";
  78.       if ( input_state.guessing > 0 ) then
  79.  #OUT + " [guessing]";
  80.       end;
  81.       #OUT + "n";
  82.    end;
  83.    
  84.    trace_out( rname : STR, t : AST ) is
  85.       #OUT + "exit " + rname + "(";
  86.       if ( void(t) ) then
  87.  #OUT + "null";
  88.       else
  89.  #OUT + t.str;
  90.       end;
  91.       #OUT + ")";
  92.       if ( input_state.guessing > 0 ) then
  93.  #OUT + " [guessing]";
  94.       end;
  95.       #OUT + "n";
  96.    end;
  97. end;