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.
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
@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