Pracuję z antlr v4, aby napisać parser t-sql. Czy to ostrzeżenie jest problemem?antlr 4 - ostrzeżenie: reguła zawiera opcjonalny blok z co najmniej jedną alternatywą, która może pasować do pustego ciągu
„reguła«SQLCommit»zawiera opcjonalny blok z co najmniej jednej alternatywy, które można dopasować pusty ciąg”
mój kod:
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)*
w wersji przed użyłem bezpośrednio identyfikator reguły leksykalnej zamiast identyfikatora reguły analizatora składni w sqlCommit. Ale po zmianie ID na id pojawia się ostrzeżenie.
(Podpowiedź jeśli są mylone z ID oraz ID: Chcę użyć identyfikatora reguły parser zamiast ID ponieważ identyfikator może być dosłowne, które być może już w parze z innym przepisem Lexer)
Pozdrawiam
EDYTOWANIE Przy pomocy "280Z28" rozwiązałem problem. W regule parsera "id" był jeden ukośnik bardziej niż potrzebny: BITTYPE | CREATE | PROC | | AS | EXEC | WYJŚCIE |
Więc | | obejmuje to, że reguła analizatora składni może być zgodna z pustym łańcuchem znaków.
Witaj 280Z28, Miałem problem z Google, zanim opublikuję tutaj moje pytanie. Ale wydaje się, że zbyt mało google - przepraszam za to. Dziękuję bardzo za pomoc, znalazłem błąd i zmienię moje pytanie. – flipperweid
@SamHarwell Jak rozumiem, ostrzegam 154, że żadna alternatywa nie powinna pasować do pustego ciągu. Ale dlaczego pierwsza reguła 'x:;' nie wyzwala ostrzeżenia 154? Reguła 'x' jest po prostu pusta. – smwikipedia