2014-09-25 9 views
6

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.

Odpowiedz

6

Z wyszukiwarki Google:

ErrorType.EPSILON_OPTIONAL

Compiler Ostrzeżenie 154.

regułę reguła zawiera opcjonalny blok z przynajmniej jednej alternatywy, które można dopasować pusty ciąg

Reguła zawiera opcjonalny blok ((...)?) wokół pustej alternatywy.

Poniższa reguła generuje to ostrzeżenie.

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

od:
4,1

Problem opisany przez tego ostrzeżenia jest przede wszystkim problemem wydajności. Przez zawinięcie łańcucha o zerowej długości w opcjonalnym bloku, dodano zupełnie niepotrzebną decyzję do gramatyki (czy wprowadzić opcjonalny blok, czy nie), który ma duże prawdopodobieństwo wymuszenia algorytmu przewidywania przez jego najwolniejszą ścieżkę. Jest to podobne do zawijania kodu Java w:

if (slowMethodThatAlwaysReturnsTrue()) { 
    ... 
} 
+0

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

+0

@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