Clojureとamotoenを使用して、ドラムループを記述するための単純な言語を解析する文法を作成しようとしています。言語は次のようになります:– </ p>
# Test Loop
# this is a comment
BPM: 100
Samples:
BD: bd.wav
SD: sd.wav
CHH: chh.wav
CSH: csh.wav
Body:
BD: /---/---/---/---
SD: ---/--/--/-/--/-
CHH: --/---/---/---/-
CSH: /---------------
# this is another comment
文法を次のように定義しました:– </ p>
(def g {
:Whitespace '(| \space \newline \tab \, :Comment)
:_* '(* :Whitespace)
:_ [:Whitespace '(* :Whitespace)]
:Comment [\# '(* (% \newline)) \newline]
:BPM [\B \P \M \: :_* '(* :Number) \newline]
:Number '(* :Digit)
:Digit (a/lpegs '| "0123456789")
:Samples [\S \a \m \p \l \e \s \: \newline '(* :SampleDef)]
:SampleDef [:_* :Name \: :_* :File \newline]
:Name '(* (% \:))
:File '(* (% \newline))
:Body [\B \o \d \y \: \newline '(* :Pattern)]
:Pattern [:_* :Name \: :_* '(* (| \/ \-)) '(| \newline \$)]
:Document [:_* :BPM :_* :Samples :_* :Body :_* \$]
})
pegasus
サンプルファイルの各部分を個別に呼び出すと、正しく解析されます。例:– </ p>
(pprint
(a/pegasus
:Body
g
(a/wrap-string
"Body:\n
BD: /---/---/---/---\n
SD: ---/--/--/-/--/-\n
CHH: --/---/---/---/-\n
CSH: /---------------\n")))
ただし、電話をかけると(pprint (a/pegasus :Document g (a/wrap-string (slurp "sample.orc"))))
、取得できるのは。だけですnil
。同様に、に(a/wrap-string (slurp "sample.orc"))
含まれるテキストを含む文字列に置き換える場合sample.orc
。
だから、私の質問は:誰かが私の文法の何が悪いのかを見つけることができますか?私はすべてアイデアが足りず、数日間それを見つめています。恥ずかしいほどシンプルなものだと思いますが、見えません!
前もって感謝します。