💾 Archived View for uscoffings.net › retro-computing › systems › TI994a › assemblers › tiasm › src ›… captured on 2024-08-18 at 22:08:16.
⬅️ Previous capture (2022-07-16)
-=-=-=-=-=-=-
%{ #include "TIasm.h" #include "y.tab.h" extern int Lincnt; extern int Debug; extern flag Ferror; extern flag Error; extern struct stab *lookup(), *newsym(); extern void aabort(); %} %% \"[^\"\n]* { /* Special operators in string possibly */ if (yytext[yyleng - 1] == '\\') yymore(); else { if ((yytext[yyleng++] = input()) == '\n') unput(yytext[--yyleng]); yytext[yyleng++] = NULL; } DEBUG (11, "Lex finds string \"%s\"\n", yytext); return (STRING); } [\t ]* /* Eat white space. This goes after the string stuff so * we don't eat white space inside the string. */ ; "\n" ++Lincnt; [rR][0-9]+ { DEBUG (11, "lex finds register \"%s\"\n", yytext); switch (atoi(&yytext[1])) { case 0: yylval.val = 0; return (REG); /* NOTREACHED */ break; case 1: yylval.val = 1; return (REG); /* NOTREACHED */ break; case 2: yylval.val = 2; return (REG); /* NOTREACHED */ break; case 3: yylval.val = 3; return (REG); /* NOTREACHED */ break; case 4: yylval.val = 4; return (REG); /* NOTREACHED */ break; case 5: yylval.val = 5; return (REG); /* NOTREACHED */ break; case 6: yylval.val = 6; return (REG); /* NOTREACHED */ break; case 7: yylval.val = 7; return (REG); /* NOTREACHED */ break; case 8: yylval.val = 8; return (REG); /* NOTREACHED */ break; case 9: yylval.val = 9; return (REG); /* NOTREACHED */ break; case 10: yylval.val = 10; return (REG); /* NOTREACHED */ break; case 11: yylval.val = 11; return (REG); /* NOTREACHED */ break; case 12: yylval.val = 12; return (REG); /* NOTREACHED */ break; case 13: yylval.val = 13; return (REG); /* NOTREACHED */ break; case 14: yylval.val = 14; return (REG); /* NOTREACHED */ break; case 15: yylval.val = 15; return (REG); /* NOTREACHED */ break; default: /* It isn't a register. Try something else. */ REJECT; break; } }; [+\-]0[xX][0-9a-fA-F]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: +/- hexnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for +/- hexnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } 0[xX][0-9a-fA-F]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: hexnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for hexnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [+\-]0[oO][0-7]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: +/- octnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for +/- octnum\"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } 0[oO][0-7]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: octnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for octnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [+\-]0[bB][01]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: +/- binnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for +/- binnum\"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } 0[bB][01]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: binnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for binnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [+\-][dD][0-9]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: +/- decnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: err for +/- decnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [dD][0-9]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: decnum = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for decnum \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [0-9]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: undcl num = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for undcl num\"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } [+\-][0-9]+ { yylval.val = getnum(yytext); DEBUG (11, "lex: +/- undcl num = %d\n", yylval.val); if (Error == TRUE) { DEBUG (12, "lex: error for +/- undcl \"%s\"\n", yytext); return (ERROR); /* Will cause syntax error */ } return (NUMBER); } ";" { /* Eat comments */ while (input() != '\n') ; unput ('\n'); }; "'"."'" { yylval.val = (short )yytext[1]; return (NUMBER); }; [+-]"'"."'" { yylval.val = (short )yytext[2]; if (yytext[0] == '-') /* Make negative in that case */ yylval.val *= -1; return (NUMBER); }; "."[_a-zA-Z][\-_a-zA-Z0-9]* { struct stab *Entry; DEBUG (11, "lex: directive ===== \"%s\"\n", yytext); if ((Entry = lookup(yytext)) == NULL) { /* No such directive */ DEBUG (12, "lex: No directive \"%s\"\n", yytext); return (ERROR); } return (Entry->st_opc); } [_a-zA-Z][\-_a-zA-Z0-9]* { extern struct stab *lookup(); if ((yylval.sinfo.pntr = lookup(yytext)) == NULL) { /* Create the symbol table entry for this ident */ yylval.sinfo.pntr = newsym (yytext); yylval.sinfo.pntr->st_type = TYLCLID; yylval.sinfo.enterd = FALSE; DEBUG (11, "lex creates \"%s\"\n", yytext); return (IDENT); } else { if (yylval.sinfo.pntr->st_type & TYRSRVD) { /* This is a reserved word. Return the format */ DEBUG (11, "lex returns RSRVD fmt = %d\n", yylval.sinfo.pntr->st_fmt); return (yylval.sinfo.pntr->st_fmt); } if (yylval.sinfo.pntr->st_type & TYLCLID || yylval.sinfo.pntr->st_type & TYEXTID) { DEBUG (11, "lex returns LCL or EXTNL IDENT\n", NULL); yylval.sinfo.enterd = TRUE; return (IDENT); } DEBUG (11, "ERR: stab, name = \"%s\"\n", yylval.sinfo.pntr->st_symnm); DEBUG (11, "ERR: stab, type = 0o%o\n", yylval.sinfo.pntr->st_type); aabort ("lex: Null stab ent"); } }; \, { return (','); } \: { return (':'); } \( { return ('('); } \) { return (')'); } \[ { return ('['); } \] { return (']'); } \+ { return ('+'); } { return (ERROR); } %%