ho qualche grammatica bisonti:In che modo Bison/YACC non riconosce un comando finché non analizza l'intera stringa?
input: /* empty */
| input command
;
command:
builtin
| external
;
builtin:
CD { printf("Changing to home directory...\n"); }
| CD WORD { printf("Changing to directory %s\n", $2); }
;
Mi chiedo come ho Bison di non accettare (YYACCEPT?) Qualcosa come command
fino a quando non legge tutti i ingresso. Quindi posso avere tutte queste regole sotto che usano la ricorsione o qualsiasi altra cosa per costruire le cose, il che risulta in un comando valido o qualcosa che non funzionerà.
Un semplice test che sto facendo con il codice sopra è solo inserendo "cd mydir mydir". Bison analizza CD
e WORD
e fa "hey! Questo è un comando, mettilo in cima!". Quindi il token successivo che trova è solo WORD
, che non ha alcuna regola, quindi segnala un errore.
Desidero leggere l'intera riga e realizzare CD WORD WORD
non è una regola, quindi segnalare un errore. Penso che mi manchi qualcosa di ovvio e apprezzerei molto ogni aiuto - grazie!
Inoltre - Ho provato con input command NEWLINE
o qualcosa di simile, ma spinge ancora CD WORD
verso l'alto come un comando e quindi analizza l'extra WORD
separatamente.
Sembra che il tuo 'incorporato 'debba essere terminato da una nuova riga (non da' input'). Come in 'CD WORD NEWLINE' – leeeroy
Il' builtin' manca un '{', dovrebbe essere '| CD WORD {printf ("Modifica in directroy% s \ n", $ 2); } ' –
Whoops sorry! Non era nel codice che sto usando per testare ... – chucknelson