⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 llkparser.sa

📁 SRI international 发布的OAA框架软件
💻 SA
字号:
(* 

  ANTLR Translator Generator
  Project led by Terence Parr at http://www.jGuru.com
  Software rights: http://www.antlr.org/RIGHTS.html
 
  $Id: llkparser.sa,v 1.1.1.1 2002/01/02 19:59:09 agno Exp $

*)

class ANTLR_LLKPARSER{ TOKEN < $ANTLR_TOKEN, AST < $ANTLR_AST{AST} } is

   include ANTLR_PARSER{ TOKEN, AST } create -> parser_create;
   
   private attr k : INT;
   
   create ( k : INT ) : SAME is
      res : SAME := parser_create;
      res.k := k;
      return res;
   end;
   
   create ( state : ANTLR_PARSER_SHARED_INPUT_STATE{TOKEN} , k : INT ) : SAME is
      res : SAME := parser_create;
      res.k := k;
      res.input_state := state;
      return res;
   end;
	
   create ( token_buf : ANTLR_TOKEN_BUFFER{TOKEN} , k : INT ) : SAME is
      res : SAME := parser_create;
      res.k := k;
      res.token_buffer := token_buf;
      return res;
   end;
   
   create ( lexer : $ANTLR_TOKEN_STREAM{TOKEN} , k : INT ) : SAME is
      res : SAME := parser_create;
      token_buf : ANTLR_TOKEN_BUFFER{TOKEN} := #ANTLR_TOKEN_BUFFER{TOKEN}( lexer );
      res.token_buffer := token_buf;
      return res;
   end;
   
   -- Consume another token from the input stream.  Can only write sequentially!
   -- If you need 3 tokens ahead, you must consume 3 times.
   -- Note that it is possible to overwrite tokens that have not been matched.
   -- For example, calling consume 3 times when k=2, means that the first token
   -- consumed will be overwritten with the 3rd.
   
   consume is 
      input_state.input.consume;
   end;
   
   LA( i : INT ) : INT is
      return input_state.input.LA(i);
   end;
   
   LT( i : INT ) : TOKEN is
      return input_state.input.LT(i);
   end;

   private trace( ee, rname : STR ) is 
      trace_indent;
      #OUT + ee + rname;
      if ( input_state.guessing > 0 ) then
	 #OUT + "; [guessing]";
      else
	 #OUT + "; ";
      end;
      
      i : INT := 1;
      loop while! ( i <= k );
	    
	 if ( i /= 1 ) then
	    #OUT + ", ";
	 end;
	    
	 #OUT + "LA(" + i + ")=" + LT(i).text;
	    
	 i := i + 1;
      end;

      #OUT + "\n";

   end;

   trace_in ( rname : STR ) is
      trace_depth := trace_depth + 1;
      trace("> ", rname);
   end;

   trace_out( rname : STR ) is
      trace("< ", rname);
      trace_depth := trace_depth - 1;
   end;
   
end;


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -