javascript解析器可以收集其原始格式的信息吗?

javascript解析器可以收集其原始格式的信息吗?,javascript,parsing,abstract-syntax-tree,Javascript,Parsing,Abstract Syntax Tree,我想制作一个工具,可以从javascript源代码生成html文件,并显示其中带有语法高亮显示的代码。我希望在HTML中保留完全相同的代码格式(注释、换行符、空格)。我尝试了babel解析器/遍历,但它在构建AST时会丢弃这些标记(而babel生成器在生成代码时只使用最少的空格)。还有其他选择吗 javascript解析器可以收集其原始格式的信息吗 是的,可以。对于以后执行代码来说,这是不必要的,这就是为什么一些解析器会删除关于底层源代码的任何信息,因为根本不需要这些信息。然而,对于JavaSc

我想制作一个工具,可以从javascript源代码生成html文件,并显示其中带有语法高亮显示的代码。我希望在HTML中保留完全相同的代码格式(注释、换行符、空格)。我尝试了babel解析器/遍历,但它在构建AST时会丢弃这些标记(而babel生成器在生成代码时只使用最少的空格)。还有其他选择吗

javascript解析器可以收集其原始格式的信息吗

是的,可以。对于以后执行代码来说,这是不必要的,这就是为什么一些解析器会删除关于底层源代码的任何信息,因为根本不需要这些信息。然而,对于JavaScript解析器来说,关于如何存储名为ESTree的AST,社区有一个协议,即树的每个节点都有一个
loc
属性,其中包含源代码中某个节点的
start
end

还有其他选择吗

创建这样一个ESTree的解析器之一是,但可能还有更多

javascript解析器可以收集其原始格式的信息吗

是的,可以。对于以后执行代码来说,这是不必要的,这就是为什么一些解析器会删除关于底层源代码的任何信息,因为根本不需要这些信息。然而,对于JavaScript解析器来说,关于如何存储名为ESTree的AST,社区有一个协议,即树的每个节点都有一个
loc
属性,其中包含源代码中某个节点的
start
end

还有其他选择吗


创建这种ESTree的解析器之一是,但可能还有更多的解析器。

您几乎不需要解析器或AST来完成您想要的任务

如果我理解您的目标,那么您真正要做的就是以不同的方式突出显示语言中的标记,并保留它们相对于左边距的相对位置

为此,您只需提取令牌并跟踪每个令牌的起始列号。您可以相当容易地手工将这种lexer构建为JavaScript;由于转义字符,字符串文字标记将是最混乱的。您可以使用flex之类的lexer生成器,也可以手动使用即席处理和/或正则表达式(这是flex允许您以有组织的方式完成的)。通过这种方式,您可以处理空白以帮助跟踪列号,并捕获注释以便可以复制它们

如果您使用flex,则可以提供一些代码,以便在识别每个令牌时执行;那会吐出你的html。如果您通过特别的方法构建lexer,您仍然会有分散的HTML生成机会


如果您想快速启动这个过程,您可能需要开源解析器的源代码,扔掉解析器部分,然后修复lexer部分。

您几乎不需要解析器或AST来完成您想要的任务

如果我理解您的目标,那么您真正要做的就是以不同的方式突出显示语言中的标记,并保留它们相对于左边距的相对位置

为此,您只需提取令牌并跟踪每个令牌的起始列号。您可以相当容易地手工将这种lexer构建为JavaScript;由于转义字符,字符串文字标记将是最混乱的。您可以使用flex之类的lexer生成器,也可以手动使用即席处理和/或正则表达式(这是flex允许您以有组织的方式完成的)。通过这种方式,您可以处理空白以帮助跟踪列号,并捕获注释以便可以复制它们

如果您使用flex,则可以提供一些代码,以便在识别每个令牌时执行;那会吐出你的html。如果您通过特别的方法构建lexer,您仍然会有分散的HTML生成机会


如果你想快速启动这个过程,你可能需要开源解析器的源代码,扔掉解析器部分,然后修复lexer部分。

你可以使用类似的东西。YenvY:我从未使用过esprima,但它的文档表明这是它的预期用例之一。作为词法分析器运行时,可以要求它返回注释,但不能返回空格(afaik),因此您仍然需要从原始字符串中提取空格。@rici是的,我现在知道怎么做了。有一些选项(esprima和babel/parser)可以在解析后提供所有令牌的数组。数组包含所有标记,包括标点符号、空格和标识符,我所要做的就是将这些标记与它们的“ranges”属性相关联,并根据它们的文本值从标识符中提取关键字。评论是单独提供的,可以用同样的方式处理。你可以使用类似的东西来代替。YenvY:我从未使用过esprima,但它的文档表明这是它的预期用例之一。作为词法分析器运行时,可以要求它返回注释,但不能返回空格(afaik),因此您仍然需要从原始字符串中提取空格。@rici是的,我现在知道怎么做了。有一些选项(esprima和babel/parser)可以在解析后提供所有令牌的数组。数组包含所有标记,包括标点符号、空格和标识符,我所要做的就是将这些标记与它们的“ranges”属性相关联,并根据它们的文本值从标识符中提取关键字。评论是单独提供的,可以用同样的方式处理。评论在一个ESTree中是如何容纳的?@rici他们不是itSo的一部分,所以它不提供OP想要的东西,对吗?@rici它仍然提供,任何不在树中的东西都是评论。评论是如何在ESTree中容纳的?@rici它们不是它的一部分,所以它不提供OP想要的东西,对吗?@rici它仍然提供,任何