2015-07-29 22 views
9

Jak radzisz sobie z białymi znakami i komentarzami? Fragmenty, które zazwyczaj są usuwane podczas etapu analizy składniowej? Chcę włączyć komentarze w całym dokumencie, które analizuję. Czy dodajesz je w każdym elementarnym parserze, który definiuję jako jedyną opcję?parsec: czy istnieje łatwy sposób na umieszczanie komentarzy/białych znaków w gramatyce?

+8

Najpopularniejszym (niezależnym od biblioteki) sposobem wykonania tej czynności jest po prostu krok tokenizujący przed faktycznym analizowaniem i odrzucenie wszystkich białych znaków i komentarzy. – Cubic

Odpowiedz

8

Sposób, w jaki jest to wykonywane w Text.Parsec.Token, polega na tym, że każdy token zużywa białe znaki i komentarze, które za nim podążają.

Odbywa się to dzięki pomocy lexeme Combinator:

lexeme p = do { x <- p; whitespace; return x } 

która biegnie parser p zużywa białą przestrzeń poniższy go i wraca cokolwiek p zwracane.

Jeśli spojrzeć na źródła makeTokenParser(link) zobaczysz, że wiele z tych analizatorów tokenów są owinięte pomocą lexeme COMBINATOR, np:

symbol name 
    = lexeme (string name) 

zastosowania takiego podejścia, w komentarzach do lexeme(link) punktu wyjścia że jedyny czas, w którym analizator składni musi jawnie zużyć białą przestrzeń, znajduje się na początku danych wejściowych, aby pominąć dowolną białą przestrzeń przed pierwszym tokerem.

7

Powinieneś użyć zdolności parsec do zdefiniowania "parsera tokenów". Chodzi o to, że definiujesz cechy swojego języka w LanguageDef, a następnie używasz wyprowadzonych analizatorów w wynikowym TokenParser, np. identifier, integer itd. Możesz użyć funkcji lexeme ze swojego TokenParser, aby zamienić każdy analizator składni na taki, który połknie wszystkie końcowe spacje.

Aby uzyskać więcej informacji, patrz makeTokenParser.

Przykładem jest this code, który napisałem. To jest kod w świecie rzeczywistym, więc może nie tak dobrze jak w tutorialu, ale możesz zobaczyć, jak definiuję lang = makeTokenParser..., a następnie w poniższych parserach używaj parserów takich jak whiteSpace lang, parens lang. parseTime jest przykładem, gdzie używam lexeme wokół "normalnego" analizatora składni.

+0

Czy jest jakiś przykład użycia tokena? – mb14