È possibile? Qualche strumento disponibile per questo?Generazione di espressioni casuali ma ancora valide basate sulla grammatica yacc/bison/ANTLR
risposta
yacc e bison trasformano la grammatica in una macchina a stati finiti. Dovresti essere in grado di attraversare a caso la macchina a stati per trovare input validi.
In pratica, in ogni stato è possibile spostare un nuovo token nello stack e passare a un nuovo stato o ridurre il token superiore nello stack in base a una serie di riduzioni valide. (Vedi lo Bison manual per dettagli su come funziona).
Il generatore casuale attraverserà la macchina di stato effettuando spostamenti casuali ma validi o riduzioni in ogni stato. Una volta raggiunto lo stato del terminale, hai un input valido.
Per una descrizione umana leggibile degli stati è possibile utilizzare l'opzione -v
o --report=state
in bison.
Ho paura di non poterti indicare alcuno degli strumenti esistenti in grado di farlo.
È possibile farlo con qualsiasi sistema che consente di accedere alla grammatica di base. ANTLR e YACC compilano la tua grammatica in modo da non averne più. Nel caso di ANTLR, la grammatica è stata trasformata in codice; non hai intenzione di riaverlo. Nel caso di YACC, si finisce con le tabelle parser, che contengono l'essenza della grammatica; potresti camminare su questi tavoli di analisi se li hai capiti abbastanza bene da fare ciò che descrivo di seguito.
È abbastanza facile attraversare un insieme di regole grammaticali esplicitamente rappresentate e scegliere in modo casuale espansioni/derivazioni. Per definizione questo ti fornirà una sintassi valida.
Quello che non farà è ottenere valido codice. Il problema qui è che la maggior parte delle lingue ha una sintassi sensibile al contesto; la maggior parte dei programmi non è valida a meno che gli identificatori dichiarati non vengano utilizzati in modo coerente con le loro regole di dichiarazione e di scoping. Quest'ultimo richiede un controllo semantico completo.
Il nostro DMS Software Reengineering Toolkit viene utilizzato per analizzare il codice in lingue arbitrarie [utilizzando una grammatica], creare AST, consente di analizzare e trasformare tali alberi e infine testo valido (sintattico) di prettyprint. DMS fornisce accesso diretto alle regole grammaticali e alle strutture di costruzione degli alberi, quindi è abbastanza facile generare alberi sintattici casuali (e prettyprint). Assicurarsi che siano semanticamente validi è difficile anche con DMS; tuttavia, molti front-end di DMS possono prendere un albero (casuale) e fare il controllo semantico, quindi almeno sapresti se l'albero è semanticamente valido.
Cosa fai se dice "no" è ancora un problema. Forse è possibile generare nomi di identificatori in modo tale da garantire almeno un utilizzo non incoerente, ma sospetto che sarebbe dipendente dalla lingua.
Sì, i nomi sono una domanda successiva ... Ho bisogno di generare AST casuali per quanto riguarda un primo passo. –
- 1. generazione di enumerazioni casuali
- 2. espressioni valide alla funzione citazione
- 3. Spark - Generazione di numeri casuali
- 4. Generazione contemporanea di numeri casuali
- 5. Secret Santa - Generazione di permutazioni "valide"
- 6. Espressioni regolari sulla punteggiatura
- 7. Generazione di identificatori casuali facili da ricordare
- 8. django, ricerche basate sulla posizione
- 9. Generazione di numeri casuali di grandi dimensioni
- 10. Generazione di parole casuali in JavaScript
- 11. Generazione di numeri casuali molto grandi java
- 12. Generazione di parole casuali in Java?
- 13. Generazione di valori casuali e univoci C#
- 14. Generazione di numeri casuali in applicazioni MVC
- 15. Generazione di miniature casuali con PHP + FFMPEG
- 16. Generazione di numeri casuali senza ripetizioni
- 17. Generazione di numeri casuali diversi tra OS
- 18. generazione di numeri casuali senza ripetizione consecutiva
- 19. Generazione di numeri casuali su Spartan-3E
- 20. Generazione casuale di numeri casuali in R
- 21. Generazione di numeri casuali uniformemente distribuiti
- 22. Deterministica generazione di numeri casuali su sistemi
- 23. Generazione di file casuali in Windows
- 24. Generazione di UUID casuali in Linux
- 25. Grammatica grammatica dispari
- 26. grammatica di espressioni booleane e aritmetiche in ANTLR
- 27. select_related() nelle viste generiche basate sulla classe
- 28. modifiche di stage in git basate su espressioni regolari
- 29. Generazione di licenze per app basate su elettronica
- 30. creazione di istruzioni di montaggio basate sulla timeline in java
non ha ottenuto la tua domanda, stai chiedendo questo http://flex.sourceforge.net/ se non è così, per favore, elaborare –
No, non riguardo flex. Sai, yacc/bison/ANTLR analizza * le espressioni * usando una * grammatica specifica *. Devo generare espressioni * casuali * valide per la grammatica * specificata *. Ad esempio, utilizzando la grammatica della calcolatrice, mi piacerebbe avere uno strumento per produrre espressioni come "1 + 2 + 3", "1 + 4 * 8", ecc., All'infinito e in modo casuale. –
@ nav-jan: perché dovrebbe essere facile? Le asserzioni senza backup non sono davvero utili. (Bene, un calcolatore numerico può essere facile). –