This appendix contains the grammar of QTPL written in YACC (`Yet Another Compiler Compiler') which was used to specify the parser for plug-in templates. It constitutes a concise and unambiguous specification of the QSAS Template Language, and is included as reference material for the technically-inclined. The description of QTPL in section 4 should be quite sufficient for most template-writing purposes.
/*********************************************************************** * SCCS id: @(#)parser.y 1.9 11:44:39 12 Dec 1996 ***********************************************************************/ /* Tokens: most are untyped as they don't have associated attributes. VARIABLE and QUOTED_TEXT do have attributes, and return information about themselves through symbol-table nodes. */ %token INTERNAL /* 'INTERNAL' */ %token EXTERNAL /* 'EXTERNAL' */ %token FILTER /* 'FILTER' */ %token <symb> VARIABLE /* function or argument name */ %token ANY_DO /* 'ANY_DATA_OBJECT' */ %token INTEGER /* 'INTEGER' */ %token FLOAT /* 'FLOAT' */ %token STRING /* 'STRING' */ %token TIMETAGS /* 'TIMETAGS' */ %token TIME_INTERVAL /* 'TIME_INTERVAL' */ %token SCALAR_SERIES /* 'SCALAR_SERIES' */ %token VECTOR_SERIES /* 'VECTOR_SERIES' */ %token ANY_TS /* 'ANY_TIME_SERIES' */ %token SCALAR_TS /* 'SCALAR_TIME_SERIES' */ %token VECTOR_TS /* 'VECTOR_TIME_SERIES' */ %token PUBLIC_NAME /* 'PUBLIC_NAME' */ %token DESCRIPTION /* 'DESCRIPTION' */ %token DEFAULT_VALUE /* 'DEFAULT_VALUE' */ %token ENTRY_NAME /* 'ENTRY_NAME' */ %token OBJECT_FILE /* 'OBJECT_FILE' */ %token INPUT /* 'INPUT' */ %token OUTPUT /* 'OUTPUT' */ %token <symb> QUOTED_TEXT /* ASCII text in double-quotes */ /* Now type declarations for the non-terminals. */ %type <symb> function_list %type <symb> function %type <func_type> f_type %type <symb> parameter_list %type <symb> argument_list %type <symb> argument %type <arg_type> arg_type %type <var_type> d_o_type %type <symb> description_list %type <symb> desc_list %type <symb> desc_pair_list %type <symb> desc_pair %type <symb> desc %type <desc_type> desc_type %type <symb> desc_value %% /* Grammar rules: "declaration" is the sentence symbol of the grammar. */ declaration : function_list ; function_list : function { $$ = $1 ; } | function_list function {yyerror("List of plug-ins not supported");} ; function : f_type VARIABLE '(' parameter_list ')' '{' description_list '}' { $$ = $2; $$->type = Q_FUNCTION; $$->u.f = create_qtpl_function(); $$->u.f->type = $1; $$->u.f->name = $2->name; $$->u.f->args = $4->u.a; qtpl_desc_list_apply($$, $7); qtpls_print_node($$); } ; f_type : INTERNAL { $$ = F_INTERNAL; } | EXTERNAL { $$ = F_EXTERNAL; } | FILTER { $$ = F_FILTER; } ; parameter_list : argument_list { $$ = $1 ; } | { $$ = NULL ; } ; argument_list : argument { $$ = $1 ; } | argument_list ',' argument { qtpl_arg_join($1, $3->u.a); $$ = $1; } ; argument : arg_type d_o_type VARIABLE { $$ = $3; $$->type = Q_ARGUMENT; $$->u.a = create_qtpl_argument(); $$->u.a->next = NULL; $$->u.a->arg_type = $1; $$->u.a->var_type = $2; $$->u.a->name = $3->name; } ; arg_type : INPUT { $$ = A_INPUT ; } | OUTPUT { $$ = A_OUTPUT ; } ; d_o_type : ANY_DO { $$ = V_ANY_DO ; } | INTEGER { $$ = V_INTEGER ; } | FLOAT { $$ = V_FLOAT ; } | STRING { $$ = V_STRING ; } | TIMETAGS { $$ = V_TIMETAGS ; } | TIME_INTERVAL { $$ = V_TIME_INTERVAL ; } | SCALAR_SERIES { $$ = V_SCALAR_SERIES ; } | VECTOR_SERIES { $$ = V_VECTOR_SERIES ; } | ANY_TS { $$ = V_ANY_TS ; } | SCALAR_TS { $$ = V_SCALAR_TS ; } | VECTOR_TS { $$ = V_VECTOR_TS ; } ; description_list : desc_list { $$ = $1 ; } | { $$ = NULL ; } ; desc_list : desc { $$ = $1; } | desc_list desc { qtpl_desc_join ($1, $2->u.d); $$ = $1; } ; desc : VARIABLE '{' desc_pair_list '}' { qtpl_set_describee ($3->u.d, $1->name); $$ = $3; } ; desc_pair_list : desc_pair { $$ = $1; } | desc_pair_list desc_pair { qtpl_desc_join ($1, $2->u.d); $$ = $1; } ; desc_pair : desc_type '{' desc_value '}' { $3->type = Q_DESCRIPTOR; $3->u.d = create_qtpl_descriptor(); $3->u.d->type = $1; $3->u.d->next = NULL; $3->u.d->value=$3->name; $$ = $3; } ; desc_type : PUBLIC_NAME { $$ = D_PUBLIC_NAME ; } | DESCRIPTION { $$ = D_DESCRIPTION ; } | DEFAULT_VALUE { $$ = D_DEFAULT_VALUE ; } | ENTRY_NAME { $$ = D_ENTRY_NAME ; } | OBJECT_FILE { $$ = D_OBJECT_FILE ; } ; desc_value : QUOTED_TEXT { $$ = $1 ; } ; %% /***********************************************************************/