首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以使用Instaparse或任何其他clojure库来解析基于缩进的语言吗?

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

Stack Overflow用户
提问于 2013-05-28 03:49:16
回答 2查看 1K关注 0票数 11

是否可以使用Instaparse或其他Clojure库来解析基于缩进的语言?我见过使用Instaparse解析以EBNF/ABNF表示的语法的示例。有没有一种好的方法可以用它来解析像Python这样支持缩进的语言?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-28 06:14:08

显然,你不是第一个遇到Instaparse这个问题的人。

对于大多数解析器生成器,您可以使用自定义词法分析器来解决这个问题,使用@andrewcooke提出的方案的一些变体。然而,Instaparse的设计目的是避免对词法分析器的需要,因此没有提供使用词法分析器的接口。

这种不足是在issue 9中特别提出的,被issue 10取代;在后者中,Instaparse的作者建议了一种变通方法:

在此期间,您可能会采用一种变通方法。您可以将诸如INDENT和DEDENT之类的标记映射到未使用的字符,然后将其重新构建为字符串,然后对其运行instaparse。我认为ASCII字符0-8和11-31是未使用的,可以用作标记。

这当然是一种可能性,尽管这是一个美学判断,因为它是否“做了一些非常粗糙的事情”。尽管如此,你可以写一个这样的hack,希望一旦问题10得到解决,它就可以被移除。你可能想加入这个问题的讨论。

票数 10
EN

Stack Overflow用户

发布于 2013-05-28 04:17:37

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

  • 扩展了记号赋予器,使记号从每一行的前导空格开始
  • 处理记号流,将每行的前导空格与当前上下文进行比较,并指示是否增加或减少(因此,当缩进级别为“正常”解析器时,您将每行开头的记号更改为具有记号,该解析器可以识别指示缩进级别变化的记号。

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

我对instaparse一无所知(我回答的唯一原因是那些问“到目前为止你都试过什么了?”这样的问题真的让我很恼火),所以你需要看看是否有办法在记号赋予器和解析器之间放置第二阶段(我扫描了文档,它似乎没有为你完成第二部分的任何东西,但你可以自己写)。但是它应该能够完成第一部分和第三部分的工作。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16779676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档