2011-08-18 8 views
5

Jeśli spojrzeć na opis EBNF języka, często można zobaczyć definicję liczb całkowitych i liczb rzeczywistych:Czy rozpoznawanie liczb należy do skanera lub do analizatora składni?

integer ::= digit digit* // Accepts numbers with a 0 prefix 
real  ::= integer "." integer (('e'|'E') integer)? 

(Definicje zostały wykonane w locie, ja prawdopodobnie popełnił błąd w nich).

Mimo że pojawiają się w gramatyce bezkontekstowej, liczby są często rozpoznawane w fazie analizy leksykalnej. Czy są one zawarte w definicji języka, aby była bardziej kompletna i od realizatora zależy, czy rzeczywiście będą one w skanerze?

Odpowiedz

3

Wiele popularnych narzędzi generatora analizatora składni - takich jak ANTLR, Lex/YACC - osobne analizowanie w dwóch fazach: najpierw łańcuch danych wejściowych jest tokenizowany. Po drugie, żetony są łączone w produkcje, aby utworzyć konkretne drzewo składniowe.

Istnieją jednak alternatywne techniki, które nie wymagają tokenizacji: sprawdź backtracking recursive-descent parsers. W przypadku takiego parsera tokeny są definiowane w podobny sposób jak w przypadku nie-tokenów. pyparsing to generator parsera dla takich analizatorów składni.

Zaletą tej dwuetapowej techniki jest to, że zwykle produkuje ona wydajniejsze parsery - przy użyciu tokenów znacznie mniej manipulacji ciągami, wyszukiwanie ciągów i cofanie.

Według „ostatecznych antlr Reference” (Terence Parra)

Jedyną różnicą [lexers i analizatorów] jest parser rozpoznaje struktury gramatyczne w strumieniu żetonów podczas lexer rozpoznaje strukturę strumień postaci.

1

Składnia gramatyki musi być pełna, aby być dokładnym, więc oczywiście zawiera szczegóły dotyczące dokładnego formatu identyfikatorów i pisowni operatorów.

Tak, inżynier kompilator decyduje, ale generalnie jest to dość oczywiste. Chcesz, aby lexer sprawnie radził sobie z wszystkimi szczegółami na poziomie postaci.

Istnieje dłuższa odpowiedź pod adresem Is it a Lexer's Job to Parse Numbers and Strings?

Powiązane problemy