%{ /*------------------------------------------------------------------------- * * specparse.y * bison grammar for the isolation test file format * * Portions Copyright (c) 1996-2018, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * *------------------------------------------------------------------------- */ #include "postgres_fe.h" #include "isolationtester.h" TestSpec parseresult; /* result of parsing is left here */ %} %expect 0 %name-prefix="spec_yy" %union { char *str; Session *session; Step *step; Permutation *permutation; struct { void **elements; int nelements; } ptr_list; } %type setup_list %type opt_setup opt_teardown %type setup %type step_list session_list permutation_list opt_permutation_list %type string_literal_list %type session %type step %type permutation %token sqlblock string_literal %token PERMUTATION SESSION SETUP STEP TEARDOWN TEST %% TestSpec: setup_list opt_teardown session_list opt_permutation_list { parseresult.setupsqls = (char **) $1.elements; parseresult.nsetupsqls = $1.nelements; parseresult.teardownsql = $2; parseresult.sessions = (Session **) $3.elements; parseresult.nsessions = $3.nelements; parseresult.permutations = (Permutation **) $4.elements; parseresult.npermutations = $4.nelements; } ; setup_list: /* EMPTY */ { $$.elements = NULL; $$.nelements = 0; } | setup_list setup { $$.elements = pg_realloc($1.elements, ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } ; opt_setup: /* EMPTY */ { $$ = NULL; } | setup { $$ = $1; } ; setup: SETUP sqlblock { $$ = $2; } ; opt_teardown: /* EMPTY */ { $$ = NULL; } | TEARDOWN sqlblock { $$ = $2; } ; session_list: session_list session { $$.elements = pg_realloc($1.elements, ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | session { $$.nelements = 1; $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; session: SESSION string_literal opt_setup step_list opt_teardown { $$ = pg_malloc(sizeof(Session)); $$->name = $2; $$->setupsql = $3; $$->steps = (Step **) $4.elements; $$->nsteps = $4.nelements; $$->teardownsql = $5; } ; step_list: step_list step { $$.elements = pg_realloc($1.elements, ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | step { $$.nelements = 1; $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; step: STEP string_literal sqlblock { $$ = pg_malloc(sizeof(Step)); $$->name = $2; $$->sql = $3; $$->errormsg = NULL; } ; opt_permutation_list: permutation_list { $$ = $1; } | /* EMPTY */ { $$.elements = NULL; $$.nelements = 0; } permutation_list: permutation_list permutation { $$.elements = pg_realloc($1.elements, ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | permutation { $$.nelements = 1; $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; permutation: PERMUTATION string_literal_list { $$ = pg_malloc(sizeof(Permutation)); $$->stepnames = (char **) $2.elements; $$->nsteps = $2.nelements; } ; string_literal_list: string_literal_list string_literal { $$.elements = pg_realloc($1.elements, ($1.nelements + 1) * sizeof(void *)); $$.elements[$1.nelements] = $2; $$.nelements = $1.nelements + 1; } | string_literal { $$.nelements = 1; $$.elements = pg_malloc(sizeof(void *)); $$.elements[0] = $1; } ; %% #include "specscanner.c"