989 lines · 13.1 KB · Text
RawDownload
%{	#include	<u.h>	#include	<libc.h>	#include	<bio.h> 	#define	bsp_max	5000 	Biobuf	*in;	Biobuf	bstdin;	Biobuf	bstdout;	char	cary[1000];	char*	cp = { cary };	char	string[1000];	char*	str = { string };	int	crs = 128;	int	rcrs = 128;	/* reset crs */	int	bindx = 0;	int	lev = 0;	int	ln;	char*	ttp;	char*	ss = "";	int	bstack[10] = { 0 };	char*	numb[15] =	{		" 0", " 1", " 2", " 3", " 4", " 5",		" 6", " 7", " 8", " 9", " 10", " 11",		" 12", " 13", " 14"	};	char*	pre;	char*	post; 	long	peekc = -1;	int	sargc;	int	ifile;	char**	sargv; 	char	*funtab[] =	{		"<1>","<2>","<3>","<4>","<5>",		"<6>","<7>","<8>","<9>","<10>",		"<11>","<12>","<13>","<14>","<15>",		"<16>","<17>","<18>","<19>","<20>",		"<21>","<22>","<23>","<24>","<25>",		"<26>"	};	char	*atab[] =	{		"<221>","<222>","<223>","<224>","<225>",		"<226>","<227>","<228>","<229>","<230>",		"<231>","<232>","<233>","<234>","<235>",		"<236>","<237>","<238>","<239>","<240>",		"<241>","<242>","<243>","<244>","<245>",		"<246>"	};	char*	letr[26] =	{		"a","b","c","d","e","f","g","h","i","j",		"k","l","m","n","o","p","q","r","s","t",		"u","v","w","x","y","z"	};	char*	dot = { "." };	char*	bspace[bsp_max];	char**	bsp_nxt = bspace;	int	bdebug = 0;	int	lflag;	int	cflag;	int	sflag; 	char*	bundle(int, ...);	void	conout(char*, char*);	int	cpeek(int, int, int);	int	getch(void);	char*	geta(char*);	char*	getf(char*);	void	getout(void);	void	output(char*);	void	pp(char*);	void	routput(char*);	void	tp(char*);	void	yyerror(char*, ...);	int	yyparse(void); 	typedef	void*	pointer;	#pragma	varargck	type	"lx"	pointer %}%union{	char*	cptr;	int	cc;} %type	<cptr>	pstat stat stat1 def slist dlets e ase nase%type	<cptr>	slist re fprefix cargs eora cons constant lora%type	<cptr>	crs %token	<cptr>	LETTER EQOP _AUTO DOT%token	<cc>	DIGIT SQRT LENGTH _IF FFF EQ%token	<cc>	_PRINT _WHILE _FOR NE LE GE INCR DECR%token	<cc>	_RETURN _BREAK _DEFINE BASE OBASE SCALE%token	<cc>	QSTR ERROR %right	'=' EQOP%left	'+' '-'%left	'*' '/' '%'%right	'^'%left	UMINUS %%start:	start stuff|	stuff stuff:	pstat tail	{		output($1);	}|	def dargs ')' '{' dlist slist '}'	{		ttp = bundle(6, pre, $6, post , "0", numb[lev], "Q");		conout(ttp, (char*)$1);		rcrs = crs;		output("");		lev = bindx = 0;	} dlist:	tail|	dlist _AUTO dlets tail stat:	stat1|	nase	{		if(sflag)			bundle(2, $1, "s.");	} pstat:	stat1	{		if(sflag)			bundle(2, $1, "0");	}|	nase	{		if(!sflag)			bundle(2, $1, "ps.");	} stat1:	{		bundle(1, "");	}|	ase	{		bundle(2, $1, "s.");	}|	SCALE '=' e	{		bundle(2, $3, "k");	}|	SCALE EQOP e	{		bundle(4, "K", $3, $2, "k");	}|	BASE '=' e	{		bundle(2, $3, "i");	}|	BASE EQOP e	{		bundle(4, "I", $3, $2, "i");	}|	OBASE '=' e	{		bundle(2, $3, "o");	}|	OBASE EQOP e	{		bundle(4, "O", $3, $2, "o");	}|	QSTR	{		bundle(3, "[", $1, "]P");	}|	_BREAK	{		bundle(2, numb[lev-bstack[bindx-1]], "Q");	}|	_PRINT e	{		bundle(2, $2, "ps.");	}|	_RETURN e	{		bundle(4, $2, post, numb[lev], "Q");	}|	_RETURN	{		bundle(4, "0", post, numb[lev], "Q");	}|	'{' slist '}'	{		$$ = $2;	}|	FFF	{		bundle(1, "fY");	}|	_IF crs BLEV '(' re ')' stat	{		conout($7, $2);		bundle(3, $5, $2, " ");	}|	_WHILE crs '(' re ')' stat BLEV	{		bundle(3, $6, $4, $2);		conout($$, $2);		bundle(3, $4, $2, " ");	}|	fprefix crs re ';' e ')' stat BLEV	{		bundle(5, $7, $5, "s.", $3, $2);		conout($$, $2);		bundle(5, $1, "s.", $3, $2, " ");	}|	'~' LETTER '=' e	{		bundle(3, $4, "S", $2);	} fprefix:	_FOR '(' e ';'	{		$$ = $3;	} BLEV:	=	{		--bindx;	} slist:	stat|	slist tail stat	{		bundle(2, $1, $3);	} tail:	'\n'	{		ln++;	}|	';' re:	e EQ e	{		$$ = bundle(3, $1, $3, "=");	}|	e '<' e	{		bundle(3, $1, $3, ">");	}|	e '>' e	{		bundle(3, $1, $3, "<");	}|	e NE e	{		bundle(3, $1, $3, "!=");	}|	e GE e	{		bundle(3, $1, $3, "!>");	}|	e LE e	{		bundle(3, $1, $3, "!<");	}|	e	{		bundle(2, $1, " 0!=");	} nase:	'(' e ')'	{		$$ = $2;	}|	cons	{		bundle(3, " ", $1, " ");	}|	DOT cons	{		bundle(3, " .", $2, " ");	}|	cons DOT cons	{		bundle(5, " ", $1, ".", $3, " ");	}|	cons DOT	{		bundle(4, " ", $1, ".", " ");	}|	DOT	{		$<cptr>$ = "l.";	}|	LETTER '[' e ']'	{		bundle(3, $3, ";", geta($1));	}|	LETTER INCR	{		bundle(4, "l", $1, "d1+s", $1);	}|	INCR LETTER	{		bundle(4, "l", $2, "1+ds", $2);	}|	DECR LETTER	{		bundle(4, "l", $2, "1-ds", $2);	}|	LETTER DECR	{		bundle(4, "l", $1, "d1-s", $1);	}|	LETTER '[' e ']' INCR	{		bundle(7, $3, ";", geta($1), "d1+" ,$3, ":" ,geta($1));	}|	INCR LETTER '[' e ']'	{		bundle(7, $4, ";", geta($2), "1+d", $4, ":", geta($2));	}|	LETTER '[' e ']' DECR	{		bundle(7, $3, ";", geta($1), "d1-", $3, ":", geta($1));	}|	DECR LETTER '[' e ']'	{		bundle(7, $4, ";", geta($2), "1-d", $4, ":" ,geta($2));	}|	SCALE INCR	{		bundle(1, "Kd1+k");	}|	INCR SCALE	{		bundle(1, "K1+dk");	}|	SCALE DECR	{		bundle(1, "Kd1-k");	}|	DECR SCALE	{		bundle(1, "K1-dk");	}|	BASE INCR	{		bundle(1, "Id1+i");	}|	INCR BASE	{		bundle(1, "I1+di");	}|	BASE DECR	{		bundle(1, "Id1-i");	}|	DECR BASE	{		bundle(1, "I1-di");	}|	OBASE INCR	{		bundle(1, "Od1+o");	}|	INCR OBASE	{		bundle(1, "O1+do");	}|	OBASE DECR	{		bundle(1, "Od1-o");	}|	DECR OBASE	{		bundle(1, "O1-do");	}|	LETTER '(' cargs ')'	{		bundle(4, $3, "l", getf($1), "x");	}|	LETTER '(' ')'	{		bundle(3, "l", getf($1), "x");	}|	LETTER = {		bundle(2, "l", $1);	}|	LENGTH '(' e ')'	{		bundle(2, $3, "Z");	}|	SCALE '(' e ')'	{		bundle(2, $3, "X");	}|	'?'	{		bundle(1, "?");	}|	SQRT '(' e ')'	{		bundle(2, $3, "v");	}|	'~' LETTER	{		bundle(2, "L", $2);	}|	SCALE	{		bundle(1, "K");	}|	BASE	{		bundle(1, "I");	}|	OBASE	{		bundle(1, "O");	}|	'-' e	{		bundle(3, " 0", $2, "-");	}|	e '+' e	{		bundle(3, $1, $3, "+");	}|	e '-' e	{		bundle(3, $1, $3, "-");	}|	e '*' e	{		bundle(3, $1, $3, "*");	}|	e '/' e	{		bundle(3, $1, $3, "/");	}|	e '%' e	{		bundle(3, $1, $3, "%%");	}|	e '^' e	{		bundle(3, $1, $3, "^");	} ase:	LETTER '=' e	{		bundle(3, $3, "ds", $1);	}|	LETTER '[' e ']' '=' e	{		bundle(5, $6, "d", $3, ":", geta($1));	}|	LETTER EQOP e	{		bundle(6, "l", $1, $3, $2, "ds", $1);	}|	LETTER '[' e ']' EQOP e	{		bundle(9, $3, ";", geta($1), $6, $5, "d", $3, ":", geta($1));	} e:	ase|	nase cargs:	eora|	cargs ',' eora	{		bundle(2, $1, $3);	} eora:

Lines 1–500 of 989.