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 ; }
;
%%
/***********************************************************************/