www.pudn.com > cppcc.rar > cppcc.cg


/* -*-c++-*- */

/*
 *  File:       cppcc.cg
 *              $Id: cppcc.cg,v 1.2 2002/07/09 08:54:51 alec Exp $
 *
 *  Author:     Alec Panoviciu (alecu@email.com)
 *
 *  Comments:
 *
 *  Revision history:
 *
 *  $Log: cppcc.cg,v $
 *  Revision 1.2  2002/07/09 08:54:51  alec
 *  0.0.3 stuff
 *
 *  Revision 1.1  2002/06/23 23:41:17  alec
 *  *** empty log message ***
 *
 *  Revision 1.1  2002/06/23 23:52:41  alec
 *  Initial revision
 *
 */


/*
 * This file is Public Domain software. Use it as you wish and in good
 * health.
 */

/*
 * This is the CppCC's input grammar, as described in the User's Guide.
 */

OPTIONS
{
  DEBUG_SCANNER = true;
  DEBUG_PARSER = true;
}

TOKEN CppccToken
{}

SCANNER CppccScanner
{
 SKIP
{
  
   { newLine(); }
  
}
  
 MORE
{
   { pushState(S_LONG_COMMENT); }
}

 MORE
{
   { newLine(); }
  
  
}

 SKIP
{
   { popState(); }
}


/* THE KEYWORDS */

 KEYWORD
{
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  " >
  
  
  
  
  
  
  
  
  
  
  
  
  
}

 TOKEN
{
  <#ESCAPE_SEQ: "\\" (~['\n'] | ['0'-'7'] ['0'-'7']? ['0'-'7']? ) >
   ) "\'" >
   )* "\"" >
  
  <#DIGIT: ['0'-'9'] >
  <#LETTER: ['a'-'z','A'-'Z'] >
  <#LETTERU:  | "_" >
  + >
   (|)* >
}

/*
 * This part deals with retrieving blocks of user code and the like.
 */
{
  char nest, unnest;
  bool unput;
  int nestLevel;
  string dumbToken;
  
 public:
  
  bool enterDumbMode (char nest_, char unnest_, bool unput_)
    {
      nest = nest_;
      unnest = unnest_;
      unput = unput_;
      pushState(DUMBO);
      nestLevel = 1;
      dumbToken.resize(0);
      return true;
    }
}

 SKIP
{
  
    {
      dumbToken.append(token->image());
    }

  
    {
      dumbToken.append(token->image());
      newLine();
    }

  
    {
      dumbToken.append(token->image());
    }
  
   ) "\'" >
    {
      dumbToken.append(token->image());
    }
  
   )* "\"" >
    {
      dumbToken.append(token->image());
    }
  
  
    {
      dumbToken.append(token->image());
      pushState(d_S_LONG_COMMENT);
    }
}

 SKIP
{
  
    {
      dumbToken.append(token->image());
      newLine();
    }
  
    {
      dumbToken.append(token->image());
    }
                    
  
    {
      dumbToken.append(token->image());
    }
}

 SKIP
{
  
    {
      dumbToken.append(token->image());
      popState();
    }
}

 TOKEN
{
   //thats a bug in the frontend !
  {
    char c = token->image()[0];
    cerr << "dumbt: " << token->image() << endl;
    if (c == unnest)
    {
      nestLevel--;
      if (nestLevel == 0) {
        if (unput) unGetChar(c);
        cerr << "dumb mode got: " << dumbToken << endl;
      } else {
        dumbToken.push_back(c);
        rejectToken();
      }
    } else {
      if (c == nest) nestLevel++;
      dumbToken.push_back(c);
      rejectToken();
    }
  }
}

}

PARSER CppccParser
{

  () grammarFile ()
    {
      optionsSection() ?
      tokenCustomizationSection()
      lexicalSection()
      syntaxSection()
    }
  

  () optionsSection ()
    {
        optionLine()* 
    }

  () optionLine ()
    {
        ( |  | ) ?
    }


  () tokenCustomizationSection ()
    {
      cBlock()?   cInheritance()? cBlock()
    }


  () lexicalSection ()
    {
      cBlock()?   cInheritance()?
         scannerDecl()+ 
    }

  () scannerDecl ()
    {
       cBlock()
     | lexicalStatesList()? tokKind()  tokenDecl()+ 
     |   + 
    }

  () lexicalStatesList ()
    {
       (  ( )* | ) 
    }

  () tokKind ()
    {
       |  |  | 
    }

  () tokenDecl ()
    {
      
         (    tokenRegexp()  cBlock()?
          |    tokenRegexp() 
         )
    }
    
  () tokenRegexp ()
    {
      regexpOrList()
    }

  () regexpOrList ()
    {
      regexpCatList() ( regexpCatList())*
    }

  () regexpCatList ()
    {
      regexpTerm()+
    }

  () regexpTerm ()
    {
      regexpAtom() ( |  | )?
    }

  () regexpAtom ()
    {
       |    | characterList()
         |  regexpOrList() 
    }

  () characterList ()
    {
      ? 
                  characterDescriptor() ( characterDescriptor())*
               
    }

  () characterDescriptor ()
    {
       ( )?
    }



  () syntaxSection ()
    {
      cBlock()?   cInheritance()?
         parserDecl()+ 
    }

  () parserDecl ()
    {
      cBlock() | production()
    }

  () production ()
    {
      cParenList()  cParenList() throwClause()?
          (LOOKAHEAD(cBlock()) cBlock())? orList()? 
    }

  () throwClause ()
    {
       cParenList()
    }

  () orList ()
    {
      catList() ( catList())*
    }

  () catList ()
    {
      expansion()+
    }

  () expansion ()
    {
      lookahead()?
        (cBlock() ?)?
        factor()
        catchClauses()?
        (LOOKAHEAD(cBlock()) (cBlock() ?))?
    }

  () lookahead ()
    {
       
      (
          ( orList() ( cBlock())? )?
       | LOOKAHEAD(orList()) (orList() ( cBlock())?)
       | cBlock()
      )
      
    }

  () factor ()
    {
      (
         (LOOKAHEAD(2) ( ))?  cParenList()
       |   
       |  orList() 
      ) ( |  | )?
    }

  () catchClauses ()
    {
      ( cParenList() cBlock())+
    }
  

  () cParenList ()
    {
       {scanner.enterDumbMode('(', ')', false);
                scanner.la(); scanner.popState();}!
      
    }

  () cInheritance ()
    {
       {scanner.enterDumbMode('}', '{', true);
                 scanner.la(); scanner.popState();}!
      
                                                             
    }

  () cBlock ()
    {
       {scanner.enterDumbMode('{', '}', false);
                scanner.la(); scanner.popState();}!
      
    }
}