Skip to content

Instantly share code, notes, and snippets.

@mooz
Created March 28, 2010 06:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mooz/346606 to your computer and use it in GitHub Desktop.
Save mooz/346606 to your computer and use it in GitHub Desktop.
#!/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