2014-09-25 8 views
6

Lavoro con antlr v4 per scrivere un parser t-sql. Questo avviso è un problema?antlr 4 - avviso: la regola contiene un blocco facoltativo con almeno un'alternativa che può corrispondere a una stringa vuota

"regola 'SQLCommit' contiene un blocco opzionale con almeno un'alternativa che può abbinare una stringa vuota"

My Code:

sqlCommit: COMMIT (TRAN | TRANSACTION | WORK)? id?; 

id: 
ID | CREATE | PROC | AS | EXEC | OUTPUT| INTTYPE |VARCHARTYPE |NUMERICTYPE |CHARTYPE |DECIMALTYPE | DOUBLETYPE | REALTYPE 
|FLOATTYPE|TINYINTTYPE|SMALLINTTYPE|DATETYPE|DATETIMETYPE|TIMETYPE|TIMESTAMPTYPE|BIGINTTYPE|UNSIGNEDBIGINTTYPE.......... 
; 

ID: (LETTER | UNDERSCORE | RAUTE) (LETTER | [0-9]| DOT | UNDERSCORE)* 

In una versione, prima ho usato direttamente l'ID della regola del lexer invece dell'ID della regola del parser in sqlCommit. Ma dopo aver cambiato ID in ID appare l'avviso.

(suggerimento se siete confusi di ID e id: voglio usare la regola parser id invece di ID, perché un identificatore può essere un valore letterale, che forse già corrisposto un altra regola lexer)

Saluti

EDIT Con l'aiuto di "280Z28" ho risolto il problema. Nella regola del parser "id" era una barra più del necessario: BITTYPE | CREATE | PROC | | AS | EXEC | OUTPUT |

Quindi il | | include che la regola del parser può corrispondere a una stringa vuota.

risposta

6

Da una ricerca su Google:

ErrorType.EPSILON_OPTIONAL

avviso del compilatore 154.

regola regola contiene un blocco opzionale con almeno un'alternativa che può abbinare una stringa vuota

Una regola contiene un blocco facoltativo ((...)?) attorno a un'alternativa vuota.

La seguente regola produce questo avviso.

x : ; 
y : x?;        // warning 154 
z1 : ('foo' | 'bar'? 'bar2'?)?;   // warning 154 
z2 : ('foo' | 'bar' 'bar2'? | 'bar2')?; // ok 

dal:
4,1

Il problema descritto da questo avvertimento è soprattutto un problema di prestazioni. Con il wrapping di una stringa di lunghezza zero in un blocco opzionale, è stata aggiunta una decisione completamente non necessaria alla grammatica (se inserire o meno il blocco facoltativo) che ha un'alta probabilità di forzare l'algoritmo di predizione attraverso il suo percorso più lento. È simile al wrapping del codice Java nel seguente:

+0

Ciao 280Z28, ho avuto il problema su google prima di pubblicare la mia domanda qui. Ma a quanto pare ho avuto troppo poco su google - mi dispiace per quello. Grazie mille per il tuo aiuto, ho trovato l'errore e cambierò la mia domanda. – flipperweid

+0

@SamHarwell Come ho capito, l'avvertenza 154 impone che nessuna alternativa debba corrispondere alla stringa vuota. Ma perché la prima regola 'x:;' non attiva l'avviso 154? La regola 'x' è semplicemente vuota. – smwikipedia

Problemi correlati