📄 nepc.y
字号:
%{#include "nepc.h"#include "nepc.c" /* routines for parse */#include "lex.yy.c"%}%union{ INT iValue; FLT fValue; char * pStr; nodeType *nPtr;};%token <iValue> INTEGER%token <fValue> FLOAT%token <pStr> VARIABLE%token <pStr> STRING%token <iValue> ACOS ASIN ATAN CEIL COS COSH EXP FABS FLOOR %token <iValue> LOG LOG10 POW10 SIN SINH SQRT TAN TANH%type <nPtr> stmt expr stmt_list function%token EXIT ERASE CLEAR LIST HELP DEC HEX OCT%token WHILE IF PRINT%nonassoc IFX%nonassoc ELSE%left OR%left AND%left GE LE EQ NE '>' '<'%left '+' '-'%left '*' '/' '%'%left PP SS%nonassoc UMINUS%%program: init parsed EXIT { freeSymTable(); exit(0); } ;init: /* NULL*/ { initSymTable(); WAITINPUT;} ;parsed: parsed stmt { free(interpret($2)); freeNode($2); WAITINPUT; } | parsed error separator { yyerrok; WAITINPUT;} | /* NULL */ ;stmt: separator { $$ = opr(';', 2, NULL, NULL); } | expr separator { $$ = opr(PRINT, 1, $1); } | PRINT expr separator { $$ = opr(PRINT, 1, $2); } | VARIABLE '=' expr separator { $$ = (($3 == NULL)?NULL:(symname_install($1),opr('=', 2, var($1), $3)));} | WHILE '(' expr ')' stmt { $$ = opr(WHILE, 2, $3, $5); } | IF '(' expr ')' stmt %prec IFX { $$ = opr(IF, 2, $3, $5); } | IF '(' expr ')' stmt ELSE stmt { $$ = opr(IF, 3, $3, $5, $7); } | '{' stmt_list '}' { $$ = $2; } | CMD { $$ = NULL; } ;CMD: ERASE { freeSymTable(); printf(">> All variables erased!\n"); } | HELP { printf(">> COMMANDS:\n"); printf("> help: Display this help section.\n"); printf("> clear/cls: Clear the screen.\n"); printf("> dec: Decimal mode to display numbers or variables.\n"); printf("> hex: Hexadecimal mode to display numbers or variables.\n"); printf("> oct: Octal mode to display numbers or variables.\n"); printf("> list/ls: List the values of variables.\n"); printf("> erase: Reset all variables to 0.\n"); printf("> exit/quit: Quit this program.\n"); printf("> functions supported: acos,asin,atan,ceil,cos,cosh,exp,\n"); printf("> fabs,floor,log,log10,sin,sinh,sqrt,tan,tanh.\n"); } | LIST { int i; symType * p; for(i=0;i<symtop;i++) { p=&symtab[i]; if(symtab[i].type==typeInt) { printf("\tINT %s = ", p->name); PRINTINT(p); } else if(symtab[i].type==typeFlt) { printf("\tFLT %s = ", p->name); PRINTFLT(p); } else if(symtab[i].type==typeStr) { printf("\tSTR %s = ", p->name); PRINTSTR(p); } printf("\n"); } } | CLEAR { printf("\033[2J\033[1;1H\n"); } | HEX { dflag=HEX_ON; printf(">> HEX display mode on!\n"); } | DEC { dflag=DEC_ON; printf(">> DEC display mode on!\n"); } | OCT { dflag=OCT_ON; printf(">> OCT display mode on!\n"); } ;stmt_list: stmt { $$ = $1; } | stmt_list stmt { $$ = opr(';', 2, $1, $2); } ;separator: ';' ;expr: INTEGER { $$ = con_int($1); } | FLOAT { $$ = con_flt($1); } | STRING { $$ = con_str($1); } | VARIABLE { $$ = var($1); } | '-' expr %prec UMINUS { $$ = opr(UMINUS, 1, $2); } | VARIABLE PP { $$ = ((var($1)==NULL) ? NULL: opr(PP, 1, var($1))); } | VARIABLE SS { $$ = ((var($1)==NULL) ? NULL: opr(SS, 1, var($1))); } | expr '+' expr { $$ = opr('+', 2, $1, $3); } | expr '-' expr { $$ = opr('-', 2, $1, $3); } | expr '*' expr { $$ = opr('*', 2, $1, $3); } | expr '/' expr { $$ = opr('/', 2, $1, $3); } | expr '<' expr { $$ = opr('<', 2, $1, $3); } | expr '>' expr { $$ = opr('>', 2, $1, $3); } | expr '%' expr { $$ = opr('%', 2, $1, $3); } | expr AND expr { $$ = opr(AND, 2, $1, $3); } | expr OR expr { $$ = opr(OR, 2, $1, $3); } | expr GE expr { $$ = opr(GE, 2, $1, $3); } | expr LE expr { $$ = opr(LE, 2, $1, $3); } | expr NE expr { $$ = opr(NE, 2, $1, $3); } | expr EQ expr { $$ = opr(EQ, 2, $1, $3); } | '(' expr ')' { $$ = $2; } | function { $$ = $1; } ;function: ACOS '(' expr ')' { $$ = opr(ACOS,1,$3); } | ASIN '(' expr ')' { $$ = opr(ASIN,1,$3); } | ATAN '(' expr ')' { $$ = opr(ATAN,1,$3);; } | CEIL '(' expr ')' { $$ = opr(CEIL,1,$3); } | COS '(' expr ')' { $$ = opr(COS,1,$3); } | COSH '(' expr ')' { $$ = opr(COSH,1,$3); } | EXP '(' expr ')' { $$ = opr(EXP,1,$3); } | FABS '(' expr ')' { $$ = opr(FABS,1,$3); } | FLOOR '(' expr ')' { $$ = opr(FLOOR,1,$3); } | LOG '(' expr ')' { $$ = opr(LOG,1,$3); } | LOG10 '(' expr ')' { $$ = opr(LOG10,1,$3); } | SIN '(' expr ')' { $$ = opr(SIN,1,$3); } | SINH '(' expr ')' { $$ = opr(SINH,1,$3); } | SQRT '(' expr ')' { $$ = opr(SQRT,1,$3); } | TAN '(' expr ')' { $$ = opr(TAN,1,$3); } | TANH '(' expr ')' { $$ = opr(TANH,1,$3); } ;%%void yyerror(char *s) { fprintf(stdout, "%s\n", s);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -