|
@@ -100,6 +100,8 @@ static void free_value (struct value o) { if (o.have) NCDValue_Free(&o.v); }
|
|
|
%type list { struct value }
|
|
%type list { struct value }
|
|
|
%type map_contents { struct value }
|
|
%type map_contents { struct value }
|
|
|
%type map { struct value }
|
|
%type map { struct value }
|
|
|
|
|
+%type invoc { struct value }
|
|
|
|
|
+%type noninvoc_value { struct value }
|
|
|
%type value { struct value }
|
|
%type value { struct value }
|
|
|
%type name_maybe { char * }
|
|
%type name_maybe { char * }
|
|
|
%type process_or_template { int }
|
|
%type process_or_template { int }
|
|
@@ -117,6 +119,8 @@ static void free_value (struct value o) { if (o.have) NCDValue_Free(&o.v); }
|
|
|
%destructor list { free_value($$); }
|
|
%destructor list { free_value($$); }
|
|
|
%destructor map_contents { free_value($$); }
|
|
%destructor map_contents { free_value($$); }
|
|
|
%destructor map { free_value($$); }
|
|
%destructor map { free_value($$); }
|
|
|
|
|
+%destructor invoc { free_value($$); }
|
|
|
|
|
+%destructor noninvoc_value { free_value($$); }
|
|
|
%destructor value { free_value($$); }
|
|
%destructor value { free_value($$); }
|
|
|
%destructor name_maybe { free($$); }
|
|
%destructor name_maybe { free($$); }
|
|
|
|
|
|
|
@@ -655,7 +659,28 @@ map(R) ::= BRACKET_OPEN map_contents(A) BRACKET_CLOSE. {
|
|
|
R = A;
|
|
R = A;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-value(R) ::= STRING(A). {
|
|
|
|
|
|
|
+invoc(R) ::= value(F) noninvoc_value(A). {
|
|
|
|
|
+ if (!F.have || !A.have) {
|
|
|
|
|
+ goto failQ0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!NCDValue_InitInvoc(&R.v, F.v, A.v)) {
|
|
|
|
|
+ goto failQ0;
|
|
|
|
|
+ }
|
|
|
|
|
+ F.have = 0;
|
|
|
|
|
+ A.have = 0;
|
|
|
|
|
+ R.have = 1;
|
|
|
|
|
+ goto doneQ;
|
|
|
|
|
+
|
|
|
|
|
+failQ0:
|
|
|
|
|
+ R.have = 0;
|
|
|
|
|
+ parser_out->out_of_memory = 1;
|
|
|
|
|
+doneQ:
|
|
|
|
|
+ free_value(F);
|
|
|
|
|
+ free_value(A);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+noninvoc_value(R) ::= STRING(A). {
|
|
|
ASSERT(A.str)
|
|
ASSERT(A.str)
|
|
|
|
|
|
|
|
if (!NCDValue_InitStringBin(&R.v, (uint8_t *)A.str, A.len)) {
|
|
if (!NCDValue_InitStringBin(&R.v, (uint8_t *)A.str, A.len)) {
|
|
@@ -672,7 +697,7 @@ doneU:
|
|
|
free_token(A);
|
|
free_token(A);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-value(R) ::= dotted_name(A). {
|
|
|
|
|
|
|
+noninvoc_value(R) ::= dotted_name(A). {
|
|
|
if (!A) {
|
|
if (!A) {
|
|
|
goto failV0;
|
|
goto failV0;
|
|
|
}
|
|
}
|
|
@@ -691,11 +716,23 @@ doneV:
|
|
|
free(A);
|
|
free(A);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-value(R) ::= list(A). {
|
|
|
|
|
|
|
+noninvoc_value(R) ::= list(A). {
|
|
|
|
|
+ R = A;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+noninvoc_value(R) ::= map(A). {
|
|
|
|
|
+ R = A;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+noninvoc_value(R) ::= ROUND_OPEN value(A) ROUND_CLOSE. {
|
|
|
|
|
+ R = A;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+value(R) ::= invoc(A). {
|
|
|
R = A;
|
|
R = A;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-value(R) ::= map(A). {
|
|
|
|
|
|
|
+value(R) ::= noninvoc_value(A). {
|
|
|
R = A;
|
|
R = A;
|
|
|
}
|
|
}
|
|
|
|
|
|