17%define api.prefix {ex_}
131%binary <op>
'<' '>' LE GE
133%left <op>
'+' '-' IN_OP
134%left <op>
'*' '/' '%'
135%right <op>
'!' '~' '#' UNARY
142%type <expr> args variable
assign
144%type <expr> initialize switch_item constant
145%type <expr> formals formal_list formal_item
146%type <reference> members
160%type <integer>
static
208 exerror(
"no nested function definitions");
278 exwarn (
"assignment used as boolean in if statement");
283 $$ =
exnewnode(
expr.
program,
$1->index, 1,
INTEGER,
$3,
exnewnode(
expr.
program,
':', 1,
$5 ?
$5->type : 0,
$5, $6));
288 $$->data.generate.array =
$3;
289 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
290 exerror(
"simple index variable expected");
291 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
292 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
293 exerror(
"integer index variable expected");
295 $3->data.variable.index = 0;
296 $$->data.generate.statement =
$5;
303 $5->data.constant.value.integer = 1;
309 $$ =
exnewnode(
expr.
program,
$1->index, 1,
INTEGER,
$5,
exnewnode(
expr.
program,
';', 1, 0, $7, $9));
316 $$->data.generate.array =
$3;
317 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
318 exerror(
"simple index variable expected");
319 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
320 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
321 exerror(
"integer index variable expected");
323 $3->data.variable.index = 0;
324 $$->data.generate.statement =
$5;
329 exerror(
"cannot apply unset to non-array %s",
$3->name);
331 $$->data.variable.symbol =
$3;
332 $$->data.variable.index =
NULL;
337 exerror(
"cannot apply unset to non-array %s",
$3->name);
338 if ((
$3->index_type > 0) && (
$5->type !=
$3->index_type))
339 exerror(
"%s indices must have type %s, not %s",
342 $$->data.variable.symbol =
$3;
343 $$->data.variable.index =
$5;
348 exwarn (
"assignment used as boolean in while statement");
353 $$ =
exnewnode(
expr.
program,
$1->index, 1,
INTEGER,
$3,
exnewnode(
expr.
program,
';', 1, 0,
NULL,
$5));
359 $$ =
exnewnode(
expr.
program,
$1->index, 1,
INTEGER,
$3,
exnewnode(
expr.
program,
DEFAULT, 1, 0, sw->
defcase, sw->
firstcase));
372 $2->data.constant.value.integer = 1;
387 exerror(
"return in void function");
400 if (!(sw = calloc(1,
sizeof(
Switch_t))))
424 | switch_list switch_item
439 size_t n = (size_t)(sw->
cur - sw->
base);
442 memcpy(
$$->data.select.constant, sw->
base, n *
sizeof(
Extype_t*));
443 $$->data.select.constant[n] = 0;
446 $$->data.select.constant = 0;
451 exerror(
"duplicate default in switch");
459 | case_list case_item
462case_item :
CASE constant
':'
469 exerror(
"too many case labels for switch");
505dcl_item : dcl_name {checkName (
$1);
expr.
id=
$1;} array initialize
524 if (!(disc = calloc(1,
sizeof(
Dtdisc_t))))
534 exerror(
"%s: cannot initialize associative array",
$1->name);
539 if ($4->type !=
$1->type)
545 $4->data.operand.left->data.variable.symbol =
$1;
608 if (
$1->type !=
$3->type)
630 $$->data.constant.value.string =
744 if ($4->type != $7->type)
747 exerror(
"if statement string type mismatch");
755 if (
$1->data.constant.value.integer)
768 $$ =
exnewnode(
expr.
program,
'?', 1, $4->type,
$1,
exnewnode(
expr.
program,
':', 1, $4->type, $4, $7));
793 exerror(
"cannot apply '#' operator to non-array %s",
$2->name);
795 $$->data.variable.symbol =
$2;
809 |
'&' variable %prec
UNARY
864 $$->data.call.procedure =
$1;
875 $$->data.print.descriptor =
$3->data.operand.left;
876 $3 =
$3->data.operand.right;
883 $$->data.print.descriptor->data.constant.value.integer = 2;
887 $$->data.print.descriptor->data.constant.value.integer = 1;
890 $$->data.print.descriptor = 0;
893 $$->data.print.args = preprint(
$3);
902 $$->data.scan.descriptor =
$3->data.operand.left;
903 $3 =
$3->data.operand.right;
909 $$->data.scan.descriptor = 0;
912 if (
$3 &&
$3->data.operand.left->type ==
STRING)
914 $$->data.scan.descriptor =
$3->data.operand.left;
915 $3 =
$3->data.operand.right;
918 exerror(
"%s: string argument expected",
$1->name);
921 if (!
$3 || !
$3->data.operand.left ||
$3->data.operand.left->type !=
STRING)
922 exerror(
"%s: format argument expected",
$1->name);
923 $$->data.scan.format =
$3->data.operand.left;
927 exerror(
"%s: address argument expected",
$1->name);
936 exerror(
"%s: variable assignment not supported",
$1->data.variable.symbol->name);
941 else if (
$2->type !=
$1->type)
946 $2->data.operand.left =
$1;
955 exerror(
"++ and -- invalid for string variables");
963 exerror(
"++ and -- invalid for string variables");
970 exerror(
"cannot apply IN to non-array %s",
$3->name);
971 if ((
$3->index_type > 0) && (
$1->type !=
$3->index_type))
972 exerror(
"%s indices must have type %s, not %s",
975 $$->data.variable.symbol =
$3;
976 $$->data.variable.index =
$1;
996 exerror(
"%s: identifier references not supported",
$1->name);
1003 $$->data.constant.value.floating =
$1;
1008 $$->data.constant.value.integer =
$1;
1013 $$->data.constant.value.string =
$1;
1018 $$->data.constant.value.integer =
$1;
1031variable :
ID members
1043 exerror(
"%s: is%s an array",
$1->name,
$1->local !=
NULL ?
"" :
" not");
1044 if (
$1->local !=
NULL && (
$1->index_type > 0)) {
1045 if (
$2->type !=
$1->index_type)
1046 exerror(
"%s: indices must have type %s, not %s",
1058 $$->data.variable.symbol =
$1;
1059 $$->data.variable.reference = 0;
1060 $$->data.variable.index = 0;
1061 $$->data.variable.dyna = 0;
1063 exerror(
"unknown identifier");
1104 $$ =
$1->data.operand.left;
1105 $1->data.operand.left =
$1->data.operand.right = 0;
1110arg_list :
expr %prec
','
1112 $$ =
exnewnode(
expr.
program,
',', 1, 0,
exnewnode(
expr.
program,
',', 1,
$1->type,
$1,
NULL),
NULL);
1113 $$->data.operand.right =
$$->data.operand.left;
1134formal_list : formal_item
1138 | formal_list
',' formal_item
1152 $$->data.variable.symbol =
$3;
1154 $3->type =
$1->type;
1224 if (!(disc = calloc(1,
sizeof(
Dtdisc_t))))
1250 $$->data.operand.left =
$3;
1271 for (minid = 0;
yytname[minid] !=
NULL; ++minid) {
1272 if (strcmp(
yytname[minid],
"MINTOKEN") == 0) {
1278 &&
"failed to find MINTOKEN; incorrect token list in exparse.y?");
1288 for (k = 0;
yytname[i][k] !=
'\0'; ++k) {
1298 if (j ==
index + minid) {
1309void ex_error(
const char *message) {
CDT_API Dtmethod_t * Dtset
set with unique elements
CDT_API Dt_t * dtview(Dt_t *, 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 *, int, int, 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::@87 constant
struct Exdata_u::@88 operand
struct Exdata_u::@89 select
struct Exdata_u::@90 variable
char * vmstrdup(Vmalloc_t *, const char *)