Hero467
Utente Attivo
- Messaggi
- 695
- Reazioni
- 405
- Punteggio
- 75
Allora, io per divertimento e per imparare bene a programmare in C ho deciso di creare un compilatore da un linguaggio (molto basico) progettato da me a bytecode, sempre progettato da me.
In questo momento, visto che ho appena cominciato, mi trovo alla fase del lexer/tokenizer, e sono riuscito a fare un prototipo funzionante che traduce da input testuale a tokens. Giunto però al momento di stampare i tokens a schermo per verificare l'efficacia di quello che ho fatto, ricevo un seg-fault che sembra provenire da un
Allego codice:
La funzione tokenize() prende in input il contenuto di un file con delle istruzioni di prova per vedere se funziona tutto e ritorna un Token* con dentro tutti i tokens convertiti dalle istruzioni, più un TOKEN_EOF alla fine.
Con il while itero attraverso l'array e converto da Token (che è un enum) a stringa che posso stampare a schermo tramite token_lookup(). In teoria, quando il loop arriva a TOKEN_EOF (che ripeto, c'è sempre) si interrompe e stampa un newline per andare a capo. Quello che succede invece (almeno per il debugger) è che il loop si interrompe correttamente a TOKEN_EOF e fa un seg-fault al putchar/printf/quello che è. Ho anche provato a rimuovere completamente qualsiasi output perché magari c'era qualcosa di oscuro con stdout che non capivo e mi causava il segfault, ma niente. Quindi è evidente che il problema sia nel loop anche se non capisco dove.
Non credo serva, ma nel dubbio metto la repo di tutto il progetto perché magari il problema risiede da un'altra parte. REPO.
Vi prego di non soffermarvi troppo sulla qualità del codice, la cui sono consapevole essere molto molto bassa.
In questo momento, visto che ho appena cominciato, mi trovo alla fase del lexer/tokenizer, e sono riuscito a fare un prototipo funzionante che traduce da input testuale a tokens. Giunto però al momento di stampare i tokens a schermo per verificare l'efficacia di quello che ho fatto, ricevo un seg-fault che sembra provenire da un
printf("\n"); che, però, a logica non può essere. E infatti anche se sostituisco il printf con un putchar ottengo lo stesso il seg-fault.Allego codice:
C:
int main(int argc, char *argv[]) {
char *file = "/home/ricky/coding/c/language/compiler/prova.txt";
char *file_content = read_file(file);
Token *tokens = tokenize(file_content);
int i = 0;
Token token;
while ((token = tokens[i]).type != TOKEN_EOF) {
printf("%s ", token_lookup(token));
i++;
}
putchar('\n');
return 0;
}
Con il while itero attraverso l'array e converto da Token (che è un enum) a stringa che posso stampare a schermo tramite token_lookup(). In teoria, quando il loop arriva a TOKEN_EOF (che ripeto, c'è sempre) si interrompe e stampa un newline per andare a capo. Quello che succede invece (almeno per il debugger) è che il loop si interrompe correttamente a TOKEN_EOF e fa un seg-fault al putchar/printf/quello che è. Ho anche provato a rimuovere completamente qualsiasi output perché magari c'era qualcosa di oscuro con stdout che non capivo e mi causava il segfault, ma niente. Quindi è evidente che il problema sia nel loop anche se non capisco dove.
Non credo serva, ma nel dubbio metto la repo di tutto il progetto perché magari il problema risiede da un'altra parte. REPO.
Vi prego di non soffermarvi troppo sulla qualità del codice, la cui sono consapevole essere molto molto bassa.
Ultima modifica: