Pergunta

Eu estou tentando escrever um shell usando yacc e lex e eu estou correndo em alguns problemas com meus redirecionadores I / O. Atualmente, eu posso usar o operadores multa e em qualquer ordem, mas o meu problema é que eu posso redirecionar duas vezes com nenhum erro, como "ls> log> log2"

Meu código regra é abaixo, alguém pode me dar algumas dicas sobre como consertar isso? Obrigado!

 io_mod:
    iomodifier_opt io_mod
    |
    ;

 iomodifier_opt:
    GREAT WORD {
        printf("   Yacc: insert output \"%s\"\n", $2);
        Command::_currentCommand._outFile = $2;
    }
    |
    LESS WORD {
       printf("   Yacc: insert input \"%s\"\n", $2);
       Command::_currentCommand._inputFile = $2;
    }
    | /* can be empty */
    ;

EDIT:. Depois de falar com o meu TA, eu aprendi que eu realmente não precisa ter apenas 1 modificador para o meu comando e que eu realmente pode ter várias cópias da mesma I / O redirecionamento

Foi útil?

Solução

Existem duas abordagens:

(1) Modificar a gramática de modo que você pode ter apenas um de cada tipo de modificador:

io_mod_opt: out_mod in_mod | in_mod out_mod | in_mod | out_mod | ;

(2) Modificar o manipulador cláusula para contar os modificadores e relatar um erro se houver mais de um:

GREAT_WORD {
    if (already_have_output_file()) {
        error("too many output files: \"%s\"\n", $2)
    } else {
        /* record output file */
    }
}

Opção (2) parece susceptível de conduzir a melhores mensagens de erro e uma gramática mais simples.

Outras dicas

Há também uma terceira abordagem - não se preocupe. O Bash (sob Cygwin) não gerar um erro para:

ls > x > y

Ele cria x e y e acaba escrevendo para y.

Eu percebo isso pode ser apenas um exercício para aprender lexx e yacc, mas caso contrário, a primeira questão é perguntar por que deseja usar lexx e yacc? Qualquer linguagem de comandos shell de costume tem um simples gramática bonita; o que você está ganhando de usar um gerador LALR?

Bem, diferente de complexidade, mensagens de erro Dificuldade para gerar bons, e volume código, quero dizer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top