move PCB_PARSER into PCB_IO as a member

This commit is contained in:
Dick Hollenbeck 2012-10-24 13:20:33 -05:00
parent 484eb55ae8
commit 5634bc3381
5 changed files with 64 additions and 12 deletions

View File

@ -204,12 +204,14 @@ public:
* *
* @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This * @param aKeywordTable is an array of KEYWORDS holding \a aKeywordCount. This
* token table need not contain the lexer separators such as '(' ')', etc. * token table need not contain the lexer separators such as '(' ')', etc.
*
* @param aKeywordCount is the count of tokens in aKeywordTable. * @param aKeywordCount is the count of tokens in aKeywordTable.
*
* @param aLineReader is any subclassed instance of LINE_READER, such as * @param aLineReader is any subclassed instance of LINE_READER, such as
* STRING_LINE_READER or FILE_LINE_READER. * STRING_LINE_READER or FILE_LINE_READER. No ownership is taken.
*/ */
DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount, DSNLEXER( const KEYWORD* aKeywordTable, unsigned aKeywordCount,
LINE_READER* aLineReader ); LINE_READER* aLineReader = NULL );
virtual ~DSNLEXER(); virtual ~DSNLEXER();

View File

@ -241,11 +241,12 @@ void FP_CACHE::Load()
// reader now owns fp, will close on exception or return // reader now owns fp, will close on exception or return
FILE_LINE_READER reader( fp, fpFileName ); FILE_LINE_READER reader( fp, fpFileName );
PCB_PARSER parser( &reader );
m_owner->m_parser->SetLineReader( &reader );
std::string name = TO_UTF8( fpFileName ); std::string name = TO_UTF8( fpFileName );
m_modules.insert( name, new FP_CACHE_ITEM( (MODULE*) parser.Parse(), fpFileName ) ); m_modules.insert( name, new FP_CACHE_ITEM( (MODULE*) m_owner->m_parser->Parse(), fpFileName ) );
} while( dir.GetNext( &fpFileName ) ); } while( dir.GetNext( &fpFileName ) );
@ -339,9 +340,9 @@ BOARD_ITEM* PCB_IO::Parse( const wxString& aClipboardSourceInput ) throw( IO_ERR
STRING_LINE_READER reader( input, wxT( "clipboard" ) ); STRING_LINE_READER reader( input, wxT( "clipboard" ) );
PCB_PARSER parser( &reader ); m_parser->SetLineReader( &reader );
return parser.Parse(); return m_parser->Parse();
} }
@ -1466,7 +1467,8 @@ void PCB_IO::format( ZONE_CONTAINER* aZone, int aNestLevel ) const
PCB_IO::PCB_IO() : PCB_IO::PCB_IO() :
m_cache( 0 ), m_cache( 0 ),
m_ctl( 0 ) m_ctl( 0 ),
m_parser( new PCB_PARSER() )
{ {
init( 0 ); init( 0 );
m_out = &m_sf; m_out = &m_sf;
@ -1475,7 +1477,8 @@ PCB_IO::PCB_IO() :
PCB_IO::PCB_IO( int aControlFlags ) : PCB_IO::PCB_IO( int aControlFlags ) :
m_cache( 0 ), m_cache( 0 ),
m_ctl( aControlFlags ) m_ctl( aControlFlags ),
m_parser( new PCB_PARSER() )
{ {
init( 0 ); init( 0 );
m_out = &m_sf; m_out = &m_sf;
@ -1485,6 +1488,7 @@ PCB_IO::PCB_IO( int aControlFlags ) :
PCB_IO::~PCB_IO() PCB_IO::~PCB_IO()
{ {
delete m_cache; delete m_cache;
delete m_parser;
} }
@ -1499,9 +1503,11 @@ BOARD* PCB_IO::Load( const wxString& aFileName, BOARD* aAppendToMe, PROPERTIES*
} }
FILE_LINE_READER reader( file.fp(), aFileName ); FILE_LINE_READER reader( file.fp(), aFileName );
PCB_PARSER parser( &reader, aAppendToMe );
BOARD* board = dynamic_cast<BOARD*>( parser.Parse() ); m_parser->SetLineReader( &reader );
m_parser->SetBoard( aAppendToMe );
BOARD* board = dynamic_cast<BOARD*>( m_parser->Parse() );
wxASSERT( board ); wxASSERT( board );
// Give the filename to the board if it's new // Give the filename to the board if it's new

View File

@ -30,6 +30,7 @@
class BOARD; class BOARD;
class BOARD_ITEM; class BOARD_ITEM;
class FP_CACHE; class FP_CACHE;
class PCB_PARSER;
/** Current s-expression file format version. 2 was the last legacy format version. */ /** Current s-expression file format version. 2 was the last legacy format version. */
@ -47,6 +48,8 @@ class FP_CACHE;
*/ */
class PCB_IO : public PLUGIN class PCB_IO : public PLUGIN
{ {
friend class FP_CACHE;
public: public:
@ -133,6 +136,7 @@ protected:
STRING_FORMATTER m_sf; STRING_FORMATTER m_sf;
OUTPUTFORMATTER* m_out; ///< output any Format()s to this, no ownership OUTPUTFORMATTER* m_out; ///< output any Format()s to this, no ownership
int m_ctl; int m_ctl;
PCB_PARSER* m_parser;
private: private:

View File

@ -51,6 +51,15 @@
using namespace std; using namespace std;
void PCB_PARSER::init()
{
m_layerMap.clear();
// @todo add default layernames here.
}
double PCB_PARSER::parseDouble() throw( IO_ERROR ) double PCB_PARSER::parseDouble() throw( IO_ERROR )
{ {
char* tmp; char* tmp;

View File

@ -66,6 +66,15 @@ class PCB_PARSER : public PCB_LEXER
BOARD* m_board; BOARD* m_board;
LAYER_HASH_MAP m_layerMap; //< Map layer name to it's index saved in BOARD::m_Layer. LAYER_HASH_MAP m_layerMap; //< Map layer name to it's index saved in BOARD::m_Layer.
/**
* Function init
* clears and re-establishes m_layerMap with the default layer names.
* m_layerMap will have some of its entries overwritten whenever a (new) board
* is encountered.
*/
void init();
void parseHeader() throw( IO_ERROR, PARSE_ERROR ); void parseHeader() throw( IO_ERROR, PARSE_ERROR );
void parseGeneralSection() throw( IO_ERROR, PARSE_ERROR ); void parseGeneralSection() throw( IO_ERROR, PARSE_ERROR );
void parsePAGE_INFO() throw( IO_ERROR, PARSE_ERROR ); void parsePAGE_INFO() throw( IO_ERROR, PARSE_ERROR );
@ -204,13 +213,35 @@ class PCB_PARSER : public PCB_LEXER
bool parseBool() throw( PARSE_ERROR ); bool parseBool() throw( PARSE_ERROR );
public: public:
PCB_PARSER( LINE_READER* aReader, BOARD* aBoard = NULL ) :
PCB_PARSER( LINE_READER* aReader = NULL ) :
PCB_LEXER( aReader ), PCB_LEXER( aReader ),
m_board( aBoard ) m_board( 0 )
{ {
} }
/**
* Functoin SetLineReader
* sets @a aLineReader into the parser, and returns the previous one, if any.
* @param aReader is what to read from for tokens, no ownership is received.
* @return LINE_READER* - previous LINE_READER or NULL if none.
*/
LINE_READER* SetLineReader( LINE_READER* aReader )
{
LINE_READER* ret = PopReader();
PushReader( aReader );
return ret;
}
void SetBoard( BOARD* aBoard )
{
init();
m_board = aBoard;
}
BOARD_ITEM* Parse() throw( IO_ERROR, PARSE_ERROR ); BOARD_ITEM* Parse() throw( IO_ERROR, PARSE_ERROR );
}; };