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

编译器/解释器

开发平台:

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/parser.sa#1 $
  7. *)
  8. partial class ANTLR_PARSER{ TOKEN < $ANTLR_TOKEN, AST < $ANTLR_AST{AST} } is
  9.    readonly attr input_state : ANTLR_PARSER_SHARED_INPUT_STATE{TOKEN};
  10.    -- Table of token type to token names 
  11.    readonly attr token_names : ARRAY{STR};
  12.    -- AST return value for a rule is squirreled away here 
  13.    private attr return_ast : AST;
  14.    -- AST support code; parser and treeparser delegate to this object 
  15.    -- attr ast_factory : $ANTLR_AST_FACTORY;
  16.    attr ignore_invalid_debug_calls : BOOL;
  17.    create : SAME is
  18.       res : SAME := new;
  19.       res.input_state := #ANTLR_PARSER_SHARED_INPUT_STATE{TOKEN};
  20.       return res;
  21.    end;
  22.    create ( state : ANTLR_PARSER_SHARED_INPUT_STATE{TOKEN} ) : SAME is
  23.       res : SAME := new;
  24.       res.input_state := state;
  25.       return res;
  26.    end;
  27.    
  28.    -- only_valid_msg : STR := "is only valid if parser built for debugging";
  29.    -- add_message_listener( listener : MESSAGE_LISTENER ) is
  30.    --   err_msg : STR := "add_message_listener " + only_valid_msg;
  31.    -- end;
  32.    -- add_parser_listener( listener : PARSER_LISTENER ) is
  33.    --   err_msg : STR := "add_parser_listener" + only_valid_msg;
  34.    -- end;
  35.    
  36.    -- add_parser_match_listener( listener : PARSER_MATCH_LISTENER ) is
  37.    --   err_msg : STR := "add_parser_match_listener " + only_valid_msg;
  38.    -- end;
  39.    
  40.    -- add_parse_token_listener( listener : PARSER_TOKEN_LISTENER ) is
  41.    --   err_msg : STR := "add_parser_token_listener " + only_valid_msg;
  42.    -- end;
  43.    
  44.    -- add_semantic_predicate_listener( listener : SEMANTIC_PREDICATE_LISTENER ) is
  45.    --   err_msg : STR := "add_semantic_token_listener " + only_valid_msg;
  46.    -- end;
  47.    
  48.    -- add_trace_listener( listener : TRACE_LISTENER ) is
  49.    --   err_msg : STR := "add_trace_listener " + only_valid_msg;
  50.    -- end;
  51.    
  52.    -- Get another token object from the token stream
  53.    stub consume;
  54.    -- Consume tokens until one matches the given token
  55.    consume_until( token_type : INT ) is
  56.       loop while! ( LA(1) /= ANTLR_COMMON_TOKEN::EOF_TYPE and LA(1) /= token_type );
  57.  consume;
  58.       end;
  59.    end;
  60.    consume_until( set : INT_SET ) is
  61.       loop while! ( LA(1) /= ANTLR_COMMON_TOKEN::EOF_TYPE and ~set.member( LA(1) ) );
  62.  consume;
  63.       end;
  64.    end;
  65.    default_debugging_setup( lexer : $ANTLR_TOKEN_STREAM{TOKEN} , 
  66.     tok_buf : ANTLR_TOKEN_BUFFER{TOKEN} ) is
  67.       -- by default, do nothing -- we're not debugging
  68.    end;
  69.    
  70.    ast : AST is
  71.       return return_ast;
  72.    end;
  73.    
  74.    file_name : STR is
  75.       return input_state.file_name;
  76.    end;
  77.    
  78.    is_debug_mode : BOOL is 
  79.       return false;
  80.    end;
  81.    
  82.    -- Return the token type of the ith token of lookahead where i=1
  83.    -- is the current token being examined by the parser (i.e., it
  84.    -- has not been matched yet).
  85.    stub LA( i : INT ) : INT;
  86.    
  87.    -- Return the ith token of lookahead
  88.    stub LT( i : INT ) : TOKEN;
  89.    
  90.    -- Forwarded to TokenBuffer
  91.    mark : INT is
  92.       return input_state.input.mark;
  93.    end;
  94.    -- Make sure current lookahead symbol matches token type <tt>t</tt>.
  95.    -- Throw an exception upon mismatch, which is catch by either the
  96.    -- error handler or by the syntactic predicate.
  97.    match( t : INT ) is
  98.       if ( LA(1) /= t ) then
  99.  raise ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}::create_from_token( token_names, LT(1), t, false, file_name );
  100.       else
  101.  -- mark token as consumed -- fetch next token deferred until LA/LT
  102.  consume;
  103.       end;
  104.    end;
  105.    -- Make sure current lookahead symbol matches the given set
  106.    -- Throw an exception upon mismatch, which is catch by either the
  107.    -- error handler or by the syntactic predicate.
  108.    match( b : INT_SET ) is
  109.       if ( ~b.member(LA(1)) ) then
  110.  raise ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}::create_from_token( token_names, LT(1), b, false, file_name );
  111.       else
  112.  -- mark token as consumed -- fetch next token deferred until LA/LT
  113.  consume;
  114.       end;
  115.    end;
  116.    match_not( t : INT ) is
  117.       if ( LA(1) = t ) then
  118.  -- Throws inverted-sense exception
  119.  raise ANTLR_MISMATCHED_TOKEN_EXCEPTION{AST}::create_from_token( token_names, LT(1), t, true, file_name );
  120.       else
  121.  -- mark token as consumed -- fetch next token deferred until LA/LT
  122.  consume;
  123.       end;
  124.    end;
  125.    panic is
  126.       #ERR + "Parser: panicn";
  127.       UNIX::exit(1);
  128.    end;
  129.    
  130.    -- Parser error-reporting function can be overridden in subclass 
  131.    report_error( ex : $ANTLR_RECOGNITION_EXCEPTION ) is
  132.       #ERR + ex.str + "n";
  133.    end;
  134.    
  135.    -- Parser error-reporting function can be overridden in subclass
  136.    report_error( s : STR ) is
  137.       if ( void( file_name ) ) then
  138.  #ERR + "error: " + s + "n";
  139.       else
  140.  #ERR + file_name + ": error: " + s + "n";
  141.       end;
  142.    end;
  143.    
  144.    -- Parser warning-reporting function can be overridden in subclass 
  145.    report_warning( s : STR ) is
  146.       if ( void( file_name ) ) then
  147.  #ERR + "warning: " + s + "n";
  148.       else
  149.  #ERR + file_name + ": warning: " + s + "n";
  150.       end;
  151.    end;
  152.    rewind ( pos : INT) is
  153.       input_state.input.rewind(pos);
  154.    end;
  155.    file_name( f : STR ) is 
  156.       input_state.file_name := f;
  157.    end;
  158.    -- Set or change the input token buffer 
  159.    token_buffer( t : ANTLR_TOKEN_BUFFER{TOKEN} ) is
  160.       input_state.input := t; 
  161.    end;
  162.    trace_in( rname : STR ) is
  163.       #OUT + "enter " + rname + "; LA(1)=" + LT(1).text;
  164.       if ( input_state.guessing > 0 ) then
  165.  #OUT + "[guessing]n";
  166.       else
  167.  #OUT + "n";
  168.       end;
  169.    end;
  170.    trace_out( rname : STR ) is
  171.       #OUT + "exit "+ rname + "; LA(1)=" + LT(1).text;
  172.       if ( input_state.guessing > 0 ) then
  173.  #OUT + "[guessing]n";
  174.       else
  175.  #OUT + "n";
  176.       end;
  177.    end;
  178. end;