💾 Archived View for uscoffings.net › retro-computing › systems › TI994a › assemblers › tiasm › src ›… captured on 2024-08-18 at 22:08:16.

View Raw

More Information

⬅️ Previous capture (2022-07-16)

🚧 View Differences

-=-=-=-=-=-=-

%{
#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); }

%%