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

📄 nepc.y

📁 使用yacc和lex编写的cmm语言的词法分析和语法分析程序.
💻 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 + -