Package net.sourceforge.chaperon.model.symbol

Examples of net.sourceforge.chaperon.model.symbol.SymbolSet


  public FirstSetCollection(Grammar grammar, Log log)
  {
    this.grammar = grammar;
    this.log = log;

    SymbolSet usedsymbols = grammar.getSymbols();

    symbols = new Symbol[usedsymbols.getSymbolCount()];
    firstsets = new SymbolSet[usedsymbols.getSymbolCount()];
    for (int i = 0; i<usedsymbols.getSymbolCount(); i++)
    {
      if (log!=null)
        log.debug("Generating first set for "+usedsymbols.getSymbol(i).getName());

      symbols[i] = usedsymbols.getSymbol(i);
      firstsets[i] = first(symbols[i]);
    }
  }
View Full Code Here


   *
   * @return Set of symbols.
   */
  public SymbolSet getFirstSet(SymbolList symbols)
  {
    SymbolSet firstset = new SymbolSet();

    if (symbols.getSymbolCount()==0)
    {
      firstset.addSymbol(EMPTYLIST);
      return firstset;
    }

    int position = 0;
    do
    {
      firstset.removeSymbol(EMPTYLIST);

      if (symbols.getSymbol(position) instanceof Terminal)
        firstset.addSymbol(symbols.getSymbol(position));
      else
        firstset.addSymbol(getFirstSet(symbols.getSymbol(position)));

      position++;
    }
    while ((firstset.contains(EMPTYLIST)) && (position<symbols.getSymbolCount()));

    return firstset;
  }
View Full Code Here

   *
   * @return Set of symbol.
   */
  private SymbolSet first(Symbol symbol)
  {
    return first(symbol, new SymbolSet());
  }
View Full Code Here

   *
   * @return Set of symbols.
   */
  private SymbolSet first(Symbol symbol, SymbolSet visited)
  {
    SymbolSet firstset = new SymbolSet();

    // if the symbol is a terminal symbol
    if (symbol instanceof Terminal)
    {
      firstset.addSymbol(symbol);
      return firstset;
    }

    if (visited.contains(symbol))
      return firstset;
    else
      visited.addSymbol(symbol);

    // if is a non terminal symbol
    IntegerList productions = grammar.getProductionList(symbol);
    SymbolSet examined = new SymbolSet()// List of all examined symbols

    for (int i = 0; i<productions.getCount(); i++)
    {
      SymbolList productiondefinition = grammar.getProduction(productions.get(i)).getDefinition();
      if (productiondefinition.getSymbolCount()==0)

        // Symbol for a empty firstset added
        firstset.addSymbol(EMPTYLIST);
      else
      {
        // for every symbol in the production
        int j = 0;
        Symbol newsymbol;
        boolean foundEmptyList;
        do
        {
          foundEmptyList = true;
          newsymbol = productiondefinition.getSymbol(j);
          if (newsymbol instanceof Terminal)

            // if a terminal symbol
            firstset.addSymbol(newsymbol);
          else if (!newsymbol.equals(symbol))
          {
            // and if a non terminal symbol
            if (!examined.contains(newsymbol))
            {
              SymbolSet newfirstset = first(newsymbol, visited);
              foundEmptyList = newfirstset.contains(EMPTYLIST);
              for (int k = 0; k<newfirstset.getSymbolCount(); k++)
                if (!newfirstset.getSymbol(k).equals(EMPTYLIST))
                  firstset.addSymbol(newfirstset.getSymbol(k));

              examined.addSymbol(newsymbol);
            }
          }

View Full Code Here

   */
  public String toString()
  {
    StringBuffer buffer = new StringBuffer();

    SymbolSet symbols = grammar.getSymbols();

    for (int symbol = 0; symbol<symbols.getSymbolCount(); symbol++)
    {
      buffer.append("first(");
      buffer.append(symbols.getSymbol(symbol).toString());
      buffer.append(")=");
      buffer.append(getFirstSet(symbols.getSymbol(symbol)).toString());
      buffer.append("\n");
    }

    return buffer.toString();
  }
View Full Code Here

  {
    this.grammar = grammar;
    this.firstsets = firstsets;
    this.log = log;

    SymbolSet usedsymbols = grammar.getSymbols();

    symbols = new Symbol[usedsymbols.getSymbolCount()];
    followsets = new SymbolSet[usedsymbols.getSymbolCount()];
    for (int i = 0; i<usedsymbols.getSymbolCount(); i++)
    {
      if (log!=null)
        log.debug("Generating follow set for "+usedsymbols.getSymbol(i).getName());

      symbols[i] = usedsymbols.getSymbol(i);
      followsets[i] = follow(symbols[i]);
    }
  }
View Full Code Here

  private SymbolSet follow(Symbol symbol)
  {
    System.out.println();
    System.out.println("Calculate FOLLOW set for "+symbol);

    SymbolSet followset = new SymbolSet();

    // if symbol is start symbol, then add symbol for end of file
    if (symbol.equals(grammar.getStartSymbol()))
      followset.addSymbol(new EndOfFile());

    // if production A -> a B b exists, then add every symbol of
    // FIRST(b) except the symbol for an empty list to FOLLOW(B)
    SymbolList definition;
    for (int production = 0; production<grammar.getProductionCount(); production++)
    {
      definition = grammar.getProduction(production).getDefinition();
      for (int position = 0; position<definition.getSymbolCount(); position++)
        if (definition.getSymbol(position).equals(symbol))
        {
          System.out.println("Found "+symbol+" at position "+position+" in production "+production);

          SymbolSet firstset = null;
          if ((position+1)<definition.getSymbolCount())
          {
            SymbolList rest = new SymbolList();
            for (int restposition = position+1; restposition<definition.getSymbolCount();
                 restposition++)
              rest.addSymbol(definition.getSymbol(restposition));

            firstset = firstsets.getFirstSet(rest);

            System.out.println("first("+rest+")="+firstset);

            followset.addSymbol(firstset);
            followset.removeSymbol(EMPTYLIST);
          }

          if ((position+1)==definition.getSymbolCount())
            System.out.println(symbol+" is last symbol of production "+production);

          // if a production A -> a B or A -> a B b exist and FIRST(b)
          // contains the symbol for an empty list, then every symbol
          // of FOLLOW(A) belongs to FOLLOW(B)
          if ((((position+1)==definition.getSymbolCount()) || (firstset.contains(EMPTYLIST))) &&
              (!grammar.getProduction(production).getSymbol().equals(symbol)))
            followset.addSymbol(follow(grammar.getProduction(production).getSymbol()));
        }
    }
View Full Code Here

   */
  public String toString()
  {
    StringBuffer buffer = new StringBuffer();

    SymbolSet symbols = grammar.getSymbols();

    for (int symbol = 0; symbol<symbols.getSymbolCount(); symbol++)
    {
      buffer.append("follow(");
      buffer.append(symbols.getSymbol(symbol).toString());
      buffer.append(")=");
      buffer.append(getFollowSet(symbols.getSymbol(symbol)).toString());
      buffer.append("\n");
    }

    return buffer.toString();
  }
View Full Code Here

    return EMPTYLIST;
  }

  public SymbolSet getNextTerminals()
  {
    SymbolSet set = new SymbolSet();

    SymbolList productiondefinition;
    for (int item = 0; item<productions.length; item++)
      if ((positions[item]<((productiondefinition = productions[item].getDefinition()).getSymbolCount())) &&
          (productiondefinition.getSymbol(positions[item]) instanceof Terminal))
        set.addSymbol(productiondefinition.getSymbol(positions[item]));

    return set;
  }
View Full Code Here

    return set;
  }

  public SymbolSet getNextNonterminals()
  {
    SymbolSet set = new SymbolSet();

    SymbolList productiondefinition;
    for (int item = 0; item<productions.length; item++)
      if ((positions[item]<((productiondefinition = productions[item].getDefinition()).getSymbolCount())) &&
          (productiondefinition.getSymbol(positions[item]) instanceof Nonterminal))
        set.addSymbol(productiondefinition.getSymbol(positions[item]));

    return set;
  }
View Full Code Here

TOP

Related Classes of net.sourceforge.chaperon.model.symbol.SymbolSet

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.