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

编译器/解释器

开发平台:

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/llkparser.sa#1 $
  7. *)
  8. class ANTLR_LLKPARSER{ TOKEN < $ANTLR_TOKEN, AST < $ANTLR_AST{AST} } is
  9.    include ANTLR_PARSER{ TOKEN, AST } create -> parser_create;
  10.    
  11.    private attr k : INT;
  12.    
  13.    create ( k : INT ) : SAME is
  14.       res : SAME := parser_create;
  15.       res.k := k;
  16.       return res;
  17.    end;
  18.    
  19.    create ( state : ANTLR_PARSER_SHARED_INPUT_STATE{TOKEN} , k : INT ) : SAME is
  20.       res : SAME := parser_create;
  21.       res.k := k;
  22.       res.input_state := state;
  23.       return res;
  24.    end;
  25.    create ( token_buf : ANTLR_TOKEN_BUFFER{TOKEN} , k : INT ) : SAME is
  26.       res : SAME := parser_create;
  27.       res.k := k;
  28.       res.token_buffer := token_buf;
  29.       return res;
  30.    end;
  31.    
  32.    create ( lexer : $ANTLR_TOKEN_STREAM{TOKEN} , k : INT ) : SAME is
  33.       res : SAME := parser_create;
  34.       token_buf : ANTLR_TOKEN_BUFFER{TOKEN} := #ANTLR_TOKEN_BUFFER{TOKEN}( lexer );
  35.       res.token_buffer := token_buf;
  36.       return res;
  37.    end;
  38.    
  39.    -- Consume another token from the input stream.  Can only write sequentially!
  40.    -- If you need 3 tokens ahead, you must consume 3 times.
  41.    -- Note that it is possible to overwrite tokens that have not been matched.
  42.    -- For example, calling consume 3 times when k=2, means that the first token
  43.    -- consumed will be overwritten with the 3rd.
  44.    
  45.    consume is 
  46.       input_state.input.consume;
  47.    end;
  48.    
  49.    LA( i : INT ) : INT is
  50.       return input_state.input.LA(i);
  51.    end;
  52.    
  53.    LT( i : INT ) : TOKEN is
  54.       return input_state.input.LT(i);
  55.    end;
  56.    private trace( ee, rname : STR ) is 
  57.       #OUT + ee + rname;
  58.       if ( input_state.guessing > 0 ) then
  59.  #OUT + "; [guessing]";
  60.       else
  61.  #OUT + "; ";
  62.       end;
  63.       
  64.       i : INT := 1;
  65.       loop while! ( i <= k );
  66.     
  67.  if ( i /= 1 ) then
  68.     #OUT + ", ";
  69.  end;
  70.     
  71.  #OUT + "LA(" + i + ")=" + LT(i).text;
  72.     
  73.  i := i + 1;
  74.       end;
  75.       #OUT + "n";
  76.    end;
  77.    trace_in ( rname : STR ) is
  78.       trace("enter ", rname);
  79.    end;
  80.    trace_out( rname : STR ) is
  81.       trace("exit ", rname);
  82.    end;
  83.    
  84. end;