2024 Clojure 发展状况调查 中分享您的想法!

欢迎!请查看 关于 页面以了解更多如何使用本网站的信息。

0

我正在尝试编写一个基于 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

现在我有一个很无聊的任务,防止解析——(注释语法)作为两个一元负号 - - 操作符。但在 sexpr 语言中,你不太可能遇到这样的问题。我仍在学习 Instaparse,所以知识面比较有限。可能还有更好的答案。

另一个想法是将解析分为两步;第一步移除注释但保留它们以供打印,第二步解析“正常”代码。

...