diff options
author | ambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140> | 2012-12-03 23:58:51 +0400 |
---|---|---|
committer | ambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140> | 2012-12-03 23:58:51 +0400 |
commit | aa9c5c45500b72c0f12c70711fdbb649bb45ed6c (patch) | |
tree | ede8e80c24d6b6c8e77954aff039a9fe544056a4 /generated | |
parent | bc17a671ed6c34edb74081d88323adf7764bc4a1 (diff) |
ncd: NCDConfigParse_parse.y: allow inputs without any processes or templates. This removes some duplication and will make
adding support for include directives easier to implement.
Diffstat (limited to 'generated')
-rw-r--r-- | generated/NCDConfigParser_parse.c | 169 | ||||
-rw-r--r-- | generated/NCDConfigParser_parse.out | 12 | ||||
-rw-r--r-- | generated/NCDConfigParser_parse.y | 33 |
3 files changed, 75 insertions, 139 deletions
diff --git a/generated/NCDConfigParser_parse.c b/generated/NCDConfigParser_parse.c index 4d3b13d..2caad6b 100644 --- a/generated/NCDConfigParser_parse.c +++ b/generated/NCDConfigParser_parse.c @@ -255,7 +255,7 @@ static const signed char yy_reduce_ofst[] = { /* 20 */ -7, 15, 28, 22, 39, 51, 53, 65, 37, }; static const YYACTIONTYPE yy_default[] = { - /* 0 */ 129, 111, 111, 129, 129, 129, 129, 129, 129, 129, + /* 0 */ 94, 111, 111, 129, 129, 129, 129, 129, 129, 129, /* 10 */ 129, 129, 129, 129, 129, 107, 129, 129, 94, 101, /* 20 */ 125, 129, 129, 125, 105, 125, 125, 125, 103, 129, /* 30 */ 129, 129, 129, 129, 129, 129, 129, 109, 113, 129, @@ -376,7 +376,7 @@ static const char *const yyTokenName[] = { */ static const char *const yyRuleName[] = { /* 0 */ "input ::= processes", - /* 1 */ "processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE", + /* 1 */ "processes ::=", /* 2 */ "processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes", /* 3 */ "statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON", /* 4 */ "statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON", @@ -799,7 +799,7 @@ static const struct { unsigned char nrhs; /* Number of right-hand side symbols in the rule */ } yyRuleInfo[] = { { 37, 1 }, - { 22, 5 }, + { 22, 0 }, { 22, 6 }, { 23, 6 }, { 23, 8 }, @@ -900,50 +900,19 @@ static void yy_reduce( } #line 902 "NCDConfigParser_parse.c" break; - case 1: /* processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE */ + case 1: /* processes ::= */ #line 145 "NCDConfigParser_parse.y" { - ASSERT(yymsp[-3].minor.yy0.str) - if (!yymsp[-1].minor.yy29.have) { - goto failA0; - } - - NCDProcess proc; - if (!NCDProcess_Init(&proc, yymsp[-4].minor.yy8, yymsp[-3].minor.yy0.str, yymsp[-1].minor.yy29.v)) { - goto failA0; - } - yymsp[-1].minor.yy29.have = 0; - - NCDProgramElem elem; - NCDProgramElem_InitProcess(&elem, proc); - NCDProgram prog; NCDProgram_Init(&prog); - - if (!NCDProgram_PrependElem(&prog, elem)) { - goto failA1; - } - + yygotominor.yy74.have = 1; yygotominor.yy74.v = prog; - goto doneA; - -failA1: - NCDProgram_Free(&prog); - NCDProgramElem_Free(&elem); -failA0: - yygotominor.yy74.have = 0; - parser_out->out_of_memory = 1; -doneA: - free_token(yymsp[-3].minor.yy0); - free_block(yymsp[-1].minor.yy29); - yy_destructor(yypParser,2,&yymsp[-2].minor); - yy_destructor(yypParser,3,&yymsp[0].minor); } -#line 944 "NCDConfigParser_parse.c" +#line 913 "NCDConfigParser_parse.c" break; case 2: /* processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes */ -#line 182 "NCDConfigParser_parse.y" +#line 153 "NCDConfigParser_parse.y" { ASSERT(yymsp[-4].minor.yy0.str) if (!yymsp[-2].minor.yy29.have || !yymsp[0].minor.yy74.have) { @@ -980,10 +949,10 @@ doneB: yy_destructor(yypParser,2,&yymsp[-3].minor); yy_destructor(yypParser,3,&yymsp[-1].minor); } -#line 984 "NCDConfigParser_parse.c" +#line 953 "NCDConfigParser_parse.c" break; case 3: /* statement ::= dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */ -#line 217 "NCDConfigParser_parse.y" +#line 188 "NCDConfigParser_parse.y" { if (!yymsp[-5].minor.yy9 || !yymsp[-3].minor.yy27.have) { goto failC0; @@ -1008,10 +977,10 @@ doneC: yy_destructor(yypParser,5,&yymsp[-2].minor); yy_destructor(yypParser,6,&yymsp[0].minor); } -#line 1012 "NCDConfigParser_parse.c" +#line 981 "NCDConfigParser_parse.c" break; case 4: /* statement ::= dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON */ -#line 239 "NCDConfigParser_parse.y" +#line 210 "NCDConfigParser_parse.y" { if (!yymsp[-7].minor.yy9 || !yymsp[-5].minor.yy9 || !yymsp[-3].minor.yy27.have) { goto failD0; @@ -1038,10 +1007,10 @@ doneD: yy_destructor(yypParser,5,&yymsp[-2].minor); yy_destructor(yypParser,6,&yymsp[0].minor); } -#line 1042 "NCDConfigParser_parse.c" +#line 1011 "NCDConfigParser_parse.c" break; case 5: /* statement ::= IF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif_maybe else_maybe name_maybe SEMICOLON */ -#line 262 "NCDConfigParser_parse.y" +#line 233 "NCDConfigParser_parse.y" { if (!yymsp[-8].minor.yy27.have || !yymsp[-5].minor.yy29.have || !yymsp[-3].minor.yy4.have) { goto failE0; @@ -1086,10 +1055,10 @@ doneE: yy_destructor(yypParser,3,&yymsp[-4].minor); yy_destructor(yypParser,6,&yymsp[0].minor); } -#line 1090 "NCDConfigParser_parse.c" +#line 1059 "NCDConfigParser_parse.c" break; case 6: /* statement ::= FOREACH ROUND_OPEN value AS NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON */ -#line 301 "NCDConfigParser_parse.y" +#line 272 "NCDConfigParser_parse.y" { if (!yymsp[-8].minor.yy27.have || !yymsp[-6].minor.yy0.str || !yymsp[-3].minor.yy29.have) { goto failEA0; @@ -1120,10 +1089,10 @@ doneEA0: yy_destructor(yypParser,3,&yymsp[-2].minor); yy_destructor(yypParser,6,&yymsp[0].minor); } -#line 1124 "NCDConfigParser_parse.c" +#line 1093 "NCDConfigParser_parse.c" break; case 7: /* statement ::= FOREACH ROUND_OPEN value AS NAME COLON NAME ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE name_maybe SEMICOLON */ -#line 325 "NCDConfigParser_parse.y" +#line 296 "NCDConfigParser_parse.y" { if (!yymsp[-10].minor.yy27.have || !yymsp[-8].minor.yy0.str || !yymsp[-6].minor.yy0.str || !yymsp[-3].minor.yy29.have) { goto failEB0; @@ -1156,25 +1125,25 @@ doneEB0: yy_destructor(yypParser,3,&yymsp[-2].minor); yy_destructor(yypParser,6,&yymsp[0].minor); } -#line 1160 "NCDConfigParser_parse.c" +#line 1129 "NCDConfigParser_parse.c" break; case 8: /* elif_maybe ::= */ -#line 350 "NCDConfigParser_parse.y" +#line 321 "NCDConfigParser_parse.y" { NCDIfBlock_Init(&yygotominor.yy4.v); yygotominor.yy4.have = 1; } -#line 1168 "NCDConfigParser_parse.c" +#line 1137 "NCDConfigParser_parse.c" break; case 9: /* elif_maybe ::= elif */ -#line 355 "NCDConfigParser_parse.y" +#line 326 "NCDConfigParser_parse.y" { yygotominor.yy4 = yymsp[0].minor.yy4; } -#line 1175 "NCDConfigParser_parse.c" +#line 1144 "NCDConfigParser_parse.c" break; case 10: /* elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE */ -#line 359 "NCDConfigParser_parse.y" +#line 330 "NCDConfigParser_parse.y" { if (!yymsp[-4].minor.yy27.have || !yymsp[-1].minor.yy29.have) { goto failF0; @@ -1209,10 +1178,10 @@ doneF0: yy_destructor(yypParser,2,&yymsp[-2].minor); yy_destructor(yypParser,3,&yymsp[0].minor); } -#line 1213 "NCDConfigParser_parse.c" +#line 1182 "NCDConfigParser_parse.c" break; case 11: /* elif ::= ELIF ROUND_OPEN value ROUND_CLOSE CURLY_OPEN statements CURLY_CLOSE elif */ -#line 389 "NCDConfigParser_parse.y" +#line 360 "NCDConfigParser_parse.y" { if (!yymsp[-5].minor.yy27.have || !yymsp[-2].minor.yy29.have || !yymsp[0].minor.yy4.have) { goto failG0; @@ -1247,27 +1216,27 @@ doneG0: yy_destructor(yypParser,2,&yymsp[-3].minor); yy_destructor(yypParser,3,&yymsp[-1].minor); } -#line 1251 "NCDConfigParser_parse.c" +#line 1220 "NCDConfigParser_parse.c" break; case 12: /* else_maybe ::= */ -#line 419 "NCDConfigParser_parse.y" +#line 390 "NCDConfigParser_parse.y" { yygotominor.yy29.have = 0; } -#line 1258 "NCDConfigParser_parse.c" +#line 1227 "NCDConfigParser_parse.c" break; case 13: /* else_maybe ::= ELSE CURLY_OPEN statements CURLY_CLOSE */ -#line 423 "NCDConfigParser_parse.y" +#line 394 "NCDConfigParser_parse.y" { yygotominor.yy29 = yymsp[-1].minor.yy29; yy_destructor(yypParser,13,&yymsp[-3].minor); yy_destructor(yypParser,2,&yymsp[-2].minor); yy_destructor(yypParser,3,&yymsp[0].minor); } -#line 1268 "NCDConfigParser_parse.c" +#line 1237 "NCDConfigParser_parse.c" break; case 14: /* statements ::= statement */ -#line 427 "NCDConfigParser_parse.y" +#line 398 "NCDConfigParser_parse.y" { if (!yymsp[0].minor.yy23.have) { goto failH0; @@ -1291,10 +1260,10 @@ failH0: doneH: free_statement(yymsp[0].minor.yy23); } -#line 1295 "NCDConfigParser_parse.c" +#line 1264 "NCDConfigParser_parse.c" break; case 15: /* statements ::= statement statements */ -#line 451 "NCDConfigParser_parse.y" +#line 422 "NCDConfigParser_parse.y" { if (!yymsp[-1].minor.yy23.have || !yymsp[0].minor.yy29.have) { goto failI0; @@ -1319,20 +1288,20 @@ doneI: free_statement(yymsp[-1].minor.yy23); free_block(yymsp[0].minor.yy29); } -#line 1323 "NCDConfigParser_parse.c" +#line 1292 "NCDConfigParser_parse.c" break; case 16: /* dotted_name ::= NAME */ case 33: /* name_maybe ::= NAME */ yytestcase(yyruleno==33); -#line 476 "NCDConfigParser_parse.y" +#line 447 "NCDConfigParser_parse.y" { ASSERT(yymsp[0].minor.yy0.str) yygotominor.yy9 = yymsp[0].minor.yy0.str; } -#line 1333 "NCDConfigParser_parse.c" +#line 1302 "NCDConfigParser_parse.c" break; case 17: /* dotted_name ::= NAME DOT dotted_name */ -#line 482 "NCDConfigParser_parse.y" +#line 453 "NCDConfigParser_parse.y" { ASSERT(yymsp[-2].minor.yy0.str) if (!yymsp[0].minor.yy9) { @@ -1353,27 +1322,27 @@ doneJ: free(yymsp[0].minor.yy9); yy_destructor(yypParser,14,&yymsp[-1].minor); } -#line 1357 "NCDConfigParser_parse.c" +#line 1326 "NCDConfigParser_parse.c" break; case 18: /* statement_args_maybe ::= */ -#line 502 "NCDConfigParser_parse.y" +#line 473 "NCDConfigParser_parse.y" { yygotominor.yy27.have = 1; NCDValue_InitList(&yygotominor.yy27.v); } -#line 1365 "NCDConfigParser_parse.c" +#line 1334 "NCDConfigParser_parse.c" break; case 19: /* statement_args_maybe ::= list_contents */ case 30: /* value ::= list */ yytestcase(yyruleno==30); case 31: /* value ::= map */ yytestcase(yyruleno==31); -#line 507 "NCDConfigParser_parse.y" +#line 478 "NCDConfigParser_parse.y" { yygotominor.yy27 = yymsp[0].minor.yy27; } -#line 1374 "NCDConfigParser_parse.c" +#line 1343 "NCDConfigParser_parse.c" break; case 20: /* list_contents ::= value */ -#line 511 "NCDConfigParser_parse.y" +#line 482 "NCDConfigParser_parse.y" { if (!yymsp[0].minor.yy27.have) { goto failL0; @@ -1397,10 +1366,10 @@ failL0: doneL: free_value(yymsp[0].minor.yy27); } -#line 1401 "NCDConfigParser_parse.c" +#line 1370 "NCDConfigParser_parse.c" break; case 21: /* list_contents ::= value COMMA list_contents */ -#line 535 "NCDConfigParser_parse.y" +#line 506 "NCDConfigParser_parse.y" { if (!yymsp[-2].minor.yy27.have || !yymsp[0].minor.yy27.have) { goto failM0; @@ -1424,29 +1393,29 @@ doneM: free_value(yymsp[0].minor.yy27); yy_destructor(yypParser,15,&yymsp[-1].minor); } -#line 1428 "NCDConfigParser_parse.c" +#line 1397 "NCDConfigParser_parse.c" break; case 22: /* list ::= CURLY_OPEN CURLY_CLOSE */ -#line 558 "NCDConfigParser_parse.y" +#line 529 "NCDConfigParser_parse.y" { yygotominor.yy27.have = 1; NCDValue_InitList(&yygotominor.yy27.v); yy_destructor(yypParser,2,&yymsp[-1].minor); yy_destructor(yypParser,3,&yymsp[0].minor); } -#line 1438 "NCDConfigParser_parse.c" +#line 1407 "NCDConfigParser_parse.c" break; case 23: /* list ::= CURLY_OPEN list_contents CURLY_CLOSE */ -#line 563 "NCDConfigParser_parse.y" +#line 534 "NCDConfigParser_parse.y" { yygotominor.yy27 = yymsp[-1].minor.yy27; yy_destructor(yypParser,2,&yymsp[-2].minor); yy_destructor(yypParser,3,&yymsp[0].minor); } -#line 1447 "NCDConfigParser_parse.c" +#line 1416 "NCDConfigParser_parse.c" break; case 24: /* map_contents ::= value COLON value */ -#line 567 "NCDConfigParser_parse.y" +#line 538 "NCDConfigParser_parse.y" { if (!yymsp[-2].minor.yy27.have || !yymsp[0].minor.yy27.have) { goto failS0; @@ -1473,10 +1442,10 @@ doneS: free_value(yymsp[0].minor.yy27); yy_destructor(yypParser,11,&yymsp[-1].minor); } -#line 1477 "NCDConfigParser_parse.c" +#line 1446 "NCDConfigParser_parse.c" break; case 25: /* map_contents ::= value COLON value COMMA map_contents */ -#line 593 "NCDConfigParser_parse.y" +#line 564 "NCDConfigParser_parse.y" { if (!yymsp[-4].minor.yy27.have || !yymsp[-2].minor.yy27.have || !yymsp[0].minor.yy27.have) { goto failT0; @@ -1503,29 +1472,29 @@ doneT: yy_destructor(yypParser,11,&yymsp[-3].minor); yy_destructor(yypParser,15,&yymsp[-1].minor); } -#line 1507 "NCDConfigParser_parse.c" +#line 1476 "NCDConfigParser_parse.c" break; case 26: /* map ::= BRACKET_OPEN BRACKET_CLOSE */ -#line 618 "NCDConfigParser_parse.y" +#line 589 "NCDConfigParser_parse.y" { yygotominor.yy27.have = 1; NCDValue_InitMap(&yygotominor.yy27.v); yy_destructor(yypParser,16,&yymsp[-1].minor); yy_destructor(yypParser,17,&yymsp[0].minor); } -#line 1517 "NCDConfigParser_parse.c" +#line 1486 "NCDConfigParser_parse.c" break; case 27: /* map ::= BRACKET_OPEN map_contents BRACKET_CLOSE */ -#line 623 "NCDConfigParser_parse.y" +#line 594 "NCDConfigParser_parse.y" { yygotominor.yy27 = yymsp[-1].minor.yy27; yy_destructor(yypParser,16,&yymsp[-2].minor); yy_destructor(yypParser,17,&yymsp[0].minor); } -#line 1526 "NCDConfigParser_parse.c" +#line 1495 "NCDConfigParser_parse.c" break; case 28: /* value ::= STRING */ -#line 627 "NCDConfigParser_parse.y" +#line 598 "NCDConfigParser_parse.y" { ASSERT(yymsp[0].minor.yy0.str) @@ -1542,10 +1511,10 @@ failU0: doneU: free_token(yymsp[0].minor.yy0); } -#line 1546 "NCDConfigParser_parse.c" +#line 1515 "NCDConfigParser_parse.c" break; case 29: /* value ::= dotted_name */ -#line 644 "NCDConfigParser_parse.y" +#line 615 "NCDConfigParser_parse.y" { if (!yymsp[0].minor.yy9) { goto failV0; @@ -1564,30 +1533,30 @@ failV0: doneV: free(yymsp[0].minor.yy9); } -#line 1568 "NCDConfigParser_parse.c" +#line 1537 "NCDConfigParser_parse.c" break; case 32: /* name_maybe ::= */ -#line 671 "NCDConfigParser_parse.y" +#line 642 "NCDConfigParser_parse.y" { yygotominor.yy9 = NULL; } -#line 1575 "NCDConfigParser_parse.c" +#line 1544 "NCDConfigParser_parse.c" break; case 34: /* process_or_template ::= PROCESS */ -#line 681 "NCDConfigParser_parse.y" +#line 652 "NCDConfigParser_parse.y" { yygotominor.yy8 = 0; yy_destructor(yypParser,19,&yymsp[0].minor); } -#line 1583 "NCDConfigParser_parse.c" +#line 1552 "NCDConfigParser_parse.c" break; case 35: /* process_or_template ::= TEMPLATE */ -#line 685 "NCDConfigParser_parse.y" +#line 656 "NCDConfigParser_parse.y" { yygotominor.yy8 = 1; yy_destructor(yypParser,20,&yymsp[0].minor); } -#line 1591 "NCDConfigParser_parse.c" +#line 1560 "NCDConfigParser_parse.c" break; default: break; @@ -1652,7 +1621,7 @@ static void yy_syntax_error( #line 125 "NCDConfigParser_parse.y" parser_out->syntax_error = 1; -#line 1656 "NCDConfigParser_parse.c" +#line 1625 "NCDConfigParser_parse.c" ParseARG_STORE; /* Suppress warning about unused %extra_argument variable */ } diff --git a/generated/NCDConfigParser_parse.out b/generated/NCDConfigParser_parse.out index 818637f..9e18018 100644 --- a/generated/NCDConfigParser_parse.out +++ b/generated/NCDConfigParser_parse.out @@ -1,6 +1,6 @@ State 0: input ::= * processes - processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE + (1) processes ::= * processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes process_or_template ::= * PROCESS process_or_template ::= * TEMPLATE @@ -10,6 +10,7 @@ State 0: processes shift 31 process_or_template shift 32 input accept + {default} reduce 1 State 1: statement ::= dotted_name ROUND_OPEN * statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON @@ -265,7 +266,6 @@ State 10: value shift 65 State 11: - processes ::= process_or_template NAME CURLY_OPEN * statements CURLY_CLOSE processes ::= process_or_template NAME CURLY_OPEN * statements CURLY_CLOSE processes statement ::= * dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON statement ::= * dotted_name ARROW dotted_name ROUND_OPEN statement_args_maybe ROUND_CLOSE name_maybe SEMICOLON @@ -402,8 +402,7 @@ State 17: dotted_name shift 29 State 18: - processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE - (1) processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE * + (1) processes ::= * processes ::= * process_or_template NAME CURLY_OPEN statements CURLY_CLOSE processes processes ::= process_or_template NAME CURLY_OPEN statements CURLY_CLOSE * processes process_or_template ::= * PROCESS @@ -527,19 +526,16 @@ State 31: $ reduce 0 State 32: - processes ::= process_or_template * NAME CURLY_OPEN statements CURLY_CLOSE processes ::= process_or_template * NAME CURLY_OPEN statements CURLY_CLOSE processes NAME shift 33 State 33: - processes ::= process_or_template NAME * CURLY_OPEN statements CURLY_CLOSE processes ::= process_or_template NAME * CURLY_OPEN statements CURLY_CLOSE processes CURLY_OPEN shift 11 State 34: - processes ::= process_or_template NAME CURLY_OPEN statements * CURLY_CLOSE processes ::= process_or_template NAME CURLY_OPEN statements * CURLY_CLOSE processes CURLY_CLOSE shift 18 @@ -872,7 +868,7 @@ Symbols: 19: PROCESS 20: TEMPLATE 21: error: - 22: processes: PROCESS TEMPLATE + 22: processes: <lambda> PROCESS TEMPLATE 23: statement: NAME IF FOREACH 24: elif_maybe: <lambda> ELIF 25: elif: ELIF diff --git a/generated/NCDConfigParser_parse.y b/generated/NCDConfigParser_parse.y index 6b6c755..2490473 100644 --- a/generated/NCDConfigParser_parse.y +++ b/generated/NCDConfigParser_parse.y @@ -142,41 +142,12 @@ input ::= processes(A). { } } -processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE. { - ASSERT(A.str) - if (!B.have) { - goto failA0; - } - - NCDProcess proc; - if (!NCDProcess_Init(&proc, T, A.str, B.v)) { - goto failA0; - } - B.have = 0; - - NCDProgramElem elem; - NCDProgramElem_InitProcess(&elem, proc); - +processes(R) ::= . { NCDProgram prog; NCDProgram_Init(&prog); - - if (!NCDProgram_PrependElem(&prog, elem)) { - goto failA1; - } - + R.have = 1; R.v = prog; - goto doneA; - -failA1: - NCDProgram_Free(&prog); - NCDProgramElem_Free(&elem); -failA0: - R.have = 0; - parser_out->out_of_memory = 1; -doneA: - free_token(A); - free_block(B); } processes(R) ::= process_or_template(T) NAME(A) CURLY_OPEN statements(B) CURLY_CLOSE processes(N). { |