|
@@ -98,6 +98,8 @@ x_cleanup_parser() {
|
|
|
%type <str> string
|
|
%type <str> string
|
|
|
%type <guid> class_id
|
|
%type <guid> class_id
|
|
|
%type <guid> optional_class_id
|
|
%type <guid> optional_class_id
|
|
|
|
|
+%type <u.separator> list_separator
|
|
|
|
|
+%type <u.node> data_reference
|
|
|
|
|
|
|
|
%%
|
|
%%
|
|
|
|
|
|
|
@@ -111,7 +113,7 @@ template:
|
|
|
TOKEN_TEMPLATE name TOKEN_OBRACE class_id
|
|
TOKEN_TEMPLATE name TOKEN_OBRACE class_id
|
|
|
{
|
|
{
|
|
|
$$ = current_node;
|
|
$$ = current_node;
|
|
|
- XFileTemplate *templ = new XFileTemplate($2, $4);
|
|
|
|
|
|
|
+ XFileTemplate *templ = new XFileTemplate(x_file, $2, $4);
|
|
|
current_node->add_child(templ);
|
|
current_node->add_child(templ);
|
|
|
current_node = templ;
|
|
current_node = templ;
|
|
|
}
|
|
}
|
|
@@ -154,7 +156,7 @@ template_members:
|
|
|
primitive:
|
|
primitive:
|
|
|
primitive_type optional_name TOKEN_SEMICOLON
|
|
primitive_type optional_name TOKEN_SEMICOLON
|
|
|
{
|
|
{
|
|
|
- current_data_def = new XFileDataDef($1, $2);
|
|
|
|
|
|
|
+ current_data_def = new XFileDataDef(x_file, $2, $1);
|
|
|
current_node->add_child(current_data_def);
|
|
current_node->add_child(current_data_def);
|
|
|
}
|
|
}
|
|
|
;
|
|
;
|
|
@@ -170,7 +172,7 @@ template_reference:
|
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
|
yyerror("Unknown template: " + $1);
|
|
yyerror("Unknown template: " + $1);
|
|
|
} else {
|
|
} else {
|
|
|
- current_data_def = new XFileDataDef(XFileDataDef::T_template, $2, xtemplate);
|
|
|
|
|
|
|
+ current_data_def = new XFileDataDef(x_file, $2, XFileDataDef::T_template, xtemplate);
|
|
|
current_node->add_child(current_data_def);
|
|
current_node->add_child(current_data_def);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -226,7 +228,7 @@ primitive_type:
|
|
|
array_data_type:
|
|
array_data_type:
|
|
|
primitive_type name
|
|
primitive_type name
|
|
|
{
|
|
{
|
|
|
- current_data_def = new XFileDataDef($1, $2);
|
|
|
|
|
|
|
+ current_data_def = new XFileDataDef(x_file, $2, $1);
|
|
|
current_node->add_child(current_data_def);
|
|
current_node->add_child(current_data_def);
|
|
|
}
|
|
}
|
|
|
| name name
|
|
| name name
|
|
@@ -235,7 +237,7 @@ array_data_type:
|
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
|
yyerror("Unknown template: " + $1);
|
|
yyerror("Unknown template: " + $1);
|
|
|
} else {
|
|
} else {
|
|
|
- current_data_def = new XFileDataDef(XFileDataDef::T_template, $2, xtemplate);
|
|
|
|
|
|
|
+ current_data_def = new XFileDataDef(x_file, $2, XFileDataDef::T_template, xtemplate);
|
|
|
current_node->add_child(current_data_def);
|
|
current_node->add_child(current_data_def);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -285,7 +287,7 @@ template_option_part:
|
|
|
DCAST(XFileTemplate, current_node)->add_option(xtemplate);
|
|
DCAST(XFileTemplate, current_node)->add_option(xtemplate);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- | name TOKEN_GUID
|
|
|
|
|
|
|
+ | name class_id
|
|
|
{
|
|
{
|
|
|
XFileTemplate *xtemplate = x_file->find_template($2);
|
|
XFileTemplate *xtemplate = x_file->find_template($2);
|
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
if (xtemplate == (XFileTemplate *)NULL) {
|
|
@@ -338,13 +340,19 @@ object:
|
|
|
yyerror("Unknown template: " + $1);
|
|
yyerror("Unknown template: " + $1);
|
|
|
} else {
|
|
} else {
|
|
|
XFileDataObjectTemplate *templ =
|
|
XFileDataObjectTemplate *templ =
|
|
|
- new XFileDataObjectTemplate(xtemplate, $2);
|
|
|
|
|
|
|
+ new XFileDataObjectTemplate(x_file, $2, xtemplate);
|
|
|
current_node->add_child(templ);
|
|
current_node->add_child(templ);
|
|
|
current_node = templ;
|
|
current_node = templ;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
optional_class_id data_parts_list TOKEN_CBRACE
|
|
optional_class_id data_parts_list TOKEN_CBRACE
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ if (!current_template->finalize_parse_data()) {
|
|
|
|
|
+ yyerror("Invalid data for object.");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
$$ = current_node;
|
|
$$ = current_node;
|
|
|
current_node = $<u.node>4;
|
|
current_node = $<u.node>4;
|
|
|
}
|
|
}
|
|
@@ -356,23 +364,53 @@ data_parts_list:
|
|
|
;
|
|
;
|
|
|
|
|
|
|
|
data_part:
|
|
data_part:
|
|
|
- data_reference
|
|
|
|
|
-{
|
|
|
|
|
|
|
+ TOKEN_OBRACE data_reference TOKEN_CBRACE
|
|
|
|
|
+{
|
|
|
|
|
+ if ($2 != (XFileNode *)NULL) {
|
|
|
|
|
+ if (!$2->is_of_type(XFileDataObjectTemplate::get_class_type())) {
|
|
|
|
|
+ // Actually, maybe you can--the docs aren't clear about this.
|
|
|
|
|
+ // But I don't think there's any real reason to.
|
|
|
|
|
+ yyerror("Can't reference primitive data type.");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ XFileDataObjectTemplate *object =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, $2);
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_object(object, true);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
| object
|
|
| object
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *object =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, $1);
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_object(object, false);
|
|
|
}
|
|
}
|
|
|
| integer_list
|
|
| integer_list
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_int($1, $<u.separator>1);
|
|
|
}
|
|
}
|
|
|
| realnum_list
|
|
| realnum_list
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_double($1, $<u.separator>1);
|
|
|
}
|
|
}
|
|
|
| string list_separator
|
|
| string list_separator
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_string($1, $2);
|
|
|
}
|
|
}
|
|
|
| list_separator
|
|
| list_separator
|
|
|
{
|
|
{
|
|
|
|
|
+ XFileDataObjectTemplate *current_template =
|
|
|
|
|
+ DCAST(XFileDataObjectTemplate, current_node);
|
|
|
|
|
+ current_template->add_parse_separator($1);
|
|
|
}
|
|
}
|
|
|
;
|
|
;
|
|
|
|
|
|
|
@@ -390,11 +428,39 @@ string:
|
|
|
|
|
|
|
|
list_separator:
|
|
list_separator:
|
|
|
TOKEN_SEMICOLON
|
|
TOKEN_SEMICOLON
|
|
|
|
|
+{
|
|
|
|
|
+ $$ = ';';
|
|
|
|
|
+}
|
|
|
| TOKEN_COMMA
|
|
| TOKEN_COMMA
|
|
|
|
|
+{
|
|
|
|
|
+ $$ = ',';
|
|
|
|
|
+}
|
|
|
;
|
|
;
|
|
|
|
|
|
|
|
data_reference:
|
|
data_reference:
|
|
|
- TOKEN_OBRACE name optional_class_id TOKEN_CBRACE
|
|
|
|
|
|
|
+ name
|
|
|
|
|
+{
|
|
|
|
|
+ XFileDataObject *data_object = x_file->find_data_object($1);
|
|
|
|
|
+ if (data_object == (XFileDataObject *)NULL) {
|
|
|
|
|
+ yyerror("Unknown data_object: " + $1);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $$ = data_object;
|
|
|
|
|
+}
|
|
|
|
|
+ | name class_id
|
|
|
|
|
+{
|
|
|
|
|
+ XFileDataObject *data_object = x_file->find_data_object($2);
|
|
|
|
|
+ if (data_object == (XFileDataObject *)NULL) {
|
|
|
|
|
+ yyerror("Unknown data_object: " + $1);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ if (data_object->get_name() != $1) {
|
|
|
|
|
+ xyywarning("GUID identifies data_object " + data_object->get_name() +
|
|
|
|
|
+ ", not " + $1);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $$ = data_object;
|
|
|
|
|
+}
|
|
|
;
|
|
;
|
|
|
|
|
|
|
|
empty:
|
|
empty:
|