|
@@ -21,6 +21,7 @@ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
-----------------------------------------------------------------------------------------------*/
|
|
-----------------------------------------------------------------------------------------------*/
|
|
|
#include <openddlparser/OpenDDLParser.h>
|
|
#include <openddlparser/OpenDDLParser.h>
|
|
|
|
|
+#include <openddlparser/OpenDDLExport.h>
|
|
|
|
|
|
|
|
#include <cassert>
|
|
#include <cassert>
|
|
|
#include <iostream>
|
|
#include <iostream>
|
|
@@ -36,17 +37,18 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
|
|
|
|
BEGIN_ODDLPARSER_NS
|
|
BEGIN_ODDLPARSER_NS
|
|
|
|
|
|
|
|
-static const char *Version = "0.1.0";
|
|
|
|
|
|
|
+static const char *Version = "0.3.0";
|
|
|
|
|
|
|
|
namespace Grammar {
|
|
namespace Grammar {
|
|
|
- static const char * const OpenBracketToken = "{";
|
|
|
|
|
- static const char * const CloseBracketToken = "}";
|
|
|
|
|
- static const char * const OpenPropertyToken = "(";
|
|
|
|
|
- static const char * const ClosePropertyToken = ")";
|
|
|
|
|
- static const char * const BoolTrue = "true";
|
|
|
|
|
- static const char * const BoolFalse = "false";
|
|
|
|
|
- static const char * const RefToken = "ref";
|
|
|
|
|
- static const char * const CommaSeparator = ",";
|
|
|
|
|
|
|
+ static const char *OpenBracketToken = "{";
|
|
|
|
|
+ static const char *CloseBracketToken = "}";
|
|
|
|
|
+ static const char *OpenPropertyToken = "(";
|
|
|
|
|
+ static const char *ClosePropertyToken = ")";
|
|
|
|
|
+ static const char *OpenArrayToken = "[";
|
|
|
|
|
+ static const char *CloseArrayToken = "]";
|
|
|
|
|
+ static const char *BoolTrue = "true";
|
|
|
|
|
+ static const char *BoolFalse = "false";
|
|
|
|
|
+ static const char *CommaSeparator = ",";
|
|
|
|
|
|
|
|
static const char* PrimitiveTypeToken[ Value::ddl_types_max ] = {
|
|
static const char* PrimitiveTypeToken[ Value::ddl_types_max ] = {
|
|
|
"bool",
|
|
"bool",
|
|
@@ -66,6 +68,9 @@ namespace Grammar {
|
|
|
};
|
|
};
|
|
|
} // Namespace Grammar
|
|
} // Namespace Grammar
|
|
|
|
|
|
|
|
|
|
+const char *getTypeToken( Value::ValueType type ) {
|
|
|
|
|
+ return Grammar::PrimitiveTypeToken[ type ];
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
|
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
|
|
std::stringstream stream;
|
|
std::stringstream stream;
|
|
@@ -206,6 +211,17 @@ bool OpenDDLParser::parse() {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+bool OpenDDLParser::exportContext( Context *ctx, const std::string &filename ) {
|
|
|
|
|
+ if( ddl_nullptr == ctx ) {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ OpenDDLExport myExporter;
|
|
|
|
|
+ return myExporter.exportContext( ctx, filename );
|
|
|
|
|
+
|
|
|
|
|
+ return false;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
|
char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
|
|
in = parseHeader( in, end );
|
|
in = parseHeader( in, end );
|
|
|
in = parseStructure( in, end );
|
|
in = parseStructure( in, end );
|
|
@@ -215,7 +231,8 @@ char *OpenDDLParser::parseNextNode( char *in, char *end ) {
|
|
|
|
|
|
|
|
static void dumpId( Identifier *id ) {
|
|
static void dumpId( Identifier *id ) {
|
|
|
if( ddl_nullptr != id ) {
|
|
if( ddl_nullptr != id ) {
|
|
|
- std::cout << id->m_text.m_buffer << std::endl;
|
|
|
|
|
|
|
+ if ( ddl_nullptr != id->m_text.m_buffer ) { }
|
|
|
|
|
+ std::cout << id->m_text.m_buffer << std::endl;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -234,19 +251,19 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
|
|
|
in = lookForNextToken( in, end );
|
|
in = lookForNextToken( in, end );
|
|
|
Property *first( ddl_nullptr );
|
|
Property *first( ddl_nullptr );
|
|
|
if( ddl_nullptr != id ) {
|
|
if( ddl_nullptr != id ) {
|
|
|
- if( *in == '(' ) {
|
|
|
|
|
|
|
+ if( *in == Grammar::OpenPropertyToken[ 0 ] ) {
|
|
|
in++;
|
|
in++;
|
|
|
Property *prop( ddl_nullptr ), *prev( ddl_nullptr );
|
|
Property *prop( ddl_nullptr ), *prev( ddl_nullptr );
|
|
|
- while( *in != ')' && in != end ) {
|
|
|
|
|
|
|
+ while( *in != Grammar::ClosePropertyToken[ 0 ] && in != end ) {
|
|
|
in = OpenDDLParser::parseProperty( in, end, &prop );
|
|
in = OpenDDLParser::parseProperty( in, end, &prop );
|
|
|
in = lookForNextToken( in, end );
|
|
in = lookForNextToken( in, end );
|
|
|
|
|
|
|
|
- if( *in != ',' && *in != ')' ) {
|
|
|
|
|
- logInvalidTokenError( in, ")", m_logCallback );
|
|
|
|
|
|
|
+ if( *in != Grammar::CommaSeparator[ 0 ] && *in != Grammar::ClosePropertyToken[ 0 ] ) {
|
|
|
|
|
+ logInvalidTokenError( in, Grammar::ClosePropertyToken, m_logCallback );
|
|
|
return in;
|
|
return in;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if( ddl_nullptr != prop && *in != ',' ) {
|
|
|
|
|
|
|
+ if( ddl_nullptr != prop && *in != Grammar::CommaSeparator[ 0 ] ) {
|
|
|
if( ddl_nullptr == first ) {
|
|
if( ddl_nullptr == first ) {
|
|
|
first = prop;
|
|
first = prop;
|
|
|
}
|
|
}
|
|
@@ -348,13 +365,13 @@ char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
|
|
if( Value::ddl_none != type ) {
|
|
if( Value::ddl_none != type ) {
|
|
|
// parse a primitive data type
|
|
// parse a primitive data type
|
|
|
in = lookForNextToken( in, end );
|
|
in = lookForNextToken( in, end );
|
|
|
- if( *in == '{' ) {
|
|
|
|
|
|
|
+ if( *in == Grammar::OpenBracketToken[ 0 ] ) {
|
|
|
Reference *refs( ddl_nullptr );
|
|
Reference *refs( ddl_nullptr );
|
|
|
DataArrayList *dtArrayList( ddl_nullptr );
|
|
DataArrayList *dtArrayList( ddl_nullptr );
|
|
|
Value *values( ddl_nullptr );
|
|
Value *values( ddl_nullptr );
|
|
|
if( 1 == arrayLen ) {
|
|
if( 1 == arrayLen ) {
|
|
|
size_t numRefs( 0 ), numValues( 0 );
|
|
size_t numRefs( 0 ), numValues( 0 );
|
|
|
- in = parseDataList( in, end, &values, numValues, &refs, numRefs );
|
|
|
|
|
|
|
+ in = parseDataList( in, end, type, &values, numValues, &refs, numRefs );
|
|
|
setNodeValues( top(), values );
|
|
setNodeValues( top(), values );
|
|
|
setNodeReferences( top(), refs );
|
|
setNodeReferences( top(), refs );
|
|
|
} else if( arrayLen > 1 ) {
|
|
} else if( arrayLen > 1 ) {
|
|
@@ -435,10 +452,10 @@ void OpenDDLParser::normalizeBuffer( std::vector<char> &buffer) {
|
|
|
newBuffer.push_back( buffer[ readIdx ] );
|
|
newBuffer.push_back( buffer[ readIdx ] );
|
|
|
} else {
|
|
} else {
|
|
|
if( isComment<char>( c, end ) ) {
|
|
if( isComment<char>( c, end ) ) {
|
|
|
- readIdx++;
|
|
|
|
|
|
|
+ ++readIdx;
|
|
|
// skip the comment and the rest of the line
|
|
// skip the comment and the rest of the line
|
|
|
while( !isEndofLine( buffer[ readIdx ] ) ) {
|
|
while( !isEndofLine( buffer[ readIdx ] ) ) {
|
|
|
- readIdx++;
|
|
|
|
|
|
|
+ ++readIdx;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -493,9 +510,9 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Identifier **id ) {
|
|
|
// get size of id
|
|
// get size of id
|
|
|
size_t idLen( 0 );
|
|
size_t idLen( 0 );
|
|
|
char *start( in );
|
|
char *start( in );
|
|
|
- while( !isSeparator( *in ) && !isNewLine( *in ) && ( in != end ) && *in != '(' && *in != ')' ) {
|
|
|
|
|
- in++;
|
|
|
|
|
- idLen++;
|
|
|
|
|
|
|
+ while( !isSeparator( *in ) && !isNewLine( *in ) && ( in != end ) && *in != Grammar::OpenPropertyToken[ 0 ] && *in != Grammar::ClosePropertyToken[ 0 ] ) {
|
|
|
|
|
+ ++in;
|
|
|
|
|
+ ++idLen;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
const size_t len( idLen );
|
|
const size_t len( idLen );
|
|
@@ -529,14 +546,14 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
bool ok( true );
|
|
bool ok( true );
|
|
|
- if( *in == '[' ) {
|
|
|
|
|
|
|
+ if( *in == Grammar::OpenArrayToken[ 0 ] ) {
|
|
|
ok = false;
|
|
ok = false;
|
|
|
in++;
|
|
in++;
|
|
|
char *start( in );
|
|
char *start( in );
|
|
|
while ( in != end ) {
|
|
while ( in != end ) {
|
|
|
in++;
|
|
in++;
|
|
|
- if( *in == ']' ) {
|
|
|
|
|
- len = atoi( start );
|
|
|
|
|
|
|
+ if( *in == Grammar::CloseArrayToken[ 0 ] ) {
|
|
|
|
|
+ len = ::atoi( start );
|
|
|
ok = true;
|
|
ok = true;
|
|
|
in++;
|
|
in++;
|
|
|
break;
|
|
break;
|
|
@@ -562,9 +579,9 @@ char *OpenDDLParser::parseReference( char *in, char *end, std::vector<Name*> &na
|
|
|
if( nextName ) {
|
|
if( nextName ) {
|
|
|
names.push_back( nextName );
|
|
names.push_back( nextName );
|
|
|
}
|
|
}
|
|
|
- while( ',' == *in ) {
|
|
|
|
|
|
|
+ while( Grammar::CommaSeparator[ 0 ] == *in ) {
|
|
|
in = getNextSeparator( in, end );
|
|
in = getNextSeparator( in, end );
|
|
|
- if( ',' == *in ) {
|
|
|
|
|
|
|
+ if( Grammar::CommaSeparator[ 0 ] == *in ) {
|
|
|
in = parseName( in, end, &nextName );
|
|
in = parseName( in, end, &nextName );
|
|
|
if( nextName ) {
|
|
if( nextName ) {
|
|
|
names.push_back( nextName );
|
|
names.push_back( nextName );
|
|
@@ -802,7 +819,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
|
|
return in;
|
|
return in;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
|
|
|
|
|
|
|
+char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type, Value **data, size_t &numValues, Reference **refs, size_t &numRefs ) {
|
|
|
*data = ddl_nullptr;
|
|
*data = ddl_nullptr;
|
|
|
numValues = numRefs = 0;
|
|
numValues = numRefs = 0;
|
|
|
if( ddl_nullptr == in || in == end ) {
|
|
if( ddl_nullptr == in || in == end ) {
|
|
@@ -816,21 +833,35 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &n
|
|
|
while( '}' != *in ) {
|
|
while( '}' != *in ) {
|
|
|
current = ddl_nullptr;
|
|
current = ddl_nullptr;
|
|
|
in = lookForNextToken( in, end );
|
|
in = lookForNextToken( in, end );
|
|
|
- if( isInteger( in, end ) ) {
|
|
|
|
|
- in = parseIntegerLiteral( in, end, ¤t );
|
|
|
|
|
- } else if( isFloat( in, end ) ) {
|
|
|
|
|
- in = parseFloatingLiteral( in, end, ¤t );
|
|
|
|
|
- } else if( isStringLiteral( *in ) ) {
|
|
|
|
|
- in = parseStringLiteral( in, end, ¤t );
|
|
|
|
|
- } else if( isHexLiteral( in, end ) ) {
|
|
|
|
|
- in = parseHexaLiteral( in, end, ¤t );
|
|
|
|
|
- } else { // reference data
|
|
|
|
|
- std::vector<Name*> names;
|
|
|
|
|
- in = parseReference( in, end, names );
|
|
|
|
|
- if( !names.empty() ) {
|
|
|
|
|
- Reference *ref = new Reference( names.size(), &names[ 0 ] );
|
|
|
|
|
- *refs = ref;
|
|
|
|
|
- numRefs = names.size();
|
|
|
|
|
|
|
+ if (Value::ddl_none == type) {
|
|
|
|
|
+ if (isInteger( in, end )) {
|
|
|
|
|
+ in = parseIntegerLiteral( in, end, ¤t );
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (isFloat( in, end )) {
|
|
|
|
|
+ in = parseFloatingLiteral( in, end, ¤t );
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (isStringLiteral( *in )) {
|
|
|
|
|
+ in = parseStringLiteral( in, end, ¤t );
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (isHexLiteral( in, end )) {
|
|
|
|
|
+ in = parseHexaLiteral( in, end, ¤t );
|
|
|
|
|
+ }
|
|
|
|
|
+ else { // reference data
|
|
|
|
|
+ std::vector<Name*> names;
|
|
|
|
|
+ in = parseReference( in, end, names );
|
|
|
|
|
+ if (!names.empty()) {
|
|
|
|
|
+ Reference *ref = new Reference( names.size(), &names[ 0 ] );
|
|
|
|
|
+ *refs = ref;
|
|
|
|
|
+ numRefs = names.size();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (Value::ddl_int32 == type) {
|
|
|
|
|
+ in = parseIntegerLiteral( in, end, ¤t );
|
|
|
|
|
+ } else if (Value::ddl_float == type) {
|
|
|
|
|
+ in = parseFloatingLiteral( in, end, ¤t );
|
|
|
|
|
+ } else if (Value::ddl_string == type) {
|
|
|
|
|
+ in = parseStringLiteral( in, end, ¤t );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -846,7 +877,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value **data, size_t &n
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
in = getNextSeparator( in, end );
|
|
in = getNextSeparator( in, end );
|
|
|
- if( ',' != *in && '}' != *in && !isSpace( *in ) ) {
|
|
|
|
|
|
|
+ if( ',' != *in && Grammar::CloseBracketToken[ 0 ] != *in && !isSpace( *in ) ) {
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -879,7 +910,8 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end, DataArrayList **da
|
|
|
do {
|
|
do {
|
|
|
size_t numRefs( 0 ), numValues( 0 );
|
|
size_t numRefs( 0 ), numValues( 0 );
|
|
|
currentValue = ddl_nullptr;
|
|
currentValue = ddl_nullptr;
|
|
|
- in = parseDataList( in, end, ¤tValue, numValues, &refs, numRefs );
|
|
|
|
|
|
|
+ Value::ValueType type( Value::ddl_none );
|
|
|
|
|
+ in = parseDataList( in, end, type, ¤tValue, numValues, &refs, numRefs );
|
|
|
if( ddl_nullptr != currentValue ) {
|
|
if( ddl_nullptr != currentValue ) {
|
|
|
if( ddl_nullptr == prev ) {
|
|
if( ddl_nullptr == prev ) {
|
|
|
*dataList = createDataArrayList( currentValue, numValues );
|
|
*dataList = createDataArrayList( currentValue, numValues );
|