2012-10-06 9 views
5

Jaki jest najlepszy sposób (wydajnego) analizowania wielowierszowych komentarzy w stylu C (tj. /* ... */) za pomocą kombinatorów parsera Scala?Kombinatory analizatora składni Scala: wydajnie analizować komentarze w stylu C

W projekcie, w którym uczestniczę, analizujemy język programowania w stylu C i chcemy obsługiwać komentarze wielowierszowe. Używamy podklasę StandardTokenParsers, który już obsługuje takie uwagi (przez StdLexical. Jednak klasa działa tylko na dość krótkich uwag multi-line, a zabraknie miejsca stosu inaczej.

Mamy również próbował zapewniając naszą własną definicję od spacji aby uczynić to bardziej wydajny Użyliśmy RegexParser (inspirowany another question on StackOverflow) w następujący sposób:.

class Parser extends StandardTokenParsers { 

    override val lexical = new StdLexical { 
    def rp: RegexParsers = new RegexParsers {} 
    override val whitespace: Parser[Any] = rp.regex("""(\s|//.*|(?m)/\*(\*(?!/)|[^*])*\*/)*""".r).asInstanceOf[Parser[Any]] 
    } 

    // ... 

} 

to poprawiło sytuację nieco, ale nadal powoduje przepełnienie stosu, jeśli komentarz jest więcej niż kilkudziesięciu linii. Wszelkie pomysły, jak to poprawić?

Odpowiedz

7

Osiągnęliśmy pewien sukces w tego rodzaju problemie, definiując odstępy za pomocą parserów zamiast wyrażeń regularnych. Zobacz cechę WhitespaceParser w naszej Kiama ParserUtilities.scala, aby uzyskać kod pomocniczy.

Większość pomyłek polega na zastąpieniu normalnej obsługi białych znaków w wyrażeniu regularnym i powiązaniu nowego parsera z kombinatorami dosłownymi i regex (zazwyczaj nie używamy parserów tokenów). Zobacz one of our examples do wykorzystania, w tym przypadku do obsługi zagnieżdżonych komentarzy.

Powiązane problemy