Sto scrivendo un semplice tokenizer javascript che rileva i tipi di base: Word, Number, String, RegExp, Operator, Comment e Newline. Tutto sta andando bene, ma non riesco a capire come rilevare se il carattere corrente è delimitatore RegExp o operatore di divisione. Non sto usando le espressioni regolari perché sono troppo lente. Qualcuno conosce il meccanismo per rilevarlo? Grazie.Conflitto di divisione/RegExp durante la tokenizzazione Javascript
risposta
È possibile sapere quale è il token precedente nello stream. Passa attraverso ogni token che il tuo lexer emette e chiedi se può essere ragionevolmente seguito da un segno di divisione o da un'espressione regolare; scoprirai che i due set di token risultanti sono disgiunti. Ad esempio, (
, [
, {
, ;
e tutti gli operatori binari possono essere seguiti solo da un'espressione regolare. Allo stesso modo, )
, ]
, }
, identificatori e stringhe/numeri letterali possono essere seguiti solo da un segno di divisione.
Vedere la sezione 7 del ECMAScript spec per ulteriori dettagli.
è necessario controllare il contesto quando si incontra la barra. se la barra è dopo un'espressione, allora deve essere divisione, o è un inizio regexp.
per riconoscere il contesto, forse è necessario creare un parser di sintassi.
ad esempio
function f() {}
/1/g
//this case ,the slash is after a function definition, so it's a refexp start
var a = {}
/1/g;
//this case, the slash is after an object expression,so it's a division
- 1. mscorlib conflitto durante la generazione
- 2. svn merge conflitto durante commettere
- 3. Prevenire la suddivisione in apostrofie durante la tokenizzazione delle parole utilizzando nltk
- 4. Errore durante la tokenizzazione dei dati. Errore C: EOF dopo il carattere di escape
- 5. Tokenizzazione errata con Marpa
- 6. Mostra la parte di conflitto di un'unione
- 7. Tokenizzazione di parole arabe utilizzando NLTK
- 8. analisi/scansione/tokenizzazione "XML raw"
- 9. Tokenizzazione di dati binari in java
- 10. conflitto Nome funzione e nome Javascript
- 11. Conflitto di valori booleani di un array JavaScript vuoto
- 12. Errore di copia in conflitto durante la clonazione di un repository
- 13. Errore di Eclipse visualizzato costantemente durante la modifica di Javascript
- 14. Come vedere la modifica durante un "conflitto di fusione" in git rebase
- 15. jQuery.ui.draggable.js e conflitto jQuery.ui.widget.js
- 16. Tokenizzazione di parole non divisibili da OCR utilizzando NLTK
- 17. Errori IE8 durante la definizione di un oggetto Javascript?
- 18. Wordpress plugins conflitto di tinymce
- 19. Conflitto di fusione Git
- 20. ServicePointManager SecurityProtocol conflitto
- 21. Comportamento in conflitto durante la compilazione utilizzando come parola chiave i tipi generici in C#
- 22. Usando git, come si fa a 'usare la loro' durante un conflitto?
- 23. In che modo la tokenizzazione e la corrispondenza dei pattern funzionano in cinese?
- 24. Rails 4 jQuery è in conflitto con javascript
- 25. Avviso: conflitto con la dipendenza "com.android.support:support-annotations"
- 26. Jersey Produzione del tipo di conflitto in conflitto
- 27. L'opzione "AutoParameterizationWebConfigConnectionStrings" è l'unico modo per impedire la tokenizzazione della stringa di connessione?
- 28. Riferimento conflitto
- 29. fascicolazione Conflitto
- 30. Minify javascript in linea durante la compilazione per ASP.net?
ho scritto un tokenizzatore una volta, e questi sono i ER che rilevano un "innesco regex": '/ [{(\ [;,] /' '/ \ + \ + | - | ~ | && | \? |: | \ | \ || \\ $ | (<<|> >>? | ==? |! =? | [- <> + *% & \ | \^/]) =?/'//(? = \ s | \/| user123444555621
Tecnicamente, ci sono un paio di ambiguità che sono inevitabili al livello lessicale, ad esempio '(a + b)/c' contro' if (x) /foo/.exec ('bar') '(può essere preceduto da close-paren). Inoltre,' ++/foo/.abc' e 'a ++/b' (anche plus-plus possono precedere) Insieme a' --' questi sono gli unici che conosco. – dgreensp
@dgreensp Grazie osservazioni molto utili !!! – Zo72