Domanda

Sto scrivendo un file flex personalizzato per generare un lexer per l'utilizzo con JSyntaxpane.

Il linguaggio personalizzato che ho bisogno di lex ha diversi stati che possono essere incorporati in ogni altro in una sorta di pila.

cioè si potrebbe essere scrivendo un'espressione che ha una singola stringa citato in esso e poi incorporare un'altra espressione all'interno della stringa utilizzando uno speciale eval per memoria (). Ma si può anche incorporare l'espressione all'interno di una stringa doppia citato.

es:

someExpressionFunction('a single-quoted string with an eval(expression) embedded in it', "a double-quoted string with an eval(expression) embedded in it")

Questa è una semplificazione, non ci sono più stati di questo, ma assumendo ho bisogno di avere diversi stati per DOUBLE_STRING e SINGLE_STRING illustra in modo adeguato la mia situazione.

Qual è il modo migliore per garantire torno allo stato corretto alla chiusura l'espressione eval (cioè tornare a DOUBLE_STRING se ero tra virgolette, SINGLE_STRING se ero tra apici)

La soluzione che è venuta in mente, che funziona, è quello di tenere traccia dello stato utilizzando una pila e alcuni metodi personalizzati da utilizzare al posto di utilizzare yybegin per iniziare uno stato diverso.

private Stack<Integer> stack = new Stack<Integer>();

public void yypushState(int newState) {
  stack.push(yystate());
  yybegin(newState);
}

public void yypopState() {
  yybegin(stack.pop());
}

E 'questo il modo migliore per raggiungere questo obiettivo? C'è una semplice funzione built-in di JFlex posso sfruttare o una pratica migliore che dovrebbe conoscere?

È stato utile?

Soluzione

Credo che sia un ottimo modo per farlo. Io in realtà bisogno di qualche caratteristica simile per aggiungere Groovy GString, Python come stringa e alcuni HTML per JavaDocs.

Quello che vorrei anche aggiungere un Lexer chiamare un Lexer per analizzare sottosezioni. Qualcosa di simile a JavaScript incorporato in HTML. Ma non ho potuto ottenere il tempo per farlo.

Mi piace StackOverflow, ma chiedo solo perché non hai questo post su questioni di JSyntaxPane?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top