2013-04-04 11 views
10

Sto imparando ANTLR4 e stavo cercando di giocare con le modalità lessicali. Come posso visualizzare lo stesso token in più modalità lessicali? Come esempio molto semplice, diciamo che la mia grammatica ha due modalità e voglio abbinare lo spazio bianco e la fine delle righe in entrambe le modalità, come posso farlo senza terminare con WS_MODE1 e WS_MODE2 per esempio. C'è un modo per riutilizzare la stessa definizione in entrambi i casi? Spero di ottenere token WS nel flusso di output per tutto lo spazio bianco indipendentemente dalla modalità. Lo stesso vale per EOL e altre parole chiave che possono apparire in entrambe le modalità.Come definire i token che possono apparire in più modalità lessicali in ANTLR4?

risposta

12

Le regole devono avere nomi diversi, ma è possibile utilizzare il comando lexer -> type(...) per assegnare loro lo stesso tipo.

WS : [ \t]+; 

mode Mode1; 

    Mode1_WS : WS -> type(WS); 

mode Mode2; 

    Mode2_WS : WS -> type(WS); 

Anche se Mode1_WS e Mode2_WS non sono fragment regole, il generatore di codice vedrà il comando type e sapere che è stato riassegnato i loro tipi, in modo da non definire i token per loro.

+0

Breve domanda sull'utilizzo di queste regole di Lexer: nelle regole del parser si fa riferimento a WS o Mode1_WS, Mode2_WS? Ho provato entrambi, ma sembra che tu definisca solo le regole di Lexer senza farvi riferimento direttamente nelle regole del parser. In quel senes è piuttosto una "dichiarazione di importazione" che un "pseudonimo". –

+0

Il comando 'type' assegna esplicitamente il tipo di token, che è il tipo che vedrà il parser. In questo caso, 'WS' verrebbe utilizzato per referenziare i token creati da una di queste 3 regole. –

+0

@SamHarwell cosa termina la specifica della modalità finale? Ho notato che alcuni doc del lexer hanno frammenti di defs in seguito alla specifica della modalità finale in cui l'utilizzo del frammento mostra che i frammenti sono disponibili per tutte le modalità, inclusa quella predefinita. – bvj

Problemi correlati