2014-10-24 7 views
7

Durch die Implementierung eines auf peg.js basierenden Parsers bleibe ich beim Hinzufügen von Code zum Umgang mit C-Style-Kommentaren/* wie diesem */stecken.PEG.js - wie man Kommentare im C-Stil parst?

Ich muss den Endmarker finden, ohne es zu essen.

dies nicht funktioniert:

multi = '/*' .* '*/' 

Die Botschaft lautet:

line: 14 
Expected "*/" or any character but end of input found. 

Ich verstehe, warum dies nicht funktioniert, aber leider habe ich keine Ahnung, wie Kommentar Parsen funktionsfähig zu machen.

Hier ist der Code so weit:

start = item* 

item = comment/content_line 

content_line = _ p:content _ {return ['CONTENT',p]} 

content = 'some'/'legal'/'values' 

comment = _ p:(single/multi) {return ['COMMENT',p]} 

single = '//' p:([^\n]*) {return p.join('')} 

multi = 'TODO' 


_ = [ \t\r\n]* {return null} 

und einige Abtastwerteingang:

// line comment, no problems here 

/* 
    how to parse this ?? 
*/ 

values 

// another comment 

some legal 

Antwort

11

ein Prädikat verwenden, die vor uns sieht und stellt sicher, dass es keine "*/" voraus ist in dem Zeichenstrom vor passenden Zeichen :

comment 
= "/*" (!"*/" .)* "*/" 

Der (!"*/" .) Teil c sollte wie folgt gelesen werden: wenn keine '*/' voraus ist, passen Sie ein beliebiges Zeichen.

Dies wird hierfür Spiel Kommentare wie diese erfolgreich: /* ... **/

+0

Funktioniert! Danke vielmals. Ich werde den vollständigen Code veröffentlichen. – Gisela

5

vollständige Code:

Parser:

start = item* 

item = comment/content_line 

content_line = _ p:content _ {return ['CONTENT',p]} 

content = 'all'/'legal'/'values'/'Thanks!' 

comment = _ p:(single/multi) {return ['COMMENT',p]} 

single = '//' p:([^\n]*) {return p.join('')} 

multi = "/*" inner:(!"*/" i:. {return i})* "*/" {return inner.join('')} 

_ = [ \t\r\n]* {return null} 

Probe:

all 

// a comment 

values 

// another comment 

legal 

/*12 
345 /* 
*/ 

Thanks! 

Ergebnis:

[ 
    ["CONTENT","all"], 
    ["COMMENT"," a comment"], 
    ["CONTENT","values"], 
    ["COMMENT"," another comment"], 
    ["CONTENT","legal"], 
    ["COMMENT","12\n345 /* \n"], 
    ["CONTENT","Thanks!"] 
] 
Verwandte Themen