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

📄 bison.y

📁 linux下的简单的shell解释器
💻 Y
字号:
%{    #include "global.h"    int yylex ();    void yyerror ();          int offset, len, commandDone;%}%token STRING%%line            :   /* empty */                    |command                        {   execute();  commandDone = 1;   };command         :   fgCommand                    |fgCommand '&';fgCommand       :   simpleCmd;simpleCmd       :   progInvocation inputRedirect outputRedirect;progInvocation  :   STRING args;inputRedirect   :   /* empty */                    |'<' STRING;outputRedirect  :   /* empty */                    |'>' STRING;args            :   /* empty */                    |args STRING;%%
/****************************************************************
                  词法分析函数
****************************************************************/int yylex(){    int flag;    char c;    
	//跳过空格等无用信息    while(offset < len && (inputBuff[offset] == ' ' || inputBuff[offset] == '\t')){         offset++;    }        flag = 0;    while(offset < len){ //循环进行词法分析,返回终结符        c = inputBuff[offset];                if(c == ' ' || c == '\t'){            offset++;            return STRING;        }                if(c == '<' || c == '>' || c == '&'){
            if(flag == 1){
                flag = 0;
                return STRING;
            }
            offset++;
            return c;
        }                flag = 1;        offset++;    }        if(flag == 1){        return STRING;    }else{        return 0;    }}
/****************************************************************
                  错误信息执行函数
****************************************************************/void yyerror(){    printf("你输入的命令不正确,请重新输入!\n");}/****************************************************************                  main主函数****************************************************************/int main(int argc, char** argv) {    int i;    char c;    init(); //初始化环境    commandDone = 0;        printf("ysh@%s>", get_current_dir_name()); //打印提示符信息
    while(1){        i = 0;        while((c = getchar()) != '\n'){ //读入一行命令            inputBuff[i++] = c;        }        inputBuff[i] = '\0';        len = i;        offset = 0;                yyparse(); //调用语法分析函数,该函数由yylex()提供当前输入的单词符号        if(commandDone == 1){ //命令已经执行完成后,添加历史记录信息            commandDone = 0;            addHistory(inputBuff);        }                printf("ysh@%s>", get_current_dir_name()); //打印提示符信息     }    return (EXIT_SUCCESS);}

⌨️ 快捷键说明

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