2012-10-06 10 views
5

Scala ayrıştırıcı kombinatorleri ile C stili çok satırlı yorumların (yani /* ... */) ayrıştırılmasının (verimli bir şekilde) en iyi yolu nedir?Scala Ayrıştırıcılar Kombinasyonları: Verimli Ayrıştırma C-Style Yorumlar

Katıldığım bir projede C benzeri bir programlama dilini ayrıştırıyoruz ve çok satırlı yorumları desteklemeyi istiyoruz. Zaten StdLexical yoluyla (örneğin bir yorum kolları StandardTokenParsers bir alt sınıfı, kullanıyoruz. Ancak, sınıf yalnızca oldukça kısa çok hatlı yorumlar için çalışır ve aksi yığın alanı yetersiz çalışır.

Biz de kendi tanımını sağlayan denedi

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]] 
    } 

    // ... 

} 

Bu biraz durumu düzeldi ama açıklama birkaç düzine çizgi değildir eğer hala yığın taşması olur. boşluğa şöyle (another question on StackOverflow esinlenerek) bir RegexParser kullanılan şeyler daha verimli hale getirmek. Bunu geliştirmek için herhangi bir fikir?

cevap

7

Bu tür bir sorunla, normal ifadeler kullanmak yerine, parserleri kullanarak boşluk atlama atlamalarını tanımlayarak bazı başarılarımız oldu. Bazı destek kodları için Kiama ParserUtilities.scala'daki WhitespaceParser özelliğine bakın.

Bunun için yapılan boşluğun çoğu, normal normal ifade boşluksunun ele alınmasını geçersiz kılmak ve yeni ayrıştırıcıyı literal ve regex birleştiricilere bağlamaktır (genellikle belirteci ayrıştırıcılarını kullanmayız). Bu durumda iç içe geçmiş yorumları işlemek için one of our examples'a bakın.