Created
March 28, 2010 06:26
-
-
Save mooz/346606 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/local/bin/js | |
function commentRemover(str) { | |
var _str = str.split(""); | |
function getNext() { return _str[i++]; } | |
function unget() { i--; } | |
function operandp(c) { return c && /[a-zA-Z0-9_$.)\]}/]/.test(c); } | |
function getLastConcrete() { | |
for (var i = buffer.length - 1; i >=0; --i) | |
if (SKIPPABLE.indexOf(buffer[i]) === -1) | |
return buffer[i]; | |
return ""; | |
} | |
const SKIPPABLE = "\t\n\r "; | |
const ST_NEUTRAL = 0; | |
const ST_SLASH = 1; | |
const ST_LINECOM = 100; | |
const ST_MULCOM = 1000; | |
const ST_MULCOM2 = 1001; | |
const ST_REGEXP = 10000; | |
const ST_REGEXP2 = 10001; // character class | |
const ST_STRING = 100000; | |
const ST_ESCAPE = 1000000; | |
var buffer = []; | |
var i = 0; | |
var c; | |
var state = ST_NEUTRAL; | |
var prevst = ST_NEUTRAL; | |
var quote = null; | |
while ((c = getNext())) | |
{ | |
if (c === "~") | |
{ | |
print("[=================== " + state + " ==================]"); | |
} | |
// continue means "Skip this char" | |
switch (state) | |
{ | |
case ST_NEUTRAL: | |
if (c === "/") | |
{ | |
state = ST_SLASH; | |
continue; | |
} | |
else if (c === "\"" || c === "'") | |
quote = c, state = ST_STRING; | |
break; | |
case ST_SLASH: | |
if (c === "/") | |
{ | |
state = ST_LINECOM; | |
continue; | |
} | |
else if (c === "*") | |
{ | |
state = ST_MULCOM; | |
continue; | |
} | |
else if (operandp(getLastConcrete())) | |
state = ST_NEUTRAL; // division | |
else | |
state = ST_REGEXP; | |
buffer.push("/"); | |
break; | |
case ST_LINECOM: | |
if (c === "\n") | |
state = ST_NEUTRAL, unget(); | |
continue; | |
break; | |
case ST_MULCOM: | |
if (c === "*") | |
state = ST_MULCOM2; | |
continue; | |
break; | |
case ST_MULCOM2: | |
if (c === "/") | |
state = ST_NEUTRAL; | |
else | |
state = ST_MULCOM, unget(); | |
continue; | |
break; | |
case ST_REGEXP: | |
if (c === "\\") | |
prevst = state, state = ST_ESCAPE; | |
else if (c === "/") | |
state = ST_NEUTRAL; | |
else if (c === "[") | |
state = ST_REGEXP2; | |
break; | |
case ST_REGEXP2: | |
if (c === "\\") | |
prevst = state, state = ST_ESCAPE; | |
else if (c === "]") | |
state = ST_REGEXP; | |
break; | |
case ST_STRING: | |
if (c === "\\") | |
prevst = state, state = ST_ESCAPE; | |
else if (c === quote) | |
state = ST_NEUTRAL; | |
break; | |
case ST_ESCAPE: | |
state = prevst; | |
break; | |
} | |
buffer.push(c); | |
} | |
return buffer.join(""); | |
} | |
let input = []; | |
let str; | |
while ((str = readline()) !== null) | |
input.push(str); | |
print(input.join("\n")); | |
print(commentRemover(input.join("\n"))); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment