To ze względu na więzy przejrzystości. Podobnie jak brak funkcji można odróżnić
let x = 1:x
let x = 1:1:1:x
let x = 1:1:1:1:1:1:1:1:1:... -- if this were writeable
brak funkcji można odróżnić gramatyki, który jest skończonym wykres i gramatyki, która jest nieskończona drzewo. Zasadnicze algorytmy parsowania muszą być w stanie zobaczyć gramatykę jako wykres, aby wyliczyć wszystkie możliwe stany parsowania.
Fakt, że parser odgórne zobaczyć ich wkład jako nieskończonych drzewach pozwala im być bardziej wydajne, ponieważ drzewo może być obliczeniowo bardziej skomplikowane niż każdy wykres może być; Na przykład,
numSequence n = string (show n) *> option() (numSequence (n+1))
ponosi żadnej skończoną sekwencję wzrastające cyfr począwszy od n
. Ma to nieskończenie wiele różnych stanów analizowania. (Może być możliwe reprezentowanie tego w sposób bezkontekstowy, ale byłoby to trudne i wymagałoby większego zrozumienia kodu, niż biblioteka parsująca jest w stanie, jak sądzę,)
U dołu biblioteka kombinatorów może być napisany, choć jest nieco brzydki, wymagając wszystkie parsery być „oznaczone” w taki sposób, że
- taka sama etykieta odnosi się zawsze do tego samego parsera i
- jest tylko zbiorem skończonym etykiet
w którym to momencie zaczyna wyglądać bardziej jak tradycyjna specyfikacja gramatyki niż kombinatoryczna specyfikacja. Jednak nadal może być przyjemny; musielibyśmy tylko etykietować produkcje rekursywne, co wykluczałoby wszelkie nieskończenie duże reguły, takie jak numSequence
.