diff options
Diffstat (limited to 'src/old/c/lex.c')
-rw-r--r-- | src/old/c/lex.c | 1058 |
1 files changed, 0 insertions, 1058 deletions
diff --git a/src/old/c/lex.c b/src/old/c/lex.c deleted file mode 100644 index 3d119331d..000000000 --- a/src/old/c/lex.c +++ /dev/null @@ -1,1058 +0,0 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - - -#define EXTERN -#include "go.h" -#include "y.tab.h" - -#define DBG if(!debug['x']);else print -enum -{ - EOF = -1, -}; - -int -main(int argc, char *argv[]) -{ - int c; - - outfile = nil; - package = "____"; - ARGBEGIN { - default: - c = ARGC(); - if(c >= 0 && c < sizeof(debug)) - debug[c]++; - break; - - case 'o': - outfile = ARGF(); - break; - - case 'k': - package = ARGF(); - break; - } ARGEND - - if(argc != 1) - goto usage; - - fmtinstall('O', Oconv); // node opcodes - fmtinstall('E', Econv); // etype opcodes - fmtinstall('J', Jconv); // all the node flags - fmtinstall('S', Sconv); // sym pointer - fmtinstall('T', Tconv); // type pointer - fmtinstall('N', Nconv); // node pointer - fmtinstall('Z', Zconv); // escaped string - lexinit(); - - curio.infile = argv[0]; - - curio.bin = Bopen(curio.infile, OREAD); - if(curio.bin == nil) - fatal("cant open: %s", curio.infile); - - externdcl = mal(sizeof(*externdcl)); - externdcl->back = externdcl; - dclcontext = PEXTERN; - - exportlist = mal(sizeof(*exportlist)); - exportlist->back = exportlist; - - // function field skeleton - fskel = nod(OLIST, N, nod(OLIST, N, N)); - fskel->left = nod(ODCLFIELD, N, N); - fskel->right->left = nod(ODCLFIELD, N, N); - fskel->right->right = nod(ODCLFIELD, N, N); - - curio.peekc = 0; - curio.lineno = 1; - nerrors = 0; - yyparse(); - if(nerrors == 0) { - dumpobj(); - } - - Bterm(curio.bin); - if(bout != nil) - Bterm(bout); - - if(nerrors) - errorexit(); - - myexit(0); - return 0; - -usage: - print("flags:\n"); - print(" -d print declarations\n"); - print(" -f print stack frame structure\n"); - print(" -k name specify package name\n"); - print(" -o file specify output file\n"); - print(" -p print the assembly language\n"); - print(" -w print the parse tree after typing\n"); - print(" -x print lex tokens\n"); - print(" -h panic on an error\n"); - myexit(0); - return 0; -} - -void -importfile(Val *f) -{ - Biobuf *imp; - long c; - - if(f->ctype != CTSTR) { - yyerror("import statement not a string"); - return; - } - snprint(namebuf, sizeof(namebuf), "%Z.go.c", f->sval); - - imp = Bopen(namebuf, OREAD); - if(imp == nil) { - yyerror("cant open import: %s", namebuf); - return; - } - - /* - * position the input right - * after (( and return - */ - pushedio = curio; - curio.bin = imp; - curio.lineno = 1; - curio.peekc = 0; - curio.infile = strdup(namebuf); - for(;;) { - c = getc(); - if(c == EOF) - break; - if(c != '(') - continue; - c = getc(); - if(c == EOF) - break; - if(c != '(') - continue; - return; - } - yyerror("no import in: %Z", f->sval); - unimportfile(); -} - -void -unimportfile(void) -{ - if(curio.bin != nil && pushedio.bin != nil) { - Bterm(curio.bin); - curio = pushedio; - pushedio.bin = nil; - } -} - -long -yylex(void) -{ - long c, c1; - char *cp; - Rune rune; - int escflag; - Sym *s; - -l0: - c = getc(); - if(isspace(c)) - goto l0; - - if(c >= Runeself) { - /* all multibyte runes are alpha */ - cp = namebuf; - goto talph; - } - - if(isalpha(c)) { - cp = namebuf; - goto talph; - } - - if(isdigit(c)) - goto tnum; - - switch(c) { - case EOF: - ungetc(EOF); - return -1; - - case '_': - cp = namebuf; - goto talph; - - case '.': - c1 = getc(); - if(isdigit(c1)) { - cp = namebuf; - *cp++ = c; - c = c1; - c1 = 0; - goto casedot; - } - break; - - case '"': - /* "..." */ - strcpy(namebuf, "\"<string>\""); - cp = mal(sizeof(long)); - c1 = 4; - - caseq: - for(;;) { - c = escchar('"', &escflag); - if(c == EOF) - break; - if(escflag) { - cp = remal(cp, c1, 1); - cp[c1++] = c; - } else { - rune = c; - c = runelen(rune); - cp = remal(cp, c1, c); - runetochar(cp+c1, &rune); - c1 += c; - } - } - goto catem; - - case '`': - /* `...` */ - strcpy(namebuf, "`<string>`"); - cp = mal(sizeof(long)); - c1 = 4; - - casebq: - for(;;) { - c = getc(); - if(c == EOF || c == '`') - break; - cp = remal(cp, c1, 1); - cp[c1++] = c; - } - - catem: - for(;;) { - /* it takes 2 peekc's to skip comments */ - c = getc(); - if(isspace(c)) - continue; - if(c == '"') - goto caseq; - if(c == '`') - goto casebq; - ungetc(c); - break; - } - - *(long*)cp = c1-4; // length - do { - cp = remal(cp, c1, 1); - cp[c1++] = 0; - } while(c1 & MAXALIGN); - yylval.val.sval = (String*)cp; - yylval.val.ctype = CTSTR; - DBG("lex: string literal\n"); - return LLITERAL; - - case '\'': - /* '.' */ - c = escchar('\'', &escflag); - if(c == EOF) - c = '\''; - c1 = escchar('\'', &escflag); - if(c1 != EOF) { - yyerror("missing '"); - ungetc(c1); - } - yylval.val.vval = c; - yylval.val.ctype = CTINT; - DBG("lex: codepoint literal\n"); - return LLITERAL; - - case '/': - c1 = getc(); - if(c1 == '*') { - for(;;) { - c = getr(); - while(c == '*') { - c = getr(); - if(c == '/') - goto l0; - } - if(c == EOF) { - yyerror("eof in comment"); - errorexit(); - } - } - } - if(c1 == '/') { - for(;;) { - c = getr(); - if(c == '\n') - goto l0; - if(c == EOF) { - yyerror("eof in comment"); - errorexit(); - } - } - } - if(c1 == '=') { - c = ODIV; - goto asop; - } - break; - - case ':': - c1 = getc(); - if(c1 == '=') { - c = LCOLAS; - goto lx; - } - break; - - case '*': - c1 = getc(); - if(c1 == '=') { - c = OMUL; - goto asop; - } - break; - - case '%': - c1 = getc(); - if(c1 == '=') { - c = OMOD; - goto asop; - } - break; - - case '+': - c1 = getc(); - if(c1 == '+') { - c = LINC; - goto lx; - } - if(c1 == '=') { - c = OADD; - goto asop; - } - break; - - case '-': - c1 = getc(); - if(c1 == '-') { - c = LDEC; - goto lx; - } - if(c1 == '=') { - c = OSUB; - goto asop; - } - break; - - case '>': - c1 = getc(); - if(c1 == '>') { - c = LRSH; - c1 = getc(); - if(c1 == '=') { - c = ORSH; - goto asop; - } - break; - } - if(c1 == '=') { - c = LGE; - goto lx; - } - c = LGT; - break; - - case '<': - c1 = getc(); - if(c1 == '<') { - c = LLSH; - c1 = getc(); - if(c1 == '=') { - c = OLSH; - goto asop; - } - break; - } - if(c1 == '=') { - c = LLE; - goto lx; - } - c = LLT; - break; - - case '=': - c1 = getc(); - if(c1 == '=') { - c = LEQ; - goto lx; - } - break; - - case '!': - c1 = getc(); - if(c1 == '=') { - c = LNE; - goto lx; - } - break; - - case '&': - c1 = getc(); - if(c1 == '&') { - c = LANDAND; - goto lx; - } - if(c1 == '=') { - c = OAND; - goto asop; - } - break; - - case '|': - c1 = getc(); - if(c1 == '|') { - c = LOROR; - goto lx; - } - if(c1 == '=') { - c = OOR; - goto asop; - } - break; - - case '^': - c1 = getc(); - if(c1 == '=') { - c = OXOR; - goto asop; - } - break; - - default: - goto lx; - } - ungetc(c1); - -lx: - if(c > 0xff) - DBG("lex: TOKEN %s\n", lexname(c)); - else - DBG("lex: TOKEN '%c'\n", c); - return c; - -asop: - yylval.val.vval = c; // rathole to hold which asop - DBG("lex: TOKEN ASOP %c\n", c); - return LASOP; - -talph: - /* - * cp is set to namebuf and some - * prefix has been stored - */ - for(;;) { - if(c >= Runeself) { - for(c1=0;;) { - cp[c1++] = c; - if(fullrune(cp, c1)) - break; - c = getc(); - } - cp += c1; - c = getc(); - continue; - } - if(!isalnum(c) && c != '_') - break; - *cp++ = c; - c = getc(); - } - *cp = 0; - ungetc(c); - - s = lookup(namebuf); - if(s->lexical == LIGNORE) - goto l0; - - if(context != nil) { - s = pkglookup(s->name, context); - if(s->lexical == LIGNORE) - goto l0; - } - - DBG("lex: %S %s\n", s, lexname(s->lexical)); - yylval.sym = s; - if(s->lexical == LBASETYPE) - return LATYPE; - return s->lexical; - -tnum: - c1 = 0; - cp = namebuf; - if(c != '0') { - for(;;) { - *cp++ = c; - c = getc(); - if(isdigit(c)) - continue; - goto dc; - } - } - *cp++ = c; - c = getc(); - if(c == 'x' || c == 'X') - for(;;) { - *cp++ = c; - c = getc(); - if(isdigit(c)) - continue; - if(c >= 'a' && c <= 'f') - continue; - if(c >= 'A' && c <= 'F') - continue; - if(cp == namebuf+2) - yyerror("malformed hex constant"); - goto ncu; - } - if(c < '0' || c > '7') - goto dc; - for(;;) { - if(c >= '0' && c <= '7') { - *cp++ = c; - c = getc(); - continue; - } - goto ncu; - } - -dc: - if(c == '.') - goto casedot; - if(c == 'e' || c == 'E') - goto casee; - -ncu: - *cp = 0; - ungetc(c); - if(mpatov(namebuf, &yylval.val.vval)) { - yyerror("overflow in constant"); - yylval.val.vval = 0; - } - yylval.val.ctype = CTINT; - DBG("lex: integer literal\n"); - return LLITERAL; - -casedot: - for(;;) { - *cp++ = c; - c = getc(); - if(!isdigit(c)) - break; - } - if(c != 'e' && c != 'E') - goto caseout; - -casee: - *cp++ = 'e'; - c = getc(); - if(c == '+' || c == '-') { - *cp++ = c; - c = getc(); - } - if(!isdigit(c)) - yyerror("malformed fp constant exponent"); - while(isdigit(c)) { - *cp++ = c; - c = getc(); - } - -caseout: - *cp = 0; - ungetc(c); - if(mpatof(namebuf, &yylval.val.dval)) { - yyerror("overflow in float constant"); - yylval.val.dval = 0; - } - yylval.val.ctype = CTFLT; - DBG("lex: floating literal\n"); - return LLITERAL; -} - -int -getc(void) -{ - int c; - - c = curio.peekc; - if(c != 0) { - curio.peekc = 0; - if(c == '\n') - curio.lineno++; - return c; - } - - c = Bgetc(curio.bin); - switch(c) { - case 0: - case EOF: - return EOF; - - case '\n': - curio.lineno++; - break; - - } - return c; -} - -void -ungetc(int c) -{ - curio.peekc = c; - if(c == '\n') - curio.lineno--; -} - -long -getr(void) -{ - int c, i; - char str[UTFmax+1]; - Rune rune; - - c = getc(); - if(c < Runeself) - return c; - i = 0; - str[i++] = c; - -loop: - c = getc(); - str[i++] = c; - if(!fullrune(str, i)) - goto loop; - c = chartorune(&rune, str); - if(rune == Runeerror && c == 1) { - yyerror("illegal rune in string"); - for(c=0; c<i; c++) - print(" %.2x", *(uchar*)(str+c)); - print("\n"); - } - return rune; -} - -int -getnsc(void) -{ - int c; - - c = getc(); - for(;;) { - if(!isspace(c)) - return c; - if(c == '\n') { - curio.lineno++; - return c; - } - c = getc(); - } - return 0; -} - - -long -escchar(long e, int *escflg) -{ - long c, l; - int i; - - *escflg = 0; - -loop: - c = getr(); - if(c == '\n') { - yyerror("newline in string"); - return EOF; - } - if(c != '\\') { - if(c == e) - c = EOF; - return c; - } - c = getr(); - switch(c) { - case '\n': - goto loop; - - case 'x': - i = 2; - goto hex; - - case 'u': - i = 4; - goto hex; - - case 'U': - i = 8; - goto hex; - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - goto oct; - - case 'a': return '\a'; - case 'b': return '\b'; - case 'f': return '\f'; - case 'n': return '\n'; - case 'r': return '\r'; - case 't': return '\t'; - case 'v': return '\v'; - - default: - warn("unknown escape sequence: %c", c); - } - return c; - -hex: - l = 0; - for(; i>0; i--) { - c = getc(); - if(c >= '0' && c <= '9') { - l = l*16 + c-'0'; - continue; - } - if(c >= 'a' && c <= 'f') { - l = l*16 + c-'a' + 10; - continue; - } - if(c >= 'A' && c <= 'F') { - l = l*16 + c-'A' + 10; - continue; - } - warn("non-hex character in escape sequence: %c", c); - ungetc(c); - break; - } - *escflg = 1; - return l; - -oct: - l = c - '0'; - for(i=2; i>0; i--) { - c = getc(); - if(c >= '0' && c <= '7') { - l = l*8 + c-'0'; - continue; - } - warn("non-oct character in escape sequence: %c", c); - ungetc(c); - } - if(l > 255) - warn("oct escape value > 255: %d", l); - *escflg = 1; - return l; -} - -static struct -{ - char* name; - int lexical; - int etype; -} syms[] = -{ -/* name lexical etype - */ -/* basic types */ - "int8", LBASETYPE, TINT8, - "int16", LBASETYPE, TINT16, - "int32", LBASETYPE, TINT32, - "int64", LBASETYPE, TINT64, - - "uint8", LBASETYPE, TUINT8, - "uint16", LBASETYPE, TUINT16, - "uint32", LBASETYPE, TUINT32, - "uint64", LBASETYPE, TUINT64, - - "float32", LBASETYPE, TFLOAT32, - "float64", LBASETYPE, TFLOAT64, - "float80", LBASETYPE, TFLOAT80, - - "bool", LBASETYPE, TBOOL, - "byte", LBASETYPE, TUINT8, - "char", LBASETYPE, TUINT8, // temp?? - "string", LBASETYPE, TSTRING, - -/* keywords */ - "any", LANY, Txxx, - "break", LBREAK, Txxx, - "case", LCASE, Txxx, - "chan", LCHAN, Txxx, - "const", LCONST, Txxx, - "continue", LCONTINUE, Txxx, - "convert", LCONVERT, Txxx, - "default", LDEFAULT, Txxx, - "else", LELSE, Txxx, - "export", LEXPORT, Txxx, - "fallthrough", LFALL, Txxx, - "false", LFALSE, Txxx, - "for", LFOR, Txxx, - "func", LFUNC, Txxx, - "go", LGO, Txxx, - "goto", LGOTO, Txxx, - "if", LIF, Txxx, - "import", LIMPORT, Txxx, - "interface", LINTERFACE, Txxx, - "iota", LIOTA, Txxx, - "map", LMAP, Txxx, - "new", LNEW, Txxx, - "len", LLEN, Txxx, - "nil", LNIL, Txxx, - "package", LPACKAGE, Txxx, - "panic", LPANIC, Txxx, - "print", LPRINT, Txxx, - "range", LRANGE, Txxx, - "return", LRETURN, Txxx, - "struct", LSTRUCT, Txxx, - "switch", LSWITCH, Txxx, - "true", LTRUE, Txxx, - "type", LTYPE, Txxx, - "var", LVAR, Txxx, - - "notwithstanding", LIGNORE, Txxx, - "thetruthofthematter", LIGNORE, Txxx, - "despiteallobjections", LIGNORE, Txxx, - "whereas", LIGNORE, Txxx, - "insofaras", LIGNORE, Txxx, -}; - -void -lexinit(void) -{ - int i, etype, lex; - Sym *s; - Node *t; - - - for(i=TINT8; i<=TUINT64; i++) - isint[i] = 1; - for(i=TFLOAT32; i<=TFLOAT80; i++) - isfloat[i] = 1; - - /* - * initialize okfor - */ - for(i=0; i<NTYPE; i++) { - if(isint[i]) { - okforeq[i] = 1; - okforadd[i] = 1; - okforand[i] = 1; - } - if(isfloat[i]) { - okforeq[i] = 1; - okforadd[i] = 1; - } - switch(i) { - case TBOOL: - okforeq[i] = 1; - break; - case TPTR: - okforeq[i] = 1; - break; - } - minfloatval[i] = 0.0; - maxfloatval[i] = 0.0; - minintval[i] = 0; - maxintval[i] = 0; - } -// this stuff smells - really need to do constants -// in multi precision arithmetic - - maxintval[TINT8] = 0x7f; - minintval[TINT8] = -maxintval[TINT8]-1; - maxintval[TINT16] = 0x7fff; - minintval[TINT16] = -maxintval[TINT16]-1; - maxintval[TINT32] = 0x7fffffffL; - minintval[TINT32] = -maxintval[TINT32]-1; - maxintval[TINT64] = 0x7fffffffffffffffLL; - minintval[TINT64] = -maxintval[TINT64]-1; - - maxintval[TUINT8] = 0xff; - maxintval[TUINT16] = 0xffff; - maxintval[TUINT32] = 0xffffffffL; - maxintval[TUINT64] = 0xffffffffffffffffLL; - - maxfloatval[TFLOAT32] = 3.40282347e+38; - minfloatval[TFLOAT32] = -maxfloatval[TFLOAT32]; - maxfloatval[TFLOAT64] = 1.7976931348623157e+308; - minfloatval[TFLOAT64] = -maxfloatval[TFLOAT64]-1; - - /* - * initialize basic types array - * initialize known symbols - */ - for(i=0; i<nelem(syms); i++) { - lex = syms[i].lexical; - s = lookup(syms[i].name); - s->lexical = lex; - - if(lex != LBASETYPE) - continue; - - etype = syms[i].etype; - if(etype < 0 || etype >= nelem(types)) - fatal("lexinit: %s bad etype", s->name); - - t = types[etype]; - if(t != N) { - s->otype = t; - continue; - } - t = nod(OTYPE, N, N); - t->etype = etype; - switch(etype) { - case TSTRING: - case TCHAN: - case TMAP: - t = ptrto(t); - } - t->sym = s; - t->recur = 1; // supresses printing beyond name - - types[etype] = t; - s->otype = t; - } - - /* pick up the backend typedefs */ - belexinit(LBASETYPE); - - booltrue = nod(OLITERAL, N, N); - booltrue->val.ctype = CTBOOL; - booltrue->val.vval = 1; - booltrue->type = types[TBOOL]; - - boolfalse = nod(OLITERAL, N, N); - boolfalse->val.ctype = CTBOOL; - boolfalse->val.vval = 0; - booltrue->type = types[TBOOL]; -} - -struct -{ - int lex; - char* name; -} lexn[] = -{ - LANDAND, "ANDAND", - LASOP, "ASOP", - LACONST, "ACONST", - LATYPE, "ATYPE", - LBASETYPE, "BASETYPE", - LBREAK, "BREAK", - LCASE, "CASE", - LCHAN, "CHAN", - LCOLAS, "COLAS", - LCONST, "CONST", - LCONTINUE, "CONTINUE", - LDEC, "DEC", - LELSE, "ELSE", - LEQ, "EQ", - LFUNC, "FUNC", - LGE, "GE", - LGO, "GO", - LGOTO, "GOTO", - LGT, "GT", - LIF, "IF", - LINC, "INC", - LINTERFACE, "INTERFACE", - LLE, "LE", - LLITERAL, "LITERAL", - LLSH, "LSH", - LLT, "LT", - LMAP, "MAP", - LNAME, "NAME", - LNE, "NE", - LOROR, "OROR", - LPACK, "PACK", - LRANGE, "RANGE", - LRETURN, "RETURN", - LRSH, "RSH", - LSTRUCT, "STRUCT", - LSWITCH, "SWITCH", - LTYPE, "TYPE", - LVAR, "VAR", - LFOR, "FOR", - LNEW, "NEW", - LLEN, "LEN", - LFALL, "FALL", - LCONVERT, "CONVERT", - LIOTA, "IOTA", - LPRINT, "PRINT", - LPACKAGE, "PACKAGE", - LIMPORT, "IMPORT", - LEXPORT, "EXPORT", - LPANIC, "PANIC", -}; - -char* -lexname(int lex) -{ - int i; - static char buf[100]; - - for(i=0; i<nelem(lexn); i++) - if(lexn[i].lex == lex) - return lexn[i].name; - snprint(buf, sizeof(buf), "LEX-%d", lex); - return buf; -} - -void -mkpackage(char* pkg) -{ - Sym *s; - long h; - - if(bout != nil) { - yyerror("mkpackage: called again %s %s", pkg, package); - return; - } - - // defefine all names to be this package - package = pkg; - for(h=0; h<NHASH; h++) - for(s = hash[h]; s != S; s = s->link) { - s->package = package; - s->opackage = package; - } - - if(outfile == nil) { - snprint(namebuf, sizeof(namebuf), "%s.go.c", package); - outfile = strdup(namebuf); - } - - bout = Bopen(outfile, OWRITE); - if(bout == nil) - fatal("cant open %s", outfile); -} |