np->width = np->rval->width;
else if (np->opcode == SELECT)
np->width = np->rval->width; /* n-bit select has an n-bit result */
+ else if (np->opcode == UNKNOWNOP || np->opcode == INTERSECTION) /* AIS */
+ np->width = (np->rval->width == 16 ? np->lval->width : 32);
+ else if (np->opcode == BADCHAR) /* AIS */
+ np->width = 16;
else if (np->opcode == SUB)
np->width = np->lval->width; /* type of the array */
else if (np->opcode == SLAT || np->opcode == BACKSLAT)
(void) fprintf(fp, ")");
break;
+ case UNKNOWNOP:
+ (void) fprintf(fp, "(");
+ explexpr(np->rval->lval, fp);
+ if(np->lval->constant < 256)
+ (void) fprintf(fp, " %c ", (char)np->lval->constant);
+ else
+ (void) fprintf(fp, " %c^H%c ",
+ (char)(np->lval->constant / 256),
+ (char)(np->lval->constant % 256));
+ explexpr(np->rval->rval, fp);
+ (void) fprintf(fp, ")");
+ break;
+
case SLAT:
(void) fprintf(fp, "(");
explexpr(np->lval, fp);
free(temp);
break;
+ case UNKNOWNOP: /* don't be silly */
+ fprintf(fp, " ick_lose(IE277, ick_lineno, (char*) NULL);\n");
+ ick_lwarn(W278, emitlineno, (char*) NULL);
+ break;
+
case BACKSLAT:
/* Unimplemented. This isn't even in the parser yet, so it's a
ick_mystery how we got here. */
else if(!pickcompile)
{
node* sp;
-
+
if (np->opcode != SUB) {
sp = np;
(void) fprintf(fp," (void) ick_assign((char*)&");
(void) fprintf(fp, ")");
break;
+ case UNKNOWNOP: /* AIS //tk */
+ (void) fprintf(fp, "0");
+ break;
+
case BACKSLAT: /* AIS */
/* Unimplemented. This isn't even in the parser yet, so it's a
ick_mystery how we got here. */
/* AIS: ONCE and AGAIN added, for multithread support; also, NOSPOT added,
so that I can reserve _ for future use (it's nowhere in the grammar yet) */
%token MAYBE DO PLEASE NOT ONCE AGAIN MESH NOSPOT ick_ONESPOT ick_TWOSPOT ick_TAIL ick_HYBRID
-%token MINGLE SELECT /* AIS: SPARK EARS */ SUB BY BADCHAR
+%token MINGLE SELECT UNKNOWNOP /* AIS: SPARK EARS */ SUB BY
/* AIS: For operand overloading */
%token SLAT BACKSLAT
-%token <numval> NUMBER UNARY OHOHSEVEN GERUND LABEL
+%token <numval> NUMBER UNARY OHOHSEVEN GERUND LABEL BADCHAR
%token <node> INTERSECTION
/*
%type <node> subscr byexpr scalar scalar2s ick_array initem outitem sublist
%type <node> unambig limunambig subscr1 sublist1 oparray osubscr osubscr1
%type <node> notanlvalue nlunambig lunambig unknownstatement unknownatom
-%type <node> unknownsin unknownsif unknownaid
+%type <node> unknownsin unknownsif unknownaid unop
%type <tuple> preproc perform mtperform
%type <numval> please preftype
{$$ = $1; $$->rval = cons(SUB, $$->rval, $3);}
;
+/* AIS: Unknown operators */
+unop : BADCHAR {$$ = newnode(); $$->opcode = BADCHAR;
+ $$->constant = $1;}
+ ;
+
/* here goes the general expression syntax */
expr : unambig {$$ = $1;}
/* AIS: CLC-INTERCAL allows right-association of SELECT and MINGLE.
(Strangely, that simplifies this section somewhat.) */
| unambig SELECT expr {$$ = cons(SELECT, $1, $3);}
| unambig MINGLE expr {$$ = cons(MINGLE, $1, $3);}
+ | unambig unop expr {$$ = cons(UNKNOWNOP, $2,
+ cons(INTERSECTION, $1, $3));}
/* AIS: Operand overloading */
| scalar SLAT expr {NEWFANGLED{$$ = cons(SLAT, $1, $3);
opoverused=1; if(!firstslat)
| osubscr {$$ = $1;}
| unambig SELECT expr {$$ = cons(SELECT, $1, $3);}
| unambig MINGLE expr {$$ = cons(MINGLE, $1, $3);}
+ | unambig unop expr {$$ = cons(UNKNOWNOP, $2,
+ cons(INTERSECTION, $1, $3));}
| scalar SLAT expr {NEWFANGLED{$$ = cons(SLAT, $1, $3);
opoverused=1; if(!firstslat)
firstslat=$$; else
limexpr : limunambig {$$ = $1;}
| limunambig SELECT expr {$$ = cons(SELECT, $1, $3);}
| limunambig MINGLE expr {$$ = cons(MINGLE, $1, $3);}
+ | limunambig unop expr {$$ = cons(UNKNOWNOP, $2,
+ cons(INTERSECTION, $1, $3));}
| scalar SLAT expr {NEWFANGLED{$$ = cons(SLAT, $1, $3);
opoverused=1; if(!firstslat)
firstslat=$$; else