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

编译器/解释器

开发平台:

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/token_stream_hidden_token_filter.sa#1 $
  7. *)
  8. class ANTLR_TOKEN_STREAM_HIDDEN_TOKEN_FILTER < $ANTLR_TOKEN_STREAM{ANTLR_COMMON_HIDDEN_STREAM_TOKEN} is
  9.    
  10.    include ANTLR_TOKEN_STREAM_BASIC_FILTER{ANTLR_COMMON_HIDDEN_STREAM_TOKEN}
  11.  create -> super_create;
  12.    
  13.    attr hide_set : INT_SET;
  14.    private attr next_monitored_token : ANTLR_COMMON_HIDDEN_STREAM_TOKEN;
  15.    -- track tail of hidden list emanating from previous
  16.    --  monitored token
  17.    private attr last_hidden_token : ANTLR_COMMON_HIDDEN_STREAM_TOKEN;
  18.    readonly attr first_hidden_token : ANTLR_COMMON_HIDDEN_STREAM_TOKEN;
  19.    create ( input : $ANTLR_TOKEN_STREAM{ANTLR_COMMON_HIDDEN_STREAM_TOKEN} ) : SAME is
  20.       res : SAME := super_create( input );
  21.       res.hide_set := #INT_SET;
  22.       return res;
  23.    end;
  24.    
  25.    consume is
  26.       next_monitored_token := input.next_token;
  27.    end;
  28.    
  29.    consume_first is
  30.       consume;
  31.       
  32.       -- Handle situation where hidden or discarded tokens
  33.       -- appear first in input stream
  34.       p : ANTLR_COMMON_HIDDEN_STREAM_TOKEN;
  35.       
  36.       -- while hidden or discarded scarf tokens
  37.       loop while!( hide_set.member( LA(1).ttype ) or discard_set.member( LA(1).ttype ) );
  38.  if ( hide_set.member( LA(1).ttype ) ) then
  39.     if ( void(p) ) then
  40.        p := LA(1);
  41.     else
  42.        p.hidden_after := LA(1);
  43.        LA(1).hidden_before(p); -- double-link
  44.        p := LA(1);
  45.     end;
  46.     last_hidden_token := p;
  47.     if ( void(first_hidden_token) ) then
  48.        first_hidden_token := p; -- record hidden token if first
  49.     end;
  50.  end;
  51.  consume;
  52.       end;
  53.    end;
  54.    hidden_after( t : ANTLR_COMMON_HIDDEN_STREAM_TOKEN ) : ANTLR_COMMON_HIDDEN_STREAM_TOKEN is
  55.       return t.hidden_after;
  56.    end;
  57.    
  58.    hidden_before( t : ANTLR_COMMON_HIDDEN_STREAM_TOKEN ) : ANTLR_COMMON_HIDDEN_STREAM_TOKEN is
  59.       return t.hidden_before;
  60.    end;
  61.    hide ( m : INT ) is
  62.       hide_set := hide_set.insert( m );
  63.    end;
  64.    
  65.    LA( i : INT ) : ANTLR_COMMON_HIDDEN_STREAM_TOKEN is
  66.       return next_monitored_token;
  67.    end;
  68.    
  69.    -- Return the next monitored token.
  70.    -- Test the token following the monitored token.
  71.    -- If following is another monitored token, save it
  72.    -- for the next invocation of nextToken (like a single
  73.    -- lookahead token) and return it then.
  74.    -- If following is unmonitored, nondiscarded (hidden)
  75.    -- channel token, add it to the monitored token.
  76.  
  77.    -- Note: EOF must be a monitored Token.
  78.  
  79.    next_token : ANTLR_COMMON_HIDDEN_STREAM_TOKEN is
  80.       -- handle an initial condition; don't want to get lookahead
  81.       -- token of this splitter until first call to nextToken
  82.       if ( void(LA(1)) ) then
  83.  consume_first;
  84.       end;
  85.       
  86.       -- we always consume hidden tokens after monitored, thus,
  87.       -- upon entry LA(1) is a monitored token
  88.       monitored : ANTLR_COMMON_HIDDEN_STREAM_TOKEN := LA(1);
  89.       -- point to hidden tokens found during last invocation
  90.       monitored.hidden_before( last_hidden_token);
  91.       last_hidden_token := void;
  92.       -- Look for hidden tokens, hook them into list emanating
  93.       -- from the monitored tokens.
  94.       consume;
  95.       
  96.       p : ANTLR_COMMON_HIDDEN_STREAM_TOKEN := monitored;
  97.       
  98.       loop while! ( hide_set.member( LA(1).ttype ) or discard_set.member( LA(1).ttype ) );
  99.  if ( hide_set.member( LA(1).ttype ) ) then
  100.     -- attach the hidden token to the monitored in a chain
  101.     -- link forwards
  102.     p.hidden_after := LA(1);
  103.     -- link backwards
  104.     if ( ~SYS::is_eq( p , monitored ) ) then
  105.        -- hidden cannot point to monitored tokens
  106.        LA(1).hidden_before(p);
  107.     end;
  108.     last_hidden_token := LA(1);
  109.     p := last_hidden_token;
  110.  end;
  111.  consume;
  112.       end;
  113.       if ( false ) then
  114.  s : STR := "result=";
  115.  if ( void(monitored) ) then
  116.     s := s + "(null)";
  117. else
  118.     s := s + monitored.str;
  119.       end;
  120.       
  121.       s := s + "nlast=";
  122.       if ( void(last_hidden_token) ) then
  123.  s := s + "(null)";
  124.       else
  125.  s := s + last_hidden_token.str;
  126.       end;
  127.       s := s + "nfirst=";
  128.       if ( void(first_hidden_token) ) then
  129.  s := s +"(null)";
  130.       else
  131.  s := s + first_hidden_token.str;
  132.       end;
  133.       s := s + "nnext=";
  134.       if ( void(next_monitored_token) ) then
  135.  s := s + "(null)";
  136.       else
  137.  s := s + next_monitored_token.str;
  138.       end;
  139.       #OUT + s + "nn";
  140.    end;
  141.       return monitored;
  142.    end;
  143. end;