FileDocCategorySizeDatePackage
lr_item_core.javaAPI DocJava SE 5 API8121Fri Aug 26 14:54:54 BST 2005com.sun.java_cup.internal

lr_item_core

public class lr_item_core extends Object
The "core" of an LR item. This includes a production and the position of a marker (the "dot") within the production. Typically item cores are written using a production with an embedded "dot" to indicate their position. For example:
A ::= B * C d E
This represents a point in a parse where the parser is trying to match the given production, and has succeeded in matching everything before the "dot" (and hence is expecting to see the symbols after the dot next). See lalr_item, lalr_item_set, and lalr_start for full details on the meaning and use of items.
see
com.sun.java_cup.internal.lalr_item
see
com.sun.java_cup.internal.lalr_item_set
see
com.sun.java_cup.internal.lalr_state
version
last updated: 11/25/95
author
Scott Hudson

Fields Summary
protected production
_the_production
The production for the item.
protected int
_dot_pos
The position of the "dot" -- this indicates the part of the production that the marker is before, so 0 indicates a dot at the beginning of the RHS.
protected int
_core_hash_cache
Cache of the hash code.
protected symbol
_symbol_after_dot
Cache of symbol after the dot.
Constructors Summary
public lr_item_core(production prod, int pos)
Full constructor.

param
prod production this item uses.
param
pos position of the "dot" within the item.

      symbol          after_dot = null;
      production_part part;

      if (prod == null)
	throw new internal_error(
	  "Attempt to create an lr_item_core with a null production");

      _the_production = prod;

      if (pos < 0 || pos > _the_production.rhs_length())
	throw new internal_error(
	  "Attempt to create an lr_item_core with a bad dot position");

      _dot_pos = pos;

      /* compute and cache hash code now */
      _core_hash_cache = 13*_the_production.hashCode() + pos;

      /* cache the symbol after the dot */
      if (_dot_pos < _the_production.rhs_length())
	{
	  part = _the_production.rhs(_dot_pos);
	  if (!part.is_action())
	    _symbol_after_dot = ((symbol_part)part).the_symbol();
	}
    
public lr_item_core(production prod)
Constructor for dot at start of right hand side.

param
prod production this item uses.

      this(prod,0);
    
Methods Summary
public booleancore_equals(com.sun.java_cup.internal.lr_item_core other)
Equality comparison for the core only. This is separate out because we need separate access in a super class.

      return other != null && 
	     _the_production.equals(other._the_production) && 
	     _dot_pos == other._dot_pos;
    
public intcore_hashCode()
Hash code for the core (separated so we keep non overridden version).

      return _core_hash_cache;
    
public booleandot_at_end()
Is the dot at the end of the production?


  /*. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .*/

            
     
    
       return _dot_pos >= _the_production.rhs_length();
    
public non_terminaldot_before_nt()
Determine if we have a dot before a non terminal, and if so which one (return null or the non terminal).

      symbol sym;

      /* get the symbol after the dot */
      sym = symbol_after_dot();

      /* if it exists and is a non terminal, return it */
      if (sym != null && sym.is_non_term())
	return (non_terminal)sym;
      else
	return null;
    
public intdot_pos()
The position of the "dot" -- this indicates the part of the production that the marker is before, so 0 indicates a dot at the beginning of the RHS.

return _dot_pos;
public booleanequals(com.sun.java_cup.internal.lr_item_core other)
Equality comparison.

return core_equals(other);
public booleanequals(java.lang.Object other)
Generic equality comparison.

      if (!(other instanceof lr_item_core))
	return false;
      else
	return equals((lr_item_core)other);
    
public inthashCode()
Hash code for the item.

      return _core_hash_cache;
    
protected intobj_hash()
Return the hash code that object would have provided for us so we have a (nearly) unique id for debugging.

      return super.hashCode();
    
public com.sun.java_cup.internal.lr_item_coreshift_core()
Produce a new lr_item_core that results from shifting the dot one position to the right.

      if (dot_at_end()) 
	throw new internal_error(
	  "Attempt to shift past end of an lr_item_core");

      return new lr_item_core(_the_production, _dot_pos+1);
    
public symbolsymbol_after_dot()
Return the symbol after the dot. If there is no symbol after the dot we return null.

      /* use the cached symbol */
      return _symbol_after_dot;
    
public productionthe_production()
The production for the item.

return _the_production;
public java.lang.StringtoString()
Convert to a string

      /* can't throw here since super class doesn't, so we crash instead */
      try {
        return to_simple_string();
      } catch(internal_error e) {
	e.crash();
	return null;
      }
    
public java.lang.Stringto_simple_string()
Convert to a string (separated out from toString() so we can call it from subclass that overrides toString()).

      String result;
      production_part part;

      if (_the_production.lhs() != null && 
	  _the_production.lhs().the_symbol() != null &&
	  _the_production.lhs().the_symbol().name() != null)
	result = _the_production.lhs().the_symbol().name();
      else
	result = "$$NULL$$";

      result += " ::= ";

      for (int i = 0; i<_the_production.rhs_length(); i++)
	{
	  /* do we need the dot before this one? */
	  if (i == _dot_pos)
	    result += "(*) ";
	  
	  /* print the name of the part */
	  if (_the_production.rhs(i) == null)
	    {
	      result += "$$NULL$$ ";
	    }
	  else
	    {
	      part = _the_production.rhs(i);
	      if (part == null)
		result += "$$NULL$$ ";
	      else if (part.is_action())
		result += "{ACTION} ";
	      else if (((symbol_part)part).the_symbol() != null &&
                       ((symbol_part)part).the_symbol().name() != null)
		result += ((symbol_part)part).the_symbol().name() + " ";
	      else
		result += "$$NULL$$ ";
	    }
	}

      /* put the dot after if needed */
      if (_dot_pos == _the_production.rhs_length())
	result += "(*) ";

      return result;