2011-12-05 13 views
12

Próbuję nauczyć się używać Parsec do pisania parsera Delphi, ale utknąłem w definiowaniu LanguageDef. W przypadku Delphi istnieją dwa typy bloków komentarzy: (* comments *) i { comments }. Ale typy commentStart & commentEnd z LanguageDef są ciągami, a nie [String], więc mogłem umieścić tylko jeden lub drugi.Jak zdefiniować wiele typów bloków komentarzy w Parserze

Tak więc, próbowałem stworzyć własny parser WhiteSpace, ale nie jestem pewien czy mógłbym go przekazać pod makeTokenParser.

Każda pomoc zostanie doceniona.

Dzięki


John i Chris pomogły mi zrozumieć i ominąć ten problem, ale rozwiązanie polega na zastąpieniu ogromną liczbę parserami że makeTokenParser dostarcza, więc nie jest to dokładnie to pożądane.

Będę pisać ponownie, gdybym mógł znaleźć lepsze rozwiązanie.

+0

wiem, że to nie jest odpowiedź na to pytanie, ale Mike Lischke wykonane otwartą parser źródło Delphi i lexer, znany jako [DCC] (http://www.soft-gems.net/index.php?option=com_content&task=view&id=25&Itemid=33). –

Odpowiedz

5

Moje czytanie pliku Text.ParserCombinators.Parsec.Language polega na tym, że nie można tego zrobić bezpośrednio za pomocą LanguageDef.

Wierzę, że jesteś na dobrej drodze do napisania własnego parsera whiteSpace. Aby pomyślnie z niego skorzystać, należy nadpisać analizator składni whiteSpace wygenerowany przez makeTokenParser. Numer TokenParser utworzony przez makeTokenParser jest rekordem dla każdego pola zawierającego analizator składni. Możemy utworzyć nową kopię zapisu z jednego z tych pól otrzymuje brzmienie:

-- ask GCHi for the type actual type signature constraints 
-- Type sig is approx. fixWhiteSpace :: TokenParser -> Parser -> TokenParser 
fixWhiteSpace originalTokenParser myWhiteSpaceParser = 
    originalTokenParser {whiteSpace = myWhiteSpaceParser} 
+0

Szybko spróbowałem, nie działało, ale mogłem robić coś złego. Spędzę na nim trochę więcej czasu. Tylko w celu potwierdzenia, czy istnieje inny parser w 'originalTokenParser', który jest zdefiniowany z oryginalnym' whiteSpace', czy ten parser automatycznie użyje 'myWhiteSpaceParser' po zastosowaniu' fixWhiteSpace'? – ePak

+1

@epak: Nie. Wszystkie wartości są niezmienne, więc określenie "newParser = fixWhiteSpace blach" nie ma wpływu na originalTokenParser. –

+0

@ChrisKuklewicz: Dzięki za wyjaśnienie tego dla mnie, a tak naprawdę jest to podstawowy problem. Parser 'leksemów' jest zdefiniowany w terminach' whiteSpace' i dużo więcej parserów, w tym 'identyfikator', są zdefiniowane w terminach' leksemu'. Kiedy zamieniłem parser 'identifier' na moją definicję' leksemów' i 'whiteSpace', tak jak sugerował @John, poradziłoby sobie z wieloma typami bloków komentarzy. – ePak

Powiązane problemy