Вы можете создать небольшой анализатор, который не анализирует полный язык JS, но, конечно, соответствует только строковым литералам, одно- и многострочным комментариям и функциям.
Есть генератор синтаксического анализатора JS с именем PEG.js , который может сделать это довольно легко. Грамматика может выглядеть так:
{
var functions = {};
var buffer = '';
}
start
= unit* {return functions;}
unit
= func
/ string
/ multi_line_comment
/ single_line_comment
/ any_char
func
= m:multi_line_comment spaces? "function" spaces id:identifier {functions[id] = m;}
/ "function" spaces id:identifier {functions[id] = null;}
multi_line_comment
= "/*"
( !{return buffer.match(/\*\//)} c:. {buffer += c;} )*
{
var temp = buffer;
buffer = '';
return "/*" + temp.replace(/\s+/g, ' ');
}
single_line_comment
= "//" [^\r\n]*
identifier
= a:([a-z] / [A-Z] / "_") b:([a-z] / [A-Z] / [0-9] /"_")* {return a + b.join("");}
spaces
= [ \t\r\n]+ {return "";}
string
= "\"" ("\\" . / [^"])* "\""
/ "'" ("\\" . / [^'])* "'"
any_char
= .
Когда вы анализируете следующий источник сгенерированным парсером:
/**
* This function does foo.
* Call it with bar. Yadda yadda "groo".
*/
function foo(x)
{
...
}
var s = " /* ... */ function notAFunction() {} ... ";
// function alsoNotAFunction()
// { ... }
function withoutMultiLineComment() {
}
var t = ' /* ... */ function notAFunction() {} ... ';
/**
* BAR!
* Call it?
*/
function doc_way_above(x, y, z) {
...
}
// function done(){};
функция синтаксического анализатора start()
возвращает следующую карту:
{
"foo": "/** * This function does foo. * Call it with bar. Yadda yadda \"groo\". */",
"withoutMultiLineComment": null,
"doc_way_above": "/** * BAR! * Call it? */"
}
Я понимаю, что есть некоторые пробелы, которые нужно заполнить (например, this.id = function() { ... }
), но после прочтения документов из PEG.js немного, это не должно быть большой проблемой (если вы знаете немного парсер генераторов). Если это проблема, отправьте сообщение обратно, и я добавлю его в грамматику и немного объясню, что происходит в грамматике.
Вы можете даже проверить грамматику , размещенную выше онлайн!