Omitir navegación.
Inicio

Construyendo un shell con Flex y Bison

Imagen de SebaMinguez

Empezamos con el shell (clase del 9 de junio de 2009)

La especificación del scanner debe detectar las palaras clave (van ser los tokens de la GLC)

El scan.lex

%{
#include "clases.hc"
#include "gran.tab.hc"
%}
 
%%
<<EOF>> return EoF;
[ \t]+  ;
logout  return LOGOUT
pwd     return PWD
cd      return CD;
"\n"    return '\n'
"\\\n"  ;
";"     return ';'
"("     return '('
")"     return ')'
"||"    return BARBAR
"&&"    return AMPAMP
"|"     return '|'
">"     return '>'
">>"    return '>>'
"<"     return '<<'
[-0-9a-zA-Z_:\./\*~\[\]\{\}]+   return ID;
\"[^\n\"]*|(\\\")*\"    return CUOT;
\'[^\n\']*|(\\\')*\'    return CUOT;
.       {cerr << '[' << yytext << "] erroneo \n";}
 
%%
int yymap ()
{
        return 1;
}

Y luego la gramatica libre de contexto:

%token EoF ID CUOT
%token LOGOUT PWD CD
%token MAYMAY AMPAMP BARBAR
 
%%
orden: sec '\n'
     | EoF
     | '\n'
     ;
 
sec: cond ';' sec
   | cond
   ;
 
cond: redir AMPAMP cond
    | redir BARBAR cond
    | redir
    ;
 
redir: pipe '>' id
     | pipe MAYMAY id
     | pipe
     ;
 
pipe: cmdin '|' pipe
    | cmdin
    ;
 
cmdin: cmd '<' id
     | cmd
     ;
cmd: id args
   | CD id
   | LOGOUT
   | '(' sec ')'
   ;
 
args: args id
    |
    ;
 
id: ID
  | CUOT
  ;
 
%%

Trackback URL for "Construyendo un shell con Flex y Bison"

http://www.odiolasllaves.com.ar/trackback/103