cvsuser 02/07/11 14:09:12
Modified: languages/imcc imcc.l imcc.y
Log:
Added some ops from Sean O'Rourke and a minor cleanup.
Revision Changes Path
1.4 +3 -4 parrot/languages/imcc/imcc.l
Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -w -r1.3 -r1.4
--- imcc.l 4 Jul 2002 02:58:30 -0000 1.3
+++ imcc.l 11 Jul 2002 21:09:12 -0000 1.4
@@ -73,6 +73,7 @@
"dec" return(DEC);
"float" return(FLOAT);
"new" return(NEW);
+"defined" return(DEFINED);
"string" return(STRING);
"call" return(CALL);
"print" return(PRINT);
@@ -83,6 +84,7 @@
"restoreall" return(RESTOREALL);
"<<" return(SHIFT_LEFT);
">>" return(SHIFT_RIGHT);
+"~~" return(LOG_XOR);
"<" return(RELOP_LT);
"<=" return(RELOP_LTE);
">" return(RELOP_GT);
@@ -91,10 +93,7 @@
"!=" return(RELOP_NE);
{LETTER}{LETTERDIGIT}*":" {
- int n = strlen(yytext);
- yytext[n-1] = 0; /* trim last ':' (argh, I should learn yacc) */
- n = strlen(yytext);
-
+ yytext[yyleng-1] = 0; /* trim last ':' */
yylval.s = str_dup(yytext);
return(LABEL);
}
1.8 +96 -11 parrot/languages/imcc/imcc.y
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- imcc.y 4 Jul 2002 16:21:53 -0000 1.7
+++ imcc.y 11 Jul 2002 21:09:12 -0000 1.8
@@ -12,6 +12,7 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
+#include <sysexits.h>
#include "imc.h"
#define YYDEBUG 1
@@ -31,6 +32,23 @@
return r0;
}
+SymReg * iNOT(SymReg *r0, SymReg*r1) {
+ emitb(mk_instruction("not %s, %s", r0, r1, NULL, NULL, IF_unary));
+ return r0;
+}
+
+SymReg * iNEG(SymReg *r0, SymReg*r1) {
+ if (r0->set != 'S' || r0->set == r1->set) {
+ emitb(mk_instruction("neg %s, %s", r0, r1, NULL, NULL, IF_unary));
+ }
+ else {
+ fprintf(stderr, "line %ld: Syntax error, neg arguments must be int, float,
or PMC\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
SymReg * iINC(SymReg *r0) {
emitb(mk_instruction("inc %s", r0, NULL, NULL, NULL, IF_inplace));
return r0;
@@ -76,14 +94,43 @@
return r0;
}
+SymReg * iXOR(SymReg *r0, SymReg*r1, SymReg *r2) {
+ if ((r0->set == 'I' && r1->set == 'I' && r2->set == 'I')
+ || (r0->set == 'P' && r1->set == 'P' && r2->set == 'P')) {
+ emitb(mk_instruction("xor %s, %s, %s", r0, r1, r2, NULL, IF_binary));
+ }
+ else {
+ fprintf(stderr, "line %ld: Syntax error, xor arguments must be int or
PMC\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
+SymReg * iBAND(SymReg *r0, SymReg*r1, SymReg *r2) {
+ emitb(mk_instruction("band %s, %s, %s", r0, r1, r2, NULL, IF_binary));
+ return r0;
+}
+
+SymReg * iBOR(SymReg *r0, SymReg*r1, SymReg *r2) {
+ emitb(mk_instruction("bor %s, %s, %s", r0, r1, r2, NULL, IF_binary));
+ return r0;
+}
+
+SymReg * iBXOR(SymReg *r0, SymReg*r1, SymReg *r2) {
+ emitb(mk_instruction("bxor %s, %s, %s", r0, r1, r2, NULL, IF_binary));
+ return r0;
+}
+
SymReg * iCONCAT(SymReg *r0, SymReg*r1, SymReg *r2) {
- if(r0->set == 'S' && r1->set == 'S' && r2->set == 'S') {
+ if((r0->set == 'S' && r1->set == 'S' && r2->set == 'S')
+ || (r0->set == 'P' && r1->set == 'P' && r2->set == 'P')) {
emitb(mk_instruction("concat %s, %s, %s", r0, r1, r2, NULL, IF_binary));
}
else {
- fprintf(stderr, "line %ld: Syntax error, non-string type used with concat
operator\n",
+ fprintf(stderr, "line %ld: Syntax error, concat arguments must be all
strings or all PMC's\n",
line);
- exit(0);
+ exit(EX_DATAERR);
}
return r0;
}
@@ -146,26 +193,32 @@
}
SymReg * iINDEXFETCH(SymReg * r0, SymReg * r1, SymReg * r2) {
- if(r0->set == 'S') {
+ if(r0->set == 'S' && r1->set == 'S' && r2->set == 'I') {
emitb(mk_instruction("substr %s, %s, %s, 1", r0, r1, r2, NULL, IF_binary));
}
+ else if (r1->set == 'P') {
+ emitb(mk_instruction("set %s, %s[%s]", r0, r1, r2, NULL, IF_binary));
+ }
else {
fprintf(stderr, "FIXME: Internal error, unsupported indexed fetch
operation\n");
- exit(0);
+ exit(EX_SOFTWARE);
}
return r0;
}
SymReg * iINDEXSET(SymReg * r0, SymReg * r1, SymReg * r2) {
- if(r0->set == 'S') {
+ if(r0->set == 'S' && r1->set == 'I' && r2->set == 'S') {
/* Temporaries assigned by IMCC are of form (T.n)
SymReg * temp = mk_symreg("(S.0)", 'S');
*/
emitb(mk_instruction("substr %s, %s, 1, %s", r0, r1, r2, NULL, IF_binary));
}
+ else if (r0->set == 'P') {
+ emitb(mk_instruction("set %s[%s], %s", r0, r1, r2, NULL, IF_binary));
+ }
else {
fprintf(stderr, "FIXME: Internal error, unsupported indexed set
operation\n");
- exit(0);
+ exit(EX_SOFTWARE);
}
return r0;
}
@@ -180,6 +233,16 @@
return 0;
}
+SymReg * iIF1(SymReg * r0, SymReg * dest)
+{
+ Instruction * i;
+ char op[256];
+ strcpy(op, "if %s, %s");
+ i = emitb(mk_instruction(op, r0, dest, 0, NULL, IF_r0_read | IF_r1_branch));
+ i->type = ITBRANCH;
+ return 0;
+}
+
SymReg * iNEW(SymReg * r0, char * type) {
char op[256];
strcpy(op, "new %s, .");
@@ -188,6 +251,19 @@
return r0;
}
+SymReg * iDEFINED(SymReg * r0, SymReg * r1) {
+ if (r0->set == 'I' && r1->set == 'P') {
+ emitb(mk_instruction("defined %s, %s", r0, r1, NULL, NULL,
+ IF_r0_write | IF_r1_read ));
+ }
+ else {
+ fprintf(stderr, "line %ld: Syntax error, defined: arguments must be int,
PMC\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
SymReg * iEMIT(char * assembly) {
emitb(mk_instruction(assembly, NULL, NULL, NULL, NULL, 0));
return 0;
@@ -222,7 +298,7 @@
%token <i> CALL GOTO BRANCH ARG RET PRINT IF NEW END SAVEALL RESTOREALL
%token <i> SUB NAMESPACE CLASS ENDCLASS SYM LOCAL PARAM PUSH POP INC DEC
-%token <i> SHIFT_LEFT SHIFT_RIGHT INT FLOAT STRING
+%token <i> SHIFT_LEFT SHIFT_RIGHT INT FLOAT STRING DEFINED LOG_XOR
%token <i> RELOP_EQ RELOP_NE RELOP_GT RELOP_GTE RELOP_LT RELOP_LTE
%token <s> EMIT LABEL
%token <s> IREG NREG SREG PREG IDENTIFIER STRINGC INTC FLOATC
@@ -334,6 +410,8 @@
assignment:
labels target '=' var { $$ = iMOVE($2, $4); }
+ | labels target '=' '!' var { $$ = iNOT($2, $5); }
+ | labels target '=' '-' var { $$ = iNEG($2, $5); }
| labels target '=' var '+' var { $$ = iADD($2, $4, $6); }
| labels target '=' var '-' var { $$ = iSUB($2, $4, $6); }
| labels target '=' var '*' var { $$ = iMUL($2, $4, $6); }
@@ -342,14 +420,21 @@
| labels target '=' var '.' var { $$ = iCONCAT($2, $4, $6); }
| labels target '=' var SHIFT_LEFT var { $$ = iSHL($2, $4, $6); }
| labels target '=' var SHIFT_RIGHT var { $$ = iSHR($2, $4, $6); }
+ | labels target '=' var LOG_XOR var { $$ = iXOR($2, $4, $6); }
+ | labels target '=' var '&' var { $$ = iBAND($2, $4, $6); }
+ | labels target '=' var '|' var { $$ = iBOR($2, $4, $6); }
+ | labels target '=' var '~' var { $$ = iBXOR($2, $4, $6); }
| labels target '=' var '[' var ']' { $$ = iINDEXFETCH($2, $4, $6); }
| labels var '[' var ']' '=' var { $$ = iINDEXSET($2, $4, $7); }
| labels target '=' NEW classname { $$ = iNEW($2, $5); }
+ | labels target '=' DEFINED var { $$ = iDEFINED($2, $5); }
;
if_statement:
labels IF var relop var GOTO IDENTIFIER
{ $$ = iIF($4, $3, $5, mk_address($7)); }
+ | labels IF var GOTO IDENTIFIER
+ { $$ = iIF1($3, mk_address($5)); }
;
relop:
@@ -415,12 +500,12 @@
if (argc <= 1) {
fprintf(stderr, "No source file specified.\n" );
- exit(0);
+ exit(EX_NOINPUT);
}
if(!(yyin = fopen(argv[1], "r"))) {
fprintf(stderr, "Error reading source file %s.\n", argv[1] );
- exit(0);
+ exit(EX_IOERR);
}
line = 1;
@@ -456,7 +541,7 @@
fprintf(stderr, "last token = [%s]\n", yylval.s);
fprintf(stderr, "(error) line %ld: %s\n", line, s );
fprintf(stderr, "Didn't create output asm.\n" );
- exit(0);
+ exit(EX_UNAVAILABLE);
}