Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Normalizzazione EOL: Sia "\r" che "\n" dovrebbero produrre EOL nativo #18

Open
tajmone opened this issue Feb 21, 2018 · 3 comments
Open

Comments

@tajmone
Copy link
Collaborator

tajmone commented Feb 21, 2018

Secondo me Polygen dovrebbe gestire in maniera diversa le sequenze di fine riga (EOL). Allo stato attuale, sta all'utente specificare se usare LF o CRLF tramite le sequenze escape \n e \r.

Oggigiorno, il modo in cui vengono usate le EOL è cambiato dall'epoca in cui Polygen fu creato. Oggi l'aspettativa è che \n produca la sequenza EOL nativa del sistema operativo (CRLF su Windows, LF negli altri OS).

Allo stato attuale, le EOL creano problemi quando si reindirizza l'output di Polygen ad altre applicazioni. Per esempio, pandoc si aspetta un EOL nativo, e in Windows ignorerà le sequenze LF o CR; lo stesso vale per la maggior parte delle applicazioni moderne.

Il problema è che, attualmente, chi scrive grammatiche per Linux o Mac tende a usare \n per le nuove righe, mentre chi le scrive per Windows tende a usare \r\n — in realtà, nella maggior parte dei casi viene usato solo \n, ma in alcuni contesti di Windows è necessario usare \r\n per preservare la nuova riga (p.es: markdown e altri formati di testo).

La soluzione ideale, a mio avviso sarebbe questa:

  • \n dovrebbe essere interpretata da Polygen come EOL nativa.
  • \r dovrebbe essere deprecata, ma preservata per ragioni di retrocompatibilità, e trattata come se fosse \n.
  • Occorrenze di \r\n dovrebbero essere trattate come un singolo \n (per evitare che una interruzione di riga venga interpretata come doppia)
  • Una nuova opzione da riga di comando dovrebbe consentire l'override della EOL nativa: -eol lf per imporre \n = LF (possibili valori per -eol: lf|crlf|cr).

Quest'ultima opzione si rivelerebbe fondamentale nella creazione di script Shell o Batch, dove è necessario usare \n e \r\n rispettivamente, a prescindere dall'OS su cui si sta lavorando.

In teoria, oggi CR non viene più usato come carattere EOL, veniva usato solo dai primi OS del Machintosh, ma vale comunque la pena di offrire la possibilità di utilizzarlo tramite opzioni riga di comando.

Praticamente, Polygen dovrebbe normalizzare i caratteri EOL nel suo output — convertendo tutte le occorrenze di \n e \r nel carattere EOL nativo, o in quello specificato tramite opzioni, e normalizzare anche eventuali caratteri EOL introdotti tramite Ascii escapes (\010 e \013).

Ho altresì notato che il comportamento di Polygen riguardo alle EOL è diverso quando si usa l'opzione -o DEST: in questo caso il carattere EOL è quello nativo dell'OS.

Che ne pensi?

@alvisespano
Copy link
Owner

alvisespano commented Feb 28, 2018 via email

@tajmone
Copy link
Collaborator Author

tajmone commented Feb 28, 2018

L'idea mi piace, ed ha senso.

Quindi attualmente il post-processore è in grado di intercettare le attuali sequenze di escape? se una grammatica usa \n in una stringa, il post-proc. vede un token di escape all'interno di un terminale stringa, o lo vede semplicemente come il byte corrispondente?

Provo a riformulare, dato che non mi è del tutto chiaro il contesto attuale:

Le stringhe di una grammatica sono sempre terminali, giusto? Allo stato attuale come vengono gestite le escapes, arrivano al post-processore già espanse in bytes o come token? oppure all'interno dell'AST una stringa come "aaa \n bbb" viene vista come:

  • un nodo stringa: "aaa"
  • un nodo Escape token: \n
  • un nodo stringa: "bbb"

Perché, mi pare di capire, se questo non è ciò che in qualche maniera già avviene, sarebbe comunque il modo in cui la tua proposta verrà implementata — attualmente \n e \r sono semplici sequenze escape, che vengono tradotte nel byte corrispondente, mentre le modifiche che proponi li renderebbe entrambi alias di un token speciale, per l'appunto EOL, il cui esito dipenderà dal post-processore in base a valutazioni del sistema operativo nativo.

@alvisespano
Copy link
Owner

alvisespano commented Feb 28, 2018 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants