4

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

だから、私の質問は:誰かが私の文法の何が悪いのかを見つけることができますか?私はすべてアイデアが足りず、数日間それを見つめています。恥ずかしいほどシンプルなものだと思いますが、見えません!

前もって感謝します。

4

1 に答える 1

4

:Samplesルールはを消費し、:Body空に:Fileすることができ、入力の終わりは:$notでマークする必要があり\$ます。修正された文法は次のとおりです。

(def g                                                                                                                                                                  
  {                                                                                                                                                                     
   :Whitespace '(| \space \tab \, :Comment)                                                                                                                             
   :n* '(* (| \newline :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) (* (% \newline))]                                                                                                                               
   :Body [\B \o \d \y \: \newline '(* :Pattern)]                                                                                                                        
   :Pattern [:_* :Name \: :_* '(* (| \/ \-)) '(| \newline :$)]                                                                                                          
   :Document [:n* :BPM :n* :Samples :n* :Body :n* :$]                                                                                                                   
   })

;; sample.orc contains the example input from the question text
(pprint (a/pegasus :Document g (a/wrap-string (slurp "sample.orc"))))

;; output:
{:Document
 [{:n*
   ({:Comment [\# (\space \T \e \s \t \space \L \o \o \p) \newline]}
    {:Comment
     [\#
      (\space
       \t
       \h
       \i
       \s
       \space
       \i
       \s
       \space
       \a
       \space
       \c
       \o
       \m
       \m
       \e
       \n
       \t)
      \newline]}
    \newline)}
  {:BPM
   [\B
    \P
    \M
    \:
    {:_* {:Whitespace \space}}
    {:Number ({:Digit \1} {:Digit \0} {:Digit \0})}
    \newline]}
  {:n* \newline}
  {:Samples
   [\S
    \a
    \m
    \p
    \l
    \e
    \s
    \:
    \newline
    ({:SampleDef
      [{:_* {:Whitespace \space}}
       {:Name [\B \D]}
       \:
       {:_* {:Whitespace \space}}
       {:File [\b (\d \. \w \a \v)]}
       \newline]}
     {:SampleDef
      [{:_* {:Whitespace \space}}
       {:Name [\S \D]}
       \:
       {:_* {:Whitespace \space}}
       {:File [\s (\d \. \w \a \v)]}
       \newline]}
     {:SampleDef
      [{:_* ()}
       {:Name [\C (\H \H)]}
       \:
       {:_* {:Whitespace \space}}
       {:File [\c (\h \h \. \w \a \v)]}
       \newline]}
     {:SampleDef
      [{:_* ()}
       {:Name [\C (\S \H)]}
       \:
       {:_* {:Whitespace \space}}
       {:File [\c (\s \h \. \w \a \v)]}
       \newline]})]}
  {:n* \newline}
  {:Body
   [\B
    \o
    \d
    \y
    \:
    \newline
    ({:Pattern
      [{:_* {:Whitespace \space}}
       {:Name [\B \D]}
       \:
       {:_* {:Whitespace \space}}
       (\/ \- \- \- \/ \- \- \- \/ \- \- \- \/ \- \- \-)
       \newline]}
     {:Pattern
      [{:_* {:Whitespace \space}}
       {:Name [\S \D]}
       \:
       {:_* {:Whitespace \space}}
       (\- \- \- \/ \- \- \/ \- \- \/ \- \/ \- \- \/ \-)
       \newline]}
     {:Pattern
      [{:_* ()}
       {:Name [\C (\H \H)]}
       \:
       {:_* {:Whitespace \space}}
       (\- \- \/ \- \- \- \/ \- \- \- \/ \- \- \- \/ \-)
       \newline]}
     {:Pattern
      [{:_* ()}
       {:Name [\C (\S \H)]}
       \:
       {:_* {:Whitespace \space}}
       (\/ \- \- \- \- \- \- \- \- \- \- \- \- \- \- \-)
       \newline]})]}
  {:n*
   (\newline
    {:Comment
     [\#
      (\space
       \t
       \h
       \i
       \s
       \space
       \i
       \s
       \space
       \a
       \n
       \o
       \t
       \h
       \e
       \r
       \space
       \c
       \o
       \m
       \m
       \e
       \n
       \t)
      \newline]})}
  :$]}
于 2012-08-15T18:46:18.677 に答える