2012-10-06 13 views
5

Qual è il modo migliore per (efficacemente) analizzare i commenti multi-riga in stile C (ad esempio, /* ... */) con i combinatori di parser Scala?Combinatori di Parser Scala: Parse in modo efficiente Commenti in stile C

In un progetto in cui sono coinvolto analizziamo un linguaggio di programmazione C-like e vogliamo supportare i commenti su più righe. Usiamo una sottoclasse di StandardTokenParsers, che gestisce già tali osservazioni (via StdLexical. Tuttavia, la classe funziona solo per abbastanza brevi commenti multi-linea, e si esaurisce lo spazio di stack altrimenti.

Abbiamo anche cercato propria che provvede definizione di spazi bianchi per rendere le cose più efficiente Abbiamo usato un RegexParser (ispirato another question on StackOverflow) come segue:.

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

    // ... 

} 

Questo ha migliorato un po 'la situazione, ma provoca comunque un overflow dello stack se il commento è più di qualche decina di righe. Qualche idea su come migliorare questo?

risposta

7

Abbiamo avuto un certo successo con questo tipo di problema definendo lo spazio bianco saltando usando parser invece di usare espressioni regolari. Vedi il tratto WhitespaceParser nel nostro Kiama ParserUtilities.scala per qualche codice di supporto.

La maggior parte del lavoro è di ignorare la normale gestione degli spazi bianchi e legare il nuovo parser ai combinatori letterali e regex (in genere non si usano i parser di token). Vedi one of our examples per l'uso, in questo caso per gestire i commenti annidati.

Problemi correlati