2012-11-16 17 views
6

Jestem względnie nowy w ANTLR. Mam bardzo łatwy Gramatyka:ANTLR: Różnica między wstecznym a wyprzedzeniem?

start : 
('A' 'B' 'C' '1' 
|'A' 'B' 'C' '2' 
|'A' 'B' 'C' '3' 
) 
; 

myślę, że już zrozumieć podstawy koncepcji patrzeć w przyszłość i wycofywania (która współpracuje z składniowych orzeczników). Tak więc gramatyka działa z k = 4 lub z backtrack = true. Ale jaka jest dokładna różnica, a główne pytanie brzmi, kiedy używam czegoś? Próbowałem znaleźć odpowiedź w Internecie, ale nie udało mi się.

Odpowiedz

1

Znalazłem teoretyczny opis mojego pytania w książce "Definitve Antlr Reference", która była również ważna dla mojego zrozumienia. Być może inni, którzy zadają sobie podobne pytanie, pomogliby także w tym fragmencie książki.

Snippet from the Book "The definitive Antlr Reference"

Page 262

3

Gramatyka działa w ANTLR v3 bez żadnych opcji.

Opcja k ogranicza ANTLR do klasycznego parsowania LL (k). Backtracking oznacza - jeśli parser nie może przewidzieć, której reguły użyć, po prostu próbuje, backtracks i próbuje ponownie. Opcja cofania, której należy używać, gdy ANTLR nie może zbudować DFA z wyprzedzeniem dla danej gramatyki. ANTLR v3 może zbudować DFA z wyrażeń regularnych dość łatwo, ale ma trudności z regułami rekurencyjnymi. Na przykład ta gramatyka działa:

start: recursive_rule ';' 
    | recursive_rule ':' 
    ; 

recursive_rule : (ID)* '%' 
       ; 

Gramatyka poniżej jest taka sama, ale wyraża się poprzez rekursji. ANTLR nie można budować na to DFA (I właściwie nie wiem dlaczego), więc trzeba przełączyć wycofywania:

start options {backtrack=true;} : recursive_rule ';' 
           | recursive_rule ':' 
           ; 

recursive_rule : ID recursive_rule 
       |'%' 
       ; 

Opcja k służy do poprawy wydajności parsera. Nie znam żadnego innego powodu ograniczania LL (*) do LL (k).

+0

Dziękuję. Spróbuję tego z regułą rekurencyjną, aby lepiej ją zrozumieć. Ale teraz mam pomysł. Dzięki. – Veilchen4ever

+0

Czy możesz wyjaśnić drugi przykład rekursywny? Ponieważ myślę, że to nie jest lewa reguła rekurencji i ANTLR powinien być w stanie sobie z tym poradzić? –