80 lines
1.8 KiB
Text
80 lines
1.8 KiB
Text
|
%{
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "parser.h"
|
||
|
|
||
|
#ifdef DOESNT_HAVE_STRDUP
|
||
|
#warning DOESNT_HAVE_STRDUP
|
||
|
char *strdup(const char *s);
|
||
|
#endif
|
||
|
|
||
|
%}
|
||
|
|
||
|
%option warn nodefault
|
||
|
|
||
|
/* makes the scanner terminate after reaching <<EOF>> instead of assuming a new input was provided */
|
||
|
%option noyywrap
|
||
|
/* disable some unused functionality, add scanner tracking */
|
||
|
%option nounput noinput batch debug
|
||
|
|
||
|
/* gimme a reentrant parser (overkill but more pure) */
|
||
|
%option reentrant
|
||
|
|
||
|
%option bison-bridge
|
||
|
|
||
|
|
||
|
NL [\n]
|
||
|
SPACE [ ]
|
||
|
|
||
|
/*general definitions*/
|
||
|
CHAR [a-zA-Z]
|
||
|
NUM [0-9]
|
||
|
|
||
|
/*operands*/
|
||
|
SHELL [$]
|
||
|
ROOT [/]
|
||
|
PARENT ".."
|
||
|
CHDIR "cd"
|
||
|
LIST "ls"
|
||
|
DIR "dir"
|
||
|
|
||
|
|
||
|
%%
|
||
|
|
||
|
{NL} { return NEWLINE; }
|
||
|
{SPACE} { return SPACE; }
|
||
|
|
||
|
|
||
|
{SHELL}{SPACE} { return PROMPT; }
|
||
|
{CHDIR} { return CHDIR; }
|
||
|
{LIST} { return LIST; }
|
||
|
{ROOT} { return ROOT; }
|
||
|
{PARENT} { return PARENT; }
|
||
|
{DIR} { return DIRECTORY; }
|
||
|
|
||
|
|
||
|
|
||
|
{NUM}+ {
|
||
|
unsigned long num = strtoul(yytext, NULL, 10);
|
||
|
yylval->num = num;
|
||
|
return SIZE;
|
||
|
}
|
||
|
{CHAR}+ |
|
||
|
{CHAR}+"."{CHAR}+ {
|
||
|
yylval->path = strdup(yytext);
|
||
|
// yylval->path = calloc(strlen(yytext) + 1, sizeof(char));
|
||
|
// strcpy(yylval->path, yytext);
|
||
|
return PATHSPEC;
|
||
|
}
|
||
|
|
||
|
<<EOF>> {
|
||
|
return END_OF_FILE;
|
||
|
}
|
||
|
. {
|
||
|
printf("[error] Encountered unexpected token %s\n", yytext);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
%%
|