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