Strip block comments
Strip block comments
You are encouraged to solve this task according to the task description, using any language you may know.
You are encouraged to solve this task according to the task description, using any language you may know.
A block comment begins with a begining delimiter and ends with a ending delimiter, including the delimiters.
Task : Strips block comments from text (of codes). Your demos should at least handle simple, non-nested and multiline block comment delimiters.
Sample text for striping.
/** * Some comments * longer comments here that we can parse. * * Rahoo */ function subroutine() { a = /* inline comment */ b + c ; } /*/ <-- triky comments */ /** * Another comment. */ function something() { }
D
<lang d>import std.stdio ; import std.regexp, std.algorithm ;
string[] sepComment(string s, string cpat[] ...) {
assert(cpat.length == 2, "sepComment : 2 pattern arguments for comment begin & end") ; string[] res = new string[](2) ; int p = 0, q = 0 /* cursors */, ic = 0 ; // inside comment? int[] plen = new int[](2) ; // this's for handling /*/
bool advCursor() { auto m = std.regexp.search(s[p..$], cpat[ic]) ; if(m is null) return false ; plen[ic] = max(0, plen[ic], m[0].length) ; q = p + m.pre.length ; // got comment head if(ic) { q += m[0].length ; } // or comment tail if(std.regexp.find(m[0], "\n|\r") != -1) // special adjust for \n\r q-- ; return true ; }
while(true) { if(!advCursor()) break ; res[ic] ~= s[p..q] ; // save slice of result if( ic && (q - p < plen[0] + plen[1])) { // this handle /*/ pattern p = q ; if(!advCursor()) break ; res[ic] ~= s[p..q] ; // save result again } p = q ; // advance cursor ic = 1 - ic ; // toggle search type } if(ic) throw new Exception("Mismatched Comment") ; res[ic] ~= s[p..$] ; // save rest(non-comment) return res ;
}
void main() {
string s = ` /** * Some comments * longer comments here that we can parse. * * Rahoo */ function subroutine() { a = /* inline comment */ b + c ; } /*/ <-- triky comments */
/** * Another comment. */ function something() { }` ;
writefln("==original:\n%s", s) ; auto t = sepComment(s, `/\*`, `\*/`) ; writefln("==comment stripted:\n%s\n==stripted comment:\n%s", t[0], t[1]) ;
s = "apples, pears # and bananas
apples, pears ; and bananas " ; // test for line comment
writefln("==original:\n%s", s) ; t = sepComment(s, `#|;`, `[\n\r]|$`) ; writefln("==comment stripted:\n%s\n==stripted comment:\n%s", t[0], t[1]) ;
}</lang> part of output:
==comment stripted: function subroutine() { a = b + c ; } function something() { } ==stripted comment: /** * Some comments * longer comments here that we can parse. * * Rahoo *//* inline comment *//*/ <-- triky comments *//** * Another comment. */