2013-04-19 6 views
21

Sto creando la mia prima grammatica con ANTLR e ANTLRWorks 2. Ho finito per lo più la grammatica stessa (riconosce il codice scritto nella lingua descritta e costruisce alberi di analisi corretti), ma non ho iniziato niente oltre.La "definizione di token impliciti nella regola parser" è qualcosa di cui preoccuparsi?

Ciò che mi preoccupa è che ogni prima occorrenza di un token in una regola parser è sottolineata con un "ghirigoro giallo" che recita "Definizione di token impliciti nella regola del parser".

Ad esempio, in questa regola, il 'var' ha quel ghirigoro:

variableDeclaration: 'var' IDENTIFIER ('=' expression)?; 

come appare esattamente:

enter image description here

La cosa strana è che ANTLR per sé non sembra attenzione a queste regole (quando si fa il test di rig test, non riesco a vedere nessuno di questi avvertimenti nell'output del parser generator, solo qualcosa sulla versione errata di Java installata sulla mia macchina), quindi è solo ANTLRWorks a lamentarsi.

È qualcosa di cui preoccuparsi o devo ignorare questi avvisi? Devo dichiarare tutti i token esplicitamente nelle regole lexer? La maggior parte delle espulsioni nella bibbia ufficiale The Defintive ANTLR Reference sembrano essere fatte esattamente come scrivo il codice.

risposta

14

Consiglio vivamente di correggere tutte le istanze di questo avviso nel codice di qualsiasi importanza.

Questo avviso è stato creato (da me in realtà) per avvisare l'utente di situazioni come la seguente:

shiftExpr : ID (('<<' | '>>') ID)?; 

Dal ANTLR 4 incoraggia codice di azione essere scritto in file separati nella lingua di destinazione, invece di incorporare direttamente nella grammatica, è importante essere in grado di distinguere tra << e >>. Se i token non sono stati creati esplicitamente per questi operatori, verranno assegnati tipi arbitrari e non saranno disponibili costanti nominate per il riferimento a tali operatori.

Questo avviso aiuta anche evitare le seguenti situazioni problematiche:

  • Una regola parser contiene un riferimento di token errato. Senza l'avviso, questo potrebbe portare alla creazione silenziosa di un token aggiuntivo che potrebbe non essere mai abbinato.
  • Una regola parser contiene un riferimento di token non intenzionale, come il seguente:

    number : zero | INTEGER; 
    zero : '0'; // <-- this implicit definition causes 0 to get its own token 
    
+0

Ok, grazie, prenderò in considerazione l'idea di farlo.Per quanto riguarda la separazione del codice azione, c'è qualcosa oltre "grammatica combinata -> AST -> albero gramar con codice di azione"? Ho solo il libro per la v3, quindi se è qualcosa di nuovo, c'è qualche articolo online che lo spiega? La documentazione online su antlr.org sembra mancare di informazioni sulle differenze tra v3 e v4. –

+0

ANTLR 4 non include più output = AST o grammatiche ad albero. Al contrario, utilizza gli alberi di analisi con le interfacce listener e/o visitatore generati automaticamente dalla grammatica del parser. –

+0

Ho notato che ANTLRWorks2 lancia anche questo stesso messaggio quando accidentalmente utilizzo un token contrassegnato come frammento in una regola parser. È previsto o dovrebbe mostrare un errore diverso? –

0

Se si sta scrivendo la grammatica lesser che non verrebbe utilizzata su più grammi di parser, è possibile ignorare questo avviso visualizzato da ANTLRWorks2.

+0

Sto scrivendo una grammatica combinato (e mi piace, molto meglio di LEX + YACC), ma io vuoi che il gramar crei un AST, che sarà consumato da almeno due grammatiche ad albero. Conta? Inoltre, perché il downvote? –

+6

Non sono d'accordo con questa risposta perché questo avviso può avvisare gli sviluppatori di problemi grammaticali anche se i token sono utilizzati solo in una grammatica. Ho dato diversi esempi nella mia risposta. –

Problemi correlati