yacc apenas aplicando a regra uma vez
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
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
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.