Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 我可以使用Instaparse或任何其他clojure库解析基于缩进的语言吗?_Parsing_Clojure - Fatal编程技术网

Parsing 我可以使用Instaparse或任何其他clojure库解析基于缩进的语言吗?

Parsing 我可以使用Instaparse或任何其他clojure库解析基于缩进的语言吗?,parsing,clojure,Parsing,Clojure,Instaparse或其他Clojure库可以用来解析基于缩进的语言吗?我见过使用Instaparse解析EBNF/ABNF中表示的语法的示例。有没有一种很好的方法可以使用它来解析Python之类的缩进感知语言?通常,要进行基于缩进的解析,需要做三件事: 扩展标记器,从每行的前导空格生成一个标记 处理令牌流,每行比较前导空格和 当前上下文并指示是增加还是减少(因此您需要更改 在每一行的开头都有一个标记,当缩进级别 (更改) 编写一个“普通”解析器,该解析器知道指示缩进变化的标记 水平 根据语

Instaparse或其他Clojure库可以用来解析基于缩进的语言吗?我见过使用Instaparse解析EBNF/ABNF中表示的语法的示例。有没有一种很好的方法可以使用它来解析Python之类的缩进感知语言?

通常,要进行基于缩进的解析,需要做三件事:

  • 扩展标记器,从每行的前导空格生成一个标记

  • 处理令牌流,每行比较前导空格和 当前上下文并指示是增加还是减少(因此您需要更改 在每一行的开头都有一个标记,当缩进级别 (更改)

  • 编写一个“普通”解析器,该解析器知道指示缩进变化的标记 水平

根据语言的不同,您可能需要从第三部分向第二部分反馈一些信息


我对instaparse一无所知(我回答的唯一原因是,人们在这样的问题上问“到目前为止你做了什么?”真的让我很恼火),所以你需要看看是否有办法将第二阶段放在标记器和解析器之间(我扫描了文档,它似乎没有任何东西可以为您完成第二部分,但您可以自己编写)。但它应该可以完成第一部分和第三部分。显然,您不是第一个遇到Instaparse问题的人

对于大多数解析器生成器,您可以使用自定义lexer解决此问题,使用@andrewcooke提出的方案的一些变体。但是,Instaparse的设计目的是避免需要lexer,因此不提供使用lexer的接口

这一缺陷在中特别提出,并被取代;在后者中,Instaparse作者建议了一种解决方法:

同时,您可能会采用一种变通方法。您可以将INDENT和DEDENT等标记映射到未使用的字符,然后将其重建为字符串,然后在此基础上运行instaparse。我认为ASCII字符0-8和11-31未使用,可以用作标记


这当然是一种可能性,尽管这是一种审美判断,判断这是否是“做了一些非常粗糙的事情”尽管如此,你还是可以写这样一篇黑客文章,希望在第10期问题解决后能将其删除。你可能想加入这个问题的讨论。

@chollida:我试图就这个问题获得建议,而不是做一些非常黑客的事。你不会得到黑客的东西,因为你发布了一点你试图完成的事情@octopusgrabbus:我不知道你的意思。在我看来,我的选择是手动滚动我自己的解析器(hacky),或使用语法分析器生成器,其中Instaparse似乎是最成熟的。但我根本不清楚如何在a/EBNF中表达基于缩进的语法,也不知道Instaparse是否是合适的工具。因此,问题就来了。通常在发布帖子时,发布一些代码是有帮助的,比如Instaparse.t的示例hanks,这很有帮助。我说的hacky,主要是指手动滚动解析器。这看起来很有希望,我会进一步研究。非常感谢。