2013-05-16 19 views
6

Come abbinare qualsiasi simbolo nel parser ANTLR (non lexer)? Dov'è la descrizione completa della lingua per i parser ANTLR4?Come abbinare qualsiasi simbolo nel parser ANTLR (non lesser)?

UPDATE

È la risposta è "impossibile"?

+0

La risposta alla tua domanda aggiornata è: sì, è impossibile (come ho indicato nella mia risposta). –

+0

Non ho idea di cosa esattamente hai bisogno. Ma forse dovresti guardare "grammatiche dell'isola". Dovrebbe aiutare nei casi in cui è necessario analizzare un input con due grammatiche diverse. – ibre5041

risposta

4

Dipende da cosa intendi per "simbolo". Per abbinare qualsiasi token all'interno di una regola parser, utilizzare il meta-char . (DOT). Se stai cercando di abbinare qualsiasi personaggio all'interno di una regola del parser, allora sei fuori di sorte, c'è una stretta separazione tra le regole del parser e del lexer in ANTLR. Non è possibile abbinare alcun carattere all'interno di una regola parser.

+0

Questo non limita seriamente il lavoro con Unicode?Unicode è costituito da migliaia di simboli e ANTLR mi consente di trattare la maggior parte di loro come token stesso o creare una definizione lexer per ciascuno. Sembra un cattivo design. Non è vero? –

+0

P.S. Supponiamo di voler descrivere la stringa letterale Java. È racchiuso tra virgolette ma può contenere qualsiasi cosa. Se lo analizzo con lesser, perderò il suo contenuto. Perché così diverso con il letterale intero? –

+0

@SuzanCioc scusa, non ho idea di cosa intendi. I valori letterali stringa vengono generalmente gestiti nel lexer, perché dovresti gestirli in una regola parser? –

5

Innanzitutto è necessario capire i ruoli di ciascuna parte in analisi:

Il lexer: questo è l'oggetto che tokenizza la stringa di input. Tokenizzare significa convertire un flusso di caratteri di input in un simbolo di token astratto (di solito solo un numero).

Il parser: questo è l'oggetto che funziona solo con token per determinare la struttura di una lingua. Una lingua (scritta come uno o più file grammaticali) definisce le combinazioni di token che sono valide.

Come si può vedere, il parser non sa nemmeno cosa sia una lettera. Conosce solo token. Quindi la tua domanda è già sbagliata. È come chiedere come tagliare singoli atomi usando una motosega.

Detto questo, probabilmente sarebbe utile sapere perché si desidera ignorare le singole lettere di input nel parser. Sembra che il tuo concetto base abbia bisogno di aggiustamenti.

+0

Come ha detto il rispondente precedente, vi è DOT meta char in ANTLR. Avrebbe anche qualche regola del lexer per convertire tutti i caratteri in token in modo 1: 1. Non vedo alcuna ragione per avere il lexer. Fa tagging come parser, ma tagging poveri e limitati. È un costrutto ridondante. –

+0

@SuzanCioc, stai solo usando lo strumento sbagliato. ANTLR non funziona come ti aspetti/vuoi. Quello che vuoi è un PEG, non c'è bisogno di lamentarsi del fatto che ANTLR non fa come ti aspetti/vuoi. –

+0

PEG è uno strumento o nozione? –

2

È possibile, ma solo se si dispone di una grammatica di base tale che il motivo per utilizzare ANTLr viene comunque annullato.

Se tu avessi la grammatica:

text  : ANY_CHAR* ; 
ANY_CHAR : . ; 

sarebbe fare quello che (sembra) desiderare.

Tuttavia, come molti hanno sottolineato, questa sarebbe una cosa piuttosto strana da fare. Lo scopo del lexer è identificare diversi token che possono essere messi insieme nel parser per formare una grammatica, in modo che il tuo lexer possa identificare la stringa specifica "JSTL/EL" come token, o [AZ] "/ EL" , [AZ] '/' [AZ] [AZ], ecc., A seconda di cosa ti serve.

Il parser viene quindi utilizzato per definire la grammatica, in modo da:

phrase  : CHAR* jstl CHAR* ; 
jstl  : JSTL SLASH QUALIFIER ; 

JSTL  : 'JSTL' ; 
SLASH  : '/' 
QUALIFIER : [A-Z][A-Z] ; 
CHAR  : . ; 

accetterebbero "bla bla JSTL/EL ..." come input, ma non "bla bla EL/JSTL ..." .

Si consiglia di consultare il Riferimento ANTlr 4 definitivo, in particolare la sezione "Isole nello stream" e il Riferimento grammaticale (Ch 15) che si occupa specificamente di Unicode.

+0

La tua regola 'frase' non funzionerà sulla frase" JSTL è la versione in maiuscolo di jstl "perché lesser mangerà prima" JSTL "come token' JSTL' e quindi non corrisponderà alla regola frase. Quindi, l'idea del lexer è solo una cattiva idea. –

+0

Questo è piuttosto strano visto che quando ho iniziato con ANTlr avevo praticamente la visione opposta - e mi sono avvicinato parecchie volte al solo uso del Lexer per fornire token e quindi scrivere il mio Parser al di fuori di ANTlr. Tutto quello che posso dire è che, per gran parte delle semplici grammatiche qui in uso che le persone usano per discutere di bug e/o incomprensioni, sì, sembra eccessivo avere un Parser e un Lexer. Tuttavia, una volta che le cose si complicano, la divisione è utile - sia la grammatica lesser e parser per la nostra applicazione qui corrono a 100s di linee e riteniamo che questo disaccoppiamento sia una buona idea. – Dave

Problemi correlati