2013-03-16 7 views
5

Sto lavorando a un progetto in cui l'utente immette una stringa di ricerca leggibile con gli operatori E OR. I tre esempiConvertire l'input dell'utente in espressioni regolari

  1. una E (B o C) -> (= ba \ b \?.) (= (\ bb \ b) |?. (\ Ac \ b)). *
  2. a OR (B e C)
  3. (a o B) e (C o d)

Quanto sopra sono campioni di ingresso I potuto ottenere. Voglio prendere quell'input e convertirlo in regex. Non è un esempio di un compilatore? Guardandolo, vedo che quello che voglio fare è convertire un comando di alto livello in uno di basso livello. Hai qualche suggerimento su come potrei realizzare quanto sopra? Quello che voglio è passare la regex prodotta in jsoup (pseudo selettore: matchesOwn) e interrogare un documento html. Grazie per il vostro aiuto.

+0

Se si dispone di parentesi graffe come questa '((()()) ((())())', non è possibile analizzarlo con espressioni regolari in Java. – nhahtdh

+0

Grazie per la risposta. Non voglio analizzare l'input con regex, voglio convertirlo in regex. Invece di chiedere all'utente di darmi regex, gli chiedo una versione più leggibile di esso. – alkis

+0

Come gestiresti il ​​fatto che le regex hanno un ordine ma le stringhe di ricerca no. se un utente inserisce 'foo AND bar' si aspetta che' bar foo' corrisponda a quello che il tuo esempio non userà. O stai per generare ogni permutazione. – user1937198

risposta

5

Il modo generale di fare ciò è di rendere una rappresentazione intermedia sotto forma di una struttura dati facilmente percorribile. Questo è solitamente chiamato AST. Se non hai familiarità con il concetto, dai uno sguardo a calculator-ast che esegue questa trasformazione per un linguaggio di calcolatrice.

Per trasformare le stringhe di input dell'utente in AST, è necessario utilizzare un parser. Potresti dare un'occhiata a antlr. Personalmente uso la v3, la v4 sembra essere meno matura. Dai un'occhiata a antlr3.org. Se vuoi scrivere il parser da solo, potresti dare un colpo a pratt parser. Questo non è banale e incorporare una buona gestione degli errori richiede tempo, ma può essere un esercizio divertente.

Una volta che si dispone di un AST, trasformarlo in un'espressione regolare dovrebbe essere banale spostando l'AST e emettendo i caratteri mentre si procede.

Buona fortuna!

+0

La tua risposta è molto utile. Quindi, in un modo molto astratto di pensare, un piccolo compilatore ... – alkis

+2

Sì! E linguaggi così piccoli sono un ottimo modo per iniziare a familiarizzare con le tecnologie e le terminologie del compilatore. Divertiti. –