Sto usando il parser identifier
da FParsec per analizzare i nomi di variabili e funzioni, che normalmente sono una combinazione di caratteri Unicode e ASCII. Ma a volte sono fuggito caratteri Unicode all'inizio (come \u03C0
) o all'interno dell'identificatore (come swipe_board\u003A_b
). Posso ancora renderli analizzabili usando le opzioni isAsciiIdStart
e isAsciiIdContinue
, ma non posso definire la mia funzione personalizzata per la pre-elaborazione prima della normalizzazione. Quale potrebbe essere una soluzione qui?Utilizzo della funzione di pre-elaborazione con il parser dell'identificatore in FParsec?
risposta
Il parser identifier
internamente prima analizza una stringa e quindi la passa a un'istanza IdentifierValidator
per la convalida. Poiché la classe C# IdentifierValidator
è accessibile pubblicamente (anche se non è documentata), è possibile adattare facilmente il parser identifier
alle proprie esigenze (facendo in modo che la fase di analisi della stringa iniziale riconosca anche gli escape).
L'analisi dell'identificatore è un po 'complicata a causa del supporto per le coppie di surrogati UTF-16, la normalizzazione e la categoria di caratteri XID Unicode, che non è supportata nativamente su .NET. Forse è necessario supportare solo identificatori ASCII o UCS-2 specificati in termini di categorie di caratteri supportati da CharUnicodeInfo.GetUnicodeCategory
, nel qual caso è possibile implementare l'analisi e la convalida in un solo passaggio utilizzando many1Satisfy2
o many1Chars2
.