在javascript中检索javascript注释,或者,如何在js中解析js?

在javascript中检索javascript注释,或者,如何在js中解析js?,javascript,parsing,comments,Javascript,Parsing,Comments,我正在寻找一种从一些(其他)javascript代码访问javascript注释的方法。 我计划使用它来显示页面上调用各种js函数的元素的低级帮助信息,而无需在多个位置重复这些信息 mypage.html: ... <script src="foo.js"></script> ... <span onclick="foo(bar);">clickme</span> <span onclick="showhelpfor('foo');>?

我正在寻找一种从一些(其他)javascript代码访问javascript注释的方法。 我计划使用它来显示页面上调用各种js函数的元素的低级帮助信息,而无需在多个位置重复这些信息

mypage.html:

...
<script src="foo.js"></script>
...
<span onclick="foo(bar);">clickme</span>
<span onclick="showhelpfor('foo');>?</span>
...
我想我可以使用getElementsByTagName获取脚本标记,然后使用AJAX请求加载文件以获取其纯文本内容。然而,我需要一种可靠的方法来解析javascript(也就是说,不是一堆乱七八糟的regexp),以保留那些简单地求值就会丢弃的字符

我想简单地把文档放在函数后面,放在js字符串中,但这很尴尬,我觉得让doxygen来处理它会很困难

function foo(x) { ... }
foo.comment = "\
This functions does foo.\
Call it with bar.  Yadda yadda \"groo\".\
";

您可以在每个注释的开头使用唯一的字符串标识符,然后使用该唯一标识符,您可以轻松地创建一个正则表达式来提取注释。

您可以创建一个小解析器,它不解析完整的JS语言,而只匹配字符串文本,单行和多行注释和功能

有一个名为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(){…}
),但是读了一点之后,这应该不是什么大问题(假设您对解析器生成器了解一点)。如果有问题,请发回,我会将其添加到语法中,并解释一下语法中发生了什么


你甚至可以在上面在线发布

嗯,这比我希望的要复杂一点,但看起来它应该满足我的需要。谢谢
{
   "foo": "/** * This function does foo. * Call it with bar. Yadda yadda \"groo\". */",
   "withoutMultiLineComment": null,
   "doc_way_above": "/** * BAR! * Call it? */"
}