more specctra dsn work

This commit is contained in:
dickelbeck 2008-01-04 08:28:16 +00:00
parent 36f6103b34
commit 945c14d4ea
3 changed files with 83 additions and 16 deletions

View File

@ -588,7 +588,7 @@ DSN_T LEXER::NextTok() throw (IOError)
char* cur = next;
char* head = cur;
lastTok = curTok;
prevTok = curTok;
if( curTok != T_EOF )
{
@ -613,7 +613,7 @@ L_read:
goto L_read;
// switching the string_quote character
if( lastTok == T_string_quote )
if( prevTok == T_string_quote )
{
static const wxString errtxt( _("String delimiter must be a single character of ', \", or $"));

View File

@ -527,7 +527,7 @@ class LEXER
bool space_in_quoted_tokens; ///< blank spaces within quoted strings
wxString filename;
int lastTok; ///< curTok from previous NextTok() call.
DSN_T prevTok; ///< curTok from previous NextTok() call.
int curOffset; ///< offset within current line of the current token
DSN_T curTok; ///< the current token obtained on last NextTok()
@ -640,7 +640,6 @@ public:
return curText.c_str();
}
/**
* Function CurTok
* returns whatever NextTok() returned the last time it was called.
@ -650,6 +649,15 @@ public:
return curTok;
}
/**
* Function PrevTok
* returns whatever NextTok() returned the 2nd to last time it was called.
*/
DSN_T PrevTok()
{
return prevTok;
}
/**
* Function CurOffset
* returns the char offset within the current line, using a 1 based index.

View File

@ -538,23 +538,36 @@ public:
};
/**
* Class RULE
* holds a single rule and corresponds to <rule_descriptors>
*/
class RULE : public ELEM
{
};
/**
* Class RULES
* corresponds to the <rule_descriptor> in the specctra dsn spec.
*/
class RULES : public ELEM
{
;
friend class SPECCTRA_DB;
STRINGS rules; ///< rules are saved in std::string form.
public:
RULES( ELEM* aParent ) :
ELEM( T_rule, aParent )
{
}
~RULES()
{
}
void Save( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
{
out->Print( nestLevel, "(%s\n", LEXER::GetTokenText( Type() ) );
for( STRINGS::const_iterator i = rules.begin(); i!=rules.end(); ++i )
out->Print( nestLevel+1, "%s\n", i->c_str() );
out->Print( nestLevel, ")\n" );
}
};
@ -670,6 +683,7 @@ class STRUCTURE : public ELEM
BOUNDARY* place_boundary;
VIA* via;
CONTROL* control;
RULES* rules;
typedef boost::ptr_vector<LAYER> LAYERS;
LAYERS layers;
@ -684,6 +698,7 @@ public:
place_boundary = 0;
via = 0;
control = 0;
rules = 0;
}
~STRUCTURE()
@ -693,6 +708,7 @@ public:
delete place_boundary;
delete via;
delete control;
delete rules;
}
void Save( OUTPUTFORMATTER* out, int nestLevel ) throw( IOError )
@ -722,6 +738,9 @@ public:
At(i)->Save( out, nestLevel+1 );
}
if( rules )
rules->Save( out, nestLevel+1 );
out->Print( nestLevel, ")\n" );
}
@ -910,6 +929,7 @@ class SPECCTRA_DB : public OUTPUTFORMATTER
void doVIA( VIA* growth ) throw( IOError );
void doCONTROL( CONTROL* growth ) throw( IOError );
void doLAYER( LAYER* growth ) throw( IOError );
void doRULES( RULES* growth ) throw( IOError );
public:
@ -1338,6 +1358,11 @@ L_place:
growth->layers.push_back( layer );
doLAYER( layer );
break;
case T_rule:
growth->rules = new RULES( growth );
doRULES( growth->rules );
break;
default:
unexpected( lexer->CurText() );
@ -1608,7 +1633,8 @@ void SPECCTRA_DB::doLAYER( LAYER* growth ) throw( IOError )
break;
case T_rule:
// @todo
growth->rules = new RULES( growth );
doRULES( growth->rules );
break;
case T_property:
@ -1714,6 +1740,39 @@ void SPECCTRA_DB::doLAYER( LAYER* growth ) throw( IOError )
}
void SPECCTRA_DB::doRULES( RULES* growth ) throw( IOError )
{
std::string builder;
int bracketNesting = 1; // we already saw the opening T_LEFT
while( bracketNesting != 0 )
{
DSN_T tok = nextTok();
switch( tok )
{
case T_LEFT: ++bracketNesting; break;
case T_RIGHT: --bracketNesting; break;
default:
;
}
if( bracketNesting >= 1 )
{
if( lexer->PrevTok() != T_LEFT && tok!=T_RIGHT )
builder += ' ';
builder += lexer->CurText();
}
if( bracketNesting == 1 )
{
growth->rules.push_back( builder );
builder.clear();
}
}
}
void SPECCTRA_DB::Print( int nestLevel, const char* fmt, ... ) throw( IOError )
{
va_list args;