17%define api.prefix {ex_}
133%binary <op>
'<' '>' LE GE
135%left <op>
'+' '-' IN_OP
136%left <op>
'*' '/' '%'
137%right <op>
'!' '~' '#' UNARY
144%type <expr> args variable
assign
146%type <expr> initialize switch_item constant
147%type <expr> formals formal_list formal_item
148%type <reference> members
205 exerror(
"no nested function definitions");
272 exwarn (
"assignment used as boolean in if statement");
277 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
':',
true,
$5 ?
$5->type : 0,
$5, $6));
282 $$->data.generate.array =
$3;
283 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
284 exerror(
"simple index variable expected");
285 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
286 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
287 exerror(
"integer index variable expected");
289 $3->data.variable.index = 0;
290 $$->data.generate.statement =
$5;
297 $5->data.constant.value.integer = 1;
303 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$5,
exnewnode(
expr.
program,
';', 1, 0, $7, $9));
310 $$->data.generate.array =
$3;
311 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
312 exerror(
"simple index variable expected");
313 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
314 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
315 exerror(
"integer index variable expected");
317 $3->data.variable.index = 0;
318 $$->data.generate.statement =
$5;
323 exerror(
"cannot apply unset to non-array %s",
$3->name);
325 $$->data.variable.symbol =
$3;
326 $$->data.variable.index =
NULL;
331 exerror(
"cannot apply unset to non-array %s",
$3->name);
332 if ((
$3->index_type > 0) && (
$5->type !=
$3->index_type))
333 exerror(
"%s indices must have type %s, not %s",
336 $$->data.variable.symbol =
$3;
337 $$->data.variable.index =
$5;
342 exwarn (
"assignment used as boolean in while statement");
347 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
';',
true, 0,
NULL,
$5));
353 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
DEFAULT,
true, 0, sw->
defcase, sw->
firstcase));
365 $2->data.constant.value.integer = 1;
380 exerror(
"return in void function");
391 if (!(sw = calloc(1,
sizeof(
Switch_t)))) {
404 | switch_list switch_item
419 const size_t n = sw->
cap;
424 memcpy(
$$->data.select.constant, sw->
base, n *
sizeof(
Extype_t*));
427 $$->data.select.constant = 0;
432 exerror(
"duplicate default in switch");
440 | case_list case_item
443case_item :
CASE constant
':'
450 exerror(
"too many case labels for switch");
475dcl_item : dcl_name {checkName (
$1);
expr.
id=
$1;} array initialize
489 exerror(
"%s: a variable cannot be void typed",
$1->name);
503 exerror(
"%s: cannot initialize associative array",
$1->name);
508 if ($4->type !=
$1->type)
514 $4->data.operand.left->data.variable.symbol =
$1;
577 if (
$1->type !=
$3->type)
599 $$->data.constant.value.string =
713 if ($4->type != $7->type)
716 exerror(
"if statement string type mismatch");
724 if (
$1->data.constant.value.integer)
737 $$ =
exnewnode(
expr.
program,
'?',
true, $4->type,
$1,
exnewnode(
expr.
program,
':',
true, $4->type, $4, $7));
762 exerror(
"cannot apply '#' operator to non-array %s",
$2->name);
764 $$->data.variable.symbol =
$2;
769 $$->data.variable.symbol =
$2;
783 |
'&' variable %prec
UNARY
838 $$->data.call.procedure =
$1;
849 $$->data.print.descriptor =
$3->data.operand.left;
850 $3 =
$3->data.operand.right;
857 $$->data.print.descriptor->data.constant.value.integer = 2;
861 $$->data.print.descriptor->data.constant.value.integer = 1;
864 $$->data.print.descriptor = 0;
867 $$->data.print.args = preprint(
$3);
876 $$->data.scan.descriptor =
$3->data.operand.left;
877 $3 =
$3->data.operand.right;
883 $$->data.scan.descriptor = 0;
886 if (
$3 &&
$3->data.operand.left->type ==
STRING)
888 $$->data.scan.descriptor =
$3->data.operand.left;
889 $3 =
$3->data.operand.right;
892 exerror(
"%s: string argument expected",
$1->name);
895 if (!
$3 || !
$3->data.operand.left ||
$3->data.operand.left->type !=
STRING)
896 exerror(
"%s: format argument expected",
$1->name);
897 $$->data.scan.format =
$3->data.operand.left;
901 exerror(
"%s: address argument expected",
$1->name);
910 exerror(
"%s: variable assignment not supported",
$1->data.variable.symbol->name);
915 else if (
$2->type !=
$1->type)
920 $2->data.operand.left =
$1;
929 exerror(
"++ and -- invalid for string variables");
937 exerror(
"++ and -- invalid for string variables");
944 exerror(
"cannot apply IN to non-array %s",
$3->name);
945 if (
$3->index_type > 0 &&
$1->type !=
$3->index_type)
946 exerror(
"%s indices must have type %s, not %s",
949 $$->data.variable.symbol =
$3;
950 $$->data.variable.index =
$1;
954 if (
$3->index_type > 0 &&
$1->type !=
$3->index_type)
955 exerror(
"%s indices must have type %s, not %s",
958 $$->data.variable.symbol =
$3;
959 $$->data.variable.index =
$1;
979 exerror(
"%s: identifier references not supported",
$1->name);
986 $$->data.constant.value.floating =
$1;
991 $$->data.constant.value.integer =
$1;
996 $$->data.constant.value.string =
$1;
1001 $$->data.constant.value.integer =
$1;
1014variable :
ID members
1024 exerror(
"%s: is%s an array",
$1->name,
$1->local !=
NULL ?
"" :
" not");
1025 if (
$1->local !=
NULL &&
$1->index_type > 0) {
1026 if (
$2->type !=
$1->index_type)
1027 exerror(
"%s: indices must have type %s, not %s",
1039 $$->data.variable.symbol =
$1;
1040 $$->data.variable.reference = 0;
1041 $$->data.variable.index = 0;
1042 $$->data.variable.dyna = 0;
1044 exerror(
"unknown identifier");
1085 $$ =
$1->data.operand.left;
1086 $1->data.operand.left =
$1->data.operand.right = 0;
1091arg_list :
expr %prec
','
1093 $$ =
exnewnode(
expr.
program,
',',
true, 0,
exnewnode(
expr.
program,
',',
true,
$1->type,
$1,
NULL),
NULL);
1094 $$->data.operand.right =
$$->data.operand.left;
1115formal_list : formal_item
1119 | formal_list
',' formal_item
1132 if (
$1->type == 0) {
1133 exerror(
"%s: parameters to functions cannot be void typed",
$3->name);
1136 $$->data.variable.symbol =
$3;
1138 $3->type =
$1->type;
1226 (void)
dtclose(
$$->data.procedure.frame);
1227 $$->data.procedure.frame =
NULL;
1228 $$->data.procedure.args =
$3;
1249 for (minid = 0;
yytname[minid] !=
NULL; ++minid) {
1250 if (strcmp(
yytname[minid],
"MINTOKEN") == 0) {
1256 &&
"failed to find MINTOKEN; incorrect token list in exparse.y?");
1266 for (k = 0;
yytname[i][k] !=
'\0'; ++k) {
1276 if (j ==
index + minid) {
1287void ex_error(
const char *message) {
void * gv_arena_alloc(arena_t *arena, size_t alignment, size_t size)
char * gv_arena_strdup(arena_t *arena, const char *s)
Region-based memory allocator.
#define ARENA_NEW(arena, type)
CDT_API Dtmethod_t * Dtset
set with unique elements
CDT_API Dt_t * dtview(Dt_t *, Dt_t *)
CDT_API int dtclose(Dt_t *)
CDT_API Dtmethod_t * Dtoset
ordered set (self-adjusting tree)
CDT_API Dt_t * dtopen(Dtdisc_t *, Dtmethod_t *)
static int binary(Exnode_t *l, Exnode_t *ex, Exnode_t *r, int arg)
static void scan(Excc_t *cc, Exnode_t *exnode)
static void print(Excc_t *cc, Exnode_t *exnode)
void exwarn(const char *format,...)
void exerror(const char *format,...)
Extype_t exeval(Expr_t *ex, Exnode_t *exnode, void *env)
const char * exop(size_t id)
static const char *const yytname[]
void ex_error(const char *message)
int exisAssign(Exnode_t *)
Exnode_t * excast(Expr_t *, Exnode_t *, long, Exnode_t *, int)
Exnode_t * exnewnode(Expr_t *, long, bool, long, Exnode_t *, Exnode_t *)
void exfreenode(Expr_t *, Exnode_t *)
char * extypename(Expr_t *p, long)
Extype_t exzero(long int)
replacements for ctype.h functions
static bool gv_isalnum(int c)
#define assign(h, i, j, index)
static int table[NTYPES][NTYPES]
static bool streq(const char *a, const char *b)
are a and b equal?
double(* floating)(char **)
long declare
current declaration type
long type
switch test type
struct Exdata_u::@94 select
struct Exdata_u::@93 operand
struct Exdata_u::@95 variable
struct Exdata_u::@92 constant