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();}!
}
}