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
203 exerror(
"no nested function definitions");
270 exwarn (
"assignment used as boolean in if statement");
275 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
':',
true,
$5 ?
$5->type : 0,
$5, $6));
280 $$->data.generate.array =
$3;
281 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
282 exerror(
"simple index variable expected");
283 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
284 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
285 exerror(
"integer index variable expected");
287 $3->data.variable.index = 0;
288 $$->data.generate.statement =
$5;
295 $5->data.constant.value.integer = 1;
301 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$5,
exnewnode(
expr.
program,
';', 1, 0, $7, $9));
308 $$->data.generate.array =
$3;
309 if (!
$3->data.variable.index ||
$3->data.variable.index->op !=
DYNAMIC)
310 exerror(
"simple index variable expected");
311 $$->data.generate.index =
$3->data.variable.index->data.variable.symbol;
312 if (
$3->op ==
ID &&
$$->data.generate.index->type !=
INTEGER)
313 exerror(
"integer index variable expected");
315 $3->data.variable.index = 0;
316 $$->data.generate.statement =
$5;
321 exerror(
"cannot apply unset to non-array %s",
$3->name);
323 $$->data.variable.symbol =
$3;
324 $$->data.variable.index =
NULL;
329 exerror(
"cannot apply unset to non-array %s",
$3->name);
330 if ((
$3->index_type > 0) && (
$5->type !=
$3->index_type))
331 exerror(
"%s indices must have type %s, not %s",
334 $$->data.variable.symbol =
$3;
335 $$->data.variable.index =
$5;
340 exwarn (
"assignment used as boolean in while statement");
345 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
';',
true, 0,
NULL,
$5));
351 $$ =
exnewnode(
expr.
program,
$1->index,
true,
INTEGER,
$3,
exnewnode(
expr.
program,
DEFAULT,
true, 0, sw->
defcase, sw->
firstcase));
363 $2->data.constant.value.integer = 1;
378 exerror(
"return in void function");
389 if (!(sw = calloc(1,
sizeof(
Switch_t)))) {
402 | switch_list switch_item
417 const size_t n = sw->
cap;
420 memcpy(
$$->data.select.constant, sw->
base, n *
sizeof(
Extype_t*));
421 $$->data.select.constant[n] = 0;
424 $$->data.select.constant = 0;
429 exerror(
"duplicate default in switch");
437 | case_list case_item
440case_item :
CASE constant
':'
447 exerror(
"too many case labels for switch");
472dcl_item : dcl_name {checkName (
$1);
expr.
id=
$1;} array initialize
486 exerror(
"%s: a variable cannot be void typed",
$1->name);
500 exerror(
"%s: cannot initialize associative array",
$1->name);
505 if ($4->type !=
$1->type)
511 $4->data.operand.left->data.variable.symbol =
$1;
574 if (
$1->type !=
$3->type)
596 $$->data.constant.value.string =
710 if ($4->type != $7->type)
713 exerror(
"if statement string type mismatch");
721 if (
$1->data.constant.value.integer)
734 $$ =
exnewnode(
expr.
program,
'?',
true, $4->type,
$1,
exnewnode(
expr.
program,
':',
true, $4->type, $4, $7));
759 exerror(
"cannot apply '#' operator to non-array %s",
$2->name);
761 $$->data.variable.symbol =
$2;
775 |
'&' variable %prec
UNARY
830 $$->data.call.procedure =
$1;
841 $$->data.print.descriptor =
$3->data.operand.left;
842 $3 =
$3->data.operand.right;
849 $$->data.print.descriptor->data.constant.value.integer = 2;
853 $$->data.print.descriptor->data.constant.value.integer = 1;
856 $$->data.print.descriptor = 0;
859 $$->data.print.args = preprint(
$3);
868 $$->data.scan.descriptor =
$3->data.operand.left;
869 $3 =
$3->data.operand.right;
875 $$->data.scan.descriptor = 0;
878 if (
$3 &&
$3->data.operand.left->type ==
STRING)
880 $$->data.scan.descriptor =
$3->data.operand.left;
881 $3 =
$3->data.operand.right;
884 exerror(
"%s: string argument expected",
$1->name);
887 if (!
$3 || !
$3->data.operand.left ||
$3->data.operand.left->type !=
STRING)
888 exerror(
"%s: format argument expected",
$1->name);
889 $$->data.scan.format =
$3->data.operand.left;
893 exerror(
"%s: address argument expected",
$1->name);
902 exerror(
"%s: variable assignment not supported",
$1->data.variable.symbol->name);
907 else if (
$2->type !=
$1->type)
912 $2->data.operand.left =
$1;
921 exerror(
"++ and -- invalid for string variables");
929 exerror(
"++ and -- invalid for string variables");
936 exerror(
"cannot apply IN to non-array %s",
$3->name);
937 if (
$3->index_type > 0 &&
$1->type !=
$3->index_type)
938 exerror(
"%s indices must have type %s, not %s",
941 $$->data.variable.symbol =
$3;
942 $$->data.variable.index =
$1;
962 exerror(
"%s: identifier references not supported",
$1->name);
969 $$->data.constant.value.floating =
$1;
974 $$->data.constant.value.integer =
$1;
979 $$->data.constant.value.string =
$1;
984 $$->data.constant.value.integer =
$1;
1007 exerror(
"%s: is%s an array",
$1->name,
$1->local !=
NULL ?
"" :
" not");
1008 if (
$1->local !=
NULL &&
$1->index_type > 0) {
1009 if (
$2->type !=
$1->index_type)
1010 exerror(
"%s: indices must have type %s, not %s",
1022 $$->data.variable.symbol =
$1;
1023 $$->data.variable.reference = 0;
1024 $$->data.variable.index = 0;
1025 $$->data.variable.dyna = 0;
1027 exerror(
"unknown identifier");
1068 $$ =
$1->data.operand.left;
1069 $1->data.operand.left =
$1->data.operand.right = 0;
1074arg_list :
expr %prec
','
1076 $$ =
exnewnode(
expr.
program,
',',
true, 0,
exnewnode(
expr.
program,
',',
true,
$1->type,
$1,
NULL),
NULL);
1077 $$->data.operand.right =
$$->data.operand.left;
1098formal_list : formal_item
1102 | formal_list
',' formal_item
1115 if (
$1->type == 0) {
1116 exerror(
"%s: parameters to functions cannot be void typed",
$3->name);
1119 $$->data.variable.symbol =
$3;
1121 $3->type =
$1->type;
1212 (void)
dtclose(
$$->data.procedure.frame);
1213 $$->data.procedure.frame =
NULL;
1214 $$->data.procedure.args =
$3;
1235 for (minid = 0;
yytname[minid] !=
NULL; ++minid) {
1236 if (strcmp(
yytname[minid],
"MINTOKEN") == 0) {
1242 &&
"failed to find MINTOKEN; incorrect token list in exparse.y?");
1252 for (k = 0;
yytname[i][k] !=
'\0'; ++k) {
1262 if (j ==
index + minid) {
1273void 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 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::@87 variable
struct Exdata_u::@84 constant
struct Exdata_u::@85 operand
struct Exdata_u::@86 select
char * vmstrdup(Vmalloc_t *, const char *)