2012-02-10 4 views
5

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

4

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.