⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grapl.lx

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 LX
字号:
%Start A str def thru sh%{#undef	input#undef	unput#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include "grap.h"#include "y.tab.h"extern	struct	symtab	symtab[];int	yyback(int *, int);int	yylook(void);int	yywrap(void);void	shell_init(void), shell_exec(void), shell_text(char *);#define	CADD	cbuf[clen++] = yytext[0]; \		if (clen >= CBUFLEN-1) { \			ERROR "string too long", cbuf WARNING; BEGIN A; }#define	CBUFLEN	1500char	cbuf[CBUFLEN];int	clen, cflag;int	c, delim, shcnt;%}A	[a-zA-Z_]B	[a-zA-Z0-9_]D	[0-9]WS	[ \t]%%	if (yybgin-yysvec-1 == 0) {	/* witchcraft */		BEGIN A;	}<A>{WS}		;<A>"\\"\n	;<A>\n		return(ST);<A>";"		return(ST);<A>line		return(yylval.i = LINE);<A>arrow	{ yylval.i = ARROW; return(LINE); }<A>circle	return(yylval.i = CIRCLE);<A>frame	return(FRAME);<A>tick(s)?	return(TICKS);<A>grid(line)?(s)?	return(GRID);<A>coord(s)?	return(COORD);<A>log		return(LOG);<A>exp		return(EXP);<A>sin		return(SIN);<A>cos		return(COS);<A>atan2	return(ATAN2);<A>sqrt		return(SQRT);<A>rand		return(RAND);<A>max		return(MAX);<A>min		return(MIN);<A>int		return(INT);<A>print	return(PRINT);<A>sprintf	return(SPRINTF);<A>pic{WS}.*	{ yylval.p = tostring(yytext+3); return(PIC); }<A>graph{WS}.*	{ yylval.p = tostring(yytext+5); return(GRAPH); }<A>for		return(FOR);<A>^Endfor\n	{ endfor(); }<A>do		{ yylval.p = delimstr("loop body"); BEGIN A; return(DOSTR); }<A>copy|include	{ return(COPY); }<A>thru|through	{ BEGIN thru; return(THRU); }<thru>{WS}+	;<thru>{A}{B}*|.	{ yylval.op = copythru(yytext); BEGIN A; return(DEFNAME); }<A>until	return(UNTIL);<A>if		return(IF);<A>then		{ yylval.p = delimstr("then part"); BEGIN A; return(THEN); }<A>else		{ yylval.p = delimstr("else part"); BEGIN A; return(ELSE); }<A>next		return(NEXT);<A>draw		return(yylval.i = DRAW);<A>new		return(yylval.i = NEW);<A>plot		return(yylval.i = PLOT);<A>label(s)?	return(LABEL);<A>x		return(X);<A>y		return(Y);<A>top		{ yylval.i = TOP; return SIDE; }<A>bot(tom)?	{ yylval.i = BOT; return SIDE; }<A>left		{ yylval.i = LEFT; return SIDE; }<A>right	{ yylval.i = RIGHT; return SIDE; }<A>up		return(yylval.i = UP);<A>down		return(yylval.i = DOWN);<A>across	return(yylval.i = ACROSS);<A>height|ht	return(yylval.i = HEIGHT);<A>wid(th)?	return(yylval.i = WIDTH);<A>rad(ius)?	return(yylval.i = RADIUS);<A>invis	return(yylval.i = INVIS);<A>dot(ted)	return(yylval.i = DOT);<A>dash(ed)	return(yylval.i = DASH);<A>solid	return(yylval.i = SOLID);<A>ljust	{ yylval.i = LJUST; return JUST; }<A>rjust	{ yylval.i = RJUST; return JUST; }<A>above	{ yylval.i = ABOVE; return JUST; }<A>below	{ yylval.i = BELOW; return JUST; }<A>size		return(yylval.i = SIZE);<A>from		return(yylval.i = FROM);<A>to		return(yylval.i = TO);<A>by|step	return(yylval.i = BY);<A>at		return(yylval.i = AT);<A>with		return(yylval.i = WITH);<A>in		return(yylval.i = IN);<A>out		return(yylval.i = OUT);<A>off		return(yylval.i = OFF);<A>sh{WS}+ {	BEGIN sh;		if ((delim = input()) == '{') {			shcnt = 1;			delim = '}';		}		shell_init();	}<sh>{A}{B}* {		int c;		Obj *p;		if (yytext[0] == delim) {			shell_exec();			BEGIN A;		} else {			p = lookup(yytext, 0);			if (p != NULL && p->type == DEFNAME) {				c = input();				unput(c);				if (c == '(')					dodef(p);				else					pbstr(p->val);			} else				shell_text(yytext);		}	}<sh>"{"		{ shcnt++; shell_text(yytext); }<sh>"}"		{ if (delim != '}' || --shcnt > 0)			shell_text(yytext);		  else {			shell_exec();			BEGIN A;		  }		}<sh>.|\n	{ if (yytext[0] == delim) {			shell_exec();			BEGIN A;		  } else			shell_text(yytext);		}<A>define{WS}+	{ BEGIN def; }<def>{A}{B}*	{ definition(yytext); BEGIN A; }<A>({D}+("."?){D}*|"."{D}+)((e|E)("+"|-)?{D}+)?i? {		  yylval.f = atof(yytext); return(NUMBER); }<A>^"."[^0-9].*	{ if (yytext[1] == 'G' && yytext[2] == '2') {			yylval.i = yytext[2];			return(EOF);		  } else {			yylval.p = tostring(yytext);			return(PIC);		  }		}<A>{A}{B}* {		int c;		Obj *p;		p = lookup(yytext, 1);		if (p->type == DEFNAME) {			c = input();			unput(c);			if (c == '(')	/* it's name(...) */				dodef(p);			else	/* no argument list */				pbstr(p->val);		} else {			yylval.op = p;			return p->type;	/* NAME or VARNAME */		}	}<A>"=="		return(EQ);<A>">="		return(GE);<A>"<="		return(LE);<A>"!="		return(NE);<A>">"		return(GT);<A>"<"		return(LT);<A>"&&"		return(AND);<A>"||"		return(OR);<A>"!"		return(NOT);	<A>\"		{ BEGIN str; clen = 0; }<A>#.*		;<A>.		{ yylval.i = yytext[0]; return(yytext[0]); }<str>\"		{ BEGIN A; cbuf[clen] = 0;		  yylval.p = tostring(cbuf); return(STRING); }<str>\n		{ ERROR "newline in string" WARNING; BEGIN A; return(ST); }<str>"\\\""	{ cbuf[clen++] = '\\'; cbuf[clen++] = '"'; }<str>"\\\\"	{ cbuf[clen++] = '\\'; cbuf[clen++] = '\\'; }<str>.		{ CADD; }%%

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -