2024 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面以了解更多关于此功能的信息。

0
Libs

我正尝试编写一个基于 s-表达式语言的解析器。它有通用的 ; 到行尾的注释。我的问题是我不想删除注释(我的原始目标是编写一个美化符/格式化器),而注释可以出现在代码的任何地方。

例如,我可以有

;; pretty normal -- this function does blah blah blah
(define-private (blah)
  ;; TODO: do something useful here
  (= 23 5))

(define-private ;; make this public maybe?
  (blah)
  (let (
    (enigma 23) ;; snicker
    (laws ;; this is a terrible example
      5))
    ;; inside the let body
   (= enigma 
    ;; todo: constant folding?
    laws)))

我该如何让 instaparse 处理这种情况呢?

删除注释很简单 —— 我可以使用类似这样的方法

(defparser ws-or-comments
  "ws-or-comments = #'\\s+' | comment+
   comment = #';+[^\n]*'
" :auto-whitespace :standard)

(defparser my-parser ... :auto-whitespace ws-or-comments)

1 回答

0

我一直致力于编写 instaparse 语法来处理 lua(最终为它编写了一个小的分析器和优化编译器)。

我遇到了关于注释(内联和块)的类似问题。我在语法中已经定义了注释,以便它们可以解析进入数据结构。

https://github.com/joinr/bpdb/blob/master/src/bpdb/core.clj#L116

现在我面临一个不太有趣的任务,即防止解析 —— (注释语法)作为两个一元运算符"---"。在 s-表达式语言中,您应该不会有这样的问题。我仍在学习 instaparse,经验不多。可能还有更好的答案。

另一个想法是进行两遍解析;第一遍删除注释,但保留它们以供打印,第二遍解析“普通”代码。

...