|
@@ -190,6 +190,8 @@ bool OpenDDLParser::parse() {
|
|
|
|
|
|
normalizeBuffer( m_buffer );
|
|
|
|
|
|
+ std::cout << &m_buffer[0] << std::endl;
|
|
|
+
|
|
|
m_context = new Context;
|
|
|
m_context->m_root = DDLNode::create( "root", "", ddl_nullptr );
|
|
|
pushNode( m_context->m_root );
|
|
@@ -230,7 +232,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
|
|
|
dumpId( id );
|
|
|
#endif // DEBUG_HEADER_NAME
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
Property *first( ddl_nullptr );
|
|
|
if( ddl_nullptr != id ) {
|
|
|
if( *in == '(' ) {
|
|
@@ -238,7 +240,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
|
|
|
Property *prop( ddl_nullptr ), *prev( ddl_nullptr );
|
|
|
while( *in != ')' && in != end ) {
|
|
|
in = OpenDDLParser::parseProperty( in, end, &prop );
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
|
|
|
if( *in != ',' && *in != ')' ) {
|
|
|
logInvalidTokenError( in, ")", m_logCallback );
|
|
@@ -288,21 +290,20 @@ char *OpenDDLParser::parseStructure( char *in, char *end ) {
|
|
|
}
|
|
|
|
|
|
bool error( false );
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in == '{' ) {
|
|
|
// loop over all children ( data and nodes )
|
|
|
do {
|
|
|
in = parseStructureBody( in, end, error );
|
|
|
} while ( *in != '}' );
|
|
|
in++;
|
|
|
- }
|
|
|
- else {
|
|
|
+ } else {
|
|
|
in++;
|
|
|
logInvalidTokenError( in, std::string( Grammar::OpenBracketToken ), m_logCallback );
|
|
|
error = true;
|
|
|
return in;
|
|
|
}
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
|
|
|
// pop node from stack after successful parsing
|
|
|
if( !error ) {
|
|
@@ -341,18 +342,20 @@ char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
|
|
in++;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
Value::ValueType type( Value::ddl_none );
|
|
|
size_t arrayLen( 0 );
|
|
|
in = OpenDDLParser::parsePrimitiveDataType( in, end, type, arrayLen );
|
|
|
if( Value::ddl_none != type ) {
|
|
|
- in = getNextToken( in, end );
|
|
|
+ // parse a primitive data type
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in == '{' ) {
|
|
|
Reference *refs( ddl_nullptr );
|
|
|
DataArrayList *dtArrayList( ddl_nullptr );
|
|
|
Value *values( ddl_nullptr );
|
|
|
if( 1 == arrayLen ) {
|
|
|
- in = parseDataList( in, end, &values, &refs );
|
|
|
+ size_t numRefs( 0 ), numValues( 0 );
|
|
|
+ in = parseDataList( in, end, &values, numValues, &refs, numRefs );
|
|
|
setNodeValues( top(), values );
|
|
|
setNodeReferences( top(), refs );
|
|
|
} else if( arrayLen > 1 ) {
|
|
@@ -364,13 +367,14 @@ char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in != '}' ) {
|
|
|
logInvalidTokenError( in, std::string( Grammar::CloseBracketToken ), m_logCallback );
|
|
|
} else {
|
|
|
//in++;
|
|
|
}
|
|
|
} else {
|
|
|
+ // parse a complex data type
|
|
|
in = parseNextNode( in, end );
|
|
|
}
|
|
|
|
|
@@ -428,15 +432,16 @@ void OpenDDLParser::normalizeBuffer( std::vector<char> &buffer) {
|
|
|
for( size_t readIdx = 0; readIdx<len; ++readIdx ) {
|
|
|
char *c( &buffer[readIdx] );
|
|
|
// check for a comment
|
|
|
- if( !isComment<char>( c, end ) ) {
|
|
|
+ if( !isComment<char>( c, end ) && !isNewLine( *c ) ) {
|
|
|
newBuffer.push_back( buffer[ readIdx ] );
|
|
|
} else {
|
|
|
- readIdx++;
|
|
|
- // skip the comment and the rest of the line
|
|
|
- while( !isEndofLine( buffer[ readIdx ] ) ) {
|
|
|
+ if( isComment<char>( c, end ) ) {
|
|
|
readIdx++;
|
|
|
+ // skip the comment and the rest of the line
|
|
|
+ while( !isEndofLine( buffer[ readIdx ] ) ) {
|
|
|
+ readIdx++;
|
|
|
+ }
|
|
|
}
|
|
|
- newBuffer.push_back( '\n' );
|
|
|
}
|
|
|
}
|
|
|
buffer = newBuffer;
|
|
@@ -449,7 +454,7 @@ char *OpenDDLParser::parseName( char *in, char *end, Name **name ) {
|
|
|
}
|
|
|
|
|
|
// ignore blanks
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in != '$' && *in != '%' ) {
|
|
|
return in;
|
|
|
}
|
|
@@ -479,7 +484,7 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Identifier **id ) {
|
|
|
}
|
|
|
|
|
|
// ignore blanks
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
|
|
|
// staring with a number is forbidden
|
|
|
if( isNumeric<const char>( *in ) ) {
|
|
@@ -520,7 +525,7 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
|
|
|
}
|
|
|
|
|
|
if( Value::ddl_none == type ) {
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
return in;
|
|
|
} else {
|
|
|
in += prim_len;
|
|
@@ -581,7 +586,7 @@ char *OpenDDLParser::parseBooleanLiteral( char *in, char *end, Value **boolean )
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
char *start( in );
|
|
|
size_t len( 0 );
|
|
|
while( !isSeparator( *in ) && in != end ) {
|
|
@@ -616,7 +621,7 @@ char *OpenDDLParser::parseIntegerLiteral( char *in, char *end, Value **integer,
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
char *start( in );
|
|
|
while( !isSeparator( *in ) && in != end ) {
|
|
|
in++;
|
|
@@ -652,7 +657,7 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
char *start( in );
|
|
|
while( !isSeparator( *in ) && in != end ) {
|
|
|
in++;
|
|
@@ -685,7 +690,7 @@ char *OpenDDLParser::parseStringLiteral( char *in, char *end, Value **stringData
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
size_t len( 0 );
|
|
|
char *start( in );
|
|
|
if( *start == '\"' ) {
|
|
@@ -718,7 +723,7 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in != '0' ) {
|
|
|
return in;
|
|
|
}
|
|
@@ -764,11 +769,11 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
Identifier *id( ddl_nullptr );
|
|
|
in = parseIdentifier( in, end, &id );
|
|
|
if( ddl_nullptr != id ) {
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in == '=' ) {
|
|
|
in++;
|
|
|
in = getNextToken( in, end );
|
|
@@ -797,19 +802,20 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
-char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, Reference **refs ) {
|
|
|
+char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
|
|
|
*data = ddl_nullptr;
|
|
|
+ numValues = numRefs = 0;
|
|
|
if( ddl_nullptr == in || in == end ) {
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in == '{' ) {
|
|
|
in++;
|
|
|
Value *current( ddl_nullptr ), *prev( ddl_nullptr );
|
|
|
while( '}' != *in ) {
|
|
|
current = ddl_nullptr;
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( isInteger( in, end ) ) {
|
|
|
in = parseIntegerLiteral( in, end, ¤t );
|
|
|
} else if( isFloat( in, end ) ) {
|
|
@@ -824,6 +830,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, Reference
|
|
|
if( !names.empty() ) {
|
|
|
Reference *ref = new Reference( names.size(), &names[ 0 ] );
|
|
|
*refs = ref;
|
|
|
+ numRefs = names.size();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -835,6 +842,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, Reference
|
|
|
prev->setNext( current );
|
|
|
prev = current;
|
|
|
}
|
|
|
+ numValues++;
|
|
|
}
|
|
|
|
|
|
in = getNextSeparator( in, end );
|
|
@@ -854,18 +862,20 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end, DataArrayList **da
|
|
|
return in;
|
|
|
}
|
|
|
|
|
|
- in = getNextToken( in, end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
if( *in == Grammar::OpenBracketToken[ 0 ] ) {
|
|
|
in++;
|
|
|
Value *current( ddl_nullptr );
|
|
|
Reference *refs( ddl_nullptr );
|
|
|
DataArrayList *prev( ddl_nullptr ), *currentDataList( ddl_nullptr );
|
|
|
do {
|
|
|
- in = parseDataList( in, end, ¤t, &refs );
|
|
|
+ size_t numRefs( 0 ), numValues( 0 );
|
|
|
+ in = parseDataList( in, end, ¤t, numValues, &refs, numRefs );
|
|
|
if( ddl_nullptr != current ) {
|
|
|
if( ddl_nullptr == prev ) {
|
|
|
*dataList = new DataArrayList;
|
|
|
- (*dataList)->m_dataList = current;
|
|
|
+ ( *dataList )->m_dataList = current;
|
|
|
+ ( *dataList )->m_numItems = numValues;
|
|
|
prev = *dataList;
|
|
|
} else {
|
|
|
currentDataList = new DataArrayList;
|
|
@@ -876,6 +886,8 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end, DataArrayList **da
|
|
|
}
|
|
|
}
|
|
|
} while( ',' == *in && in != end );
|
|
|
+ in = lookForNextToken( in, end );
|
|
|
+ in++;
|
|
|
}
|
|
|
|
|
|
return in;
|