lilypond-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

precise input location


From: Nicolas Sceaux
Subject: precise input location
Date: Mon, 03 Jan 2005 20:56:30 +0100
User-agent: Gnus/5.1007 (Gnus v5.10.7) Emacs/21.3 (gnu/linux)

Hello,

While trying to write a protocol for parsing portions of LilyPond text,
typically for more interactive editing (a quick insert mode that
really works), I encoutered few problems wrt input locations. For
instance:

  guile> (lyp:print-parse-tree (lyp:parse-line "c8.\\f d16 e8 f g2"))
  [0-17] SequentialMusic "c8.\\f d16 e8 f g2"
      [0-5] EventChord "c8.\\f"
          [0-3] NoteEvent "c8."
          [3-5] AbsoluteDynamicEvent "\\f"
      [5-9] EventChord " d16"
          [5-9] NoteEvent " d16"
      [9-12] EventChord " e8"
          [9-12] NoteEvent " e8"
      [12-14] EventChord " f"
          [12-14] NoteEvent " f"
      [14-17] EventChord " g2"
          [14-17] NoteEvent " g2"

This works for basic examples like this one, but fails when markups,
or chords are encountered. Input locations are not accurate in the
following example:

  guile> (lyp:print-parse-tree (lyp:parse-line "c8.^\\markup foo d16"))
  [0-19] SequentialMusic "c8.^\\markup foo d16"
      [0-15] EventChord "c8.^\\markup foo"
          [0-13] NoteEvent "c8.^\\markup f"
          [13-15] TextScriptEvent "oo"
      [15-19] EventChord " d16"
          [15-19] NoteEvent " d16"
  guile> (mus:display (lyp:parse-string "c8.^\\markup foo d16"))
  (make-music 'SequentialMusic
    'origin #<location <string>:1:1>
    'elements (list
               (make-music 'EventChord
                 'origin #<location <string>:1:1>
                 'elements (list
                            (make-music 'NoteEvent
                              'origin #<location <string>:1:1>
                              'duration (ly:make-duration 3 1 1 1)
                              'pitch (ly:make-pitch -1 0 0))
                            (make-music 'TextScriptEvent
                              'direction 1
                              'origin #<location <string>:1:14>
                              'text (list
                                         simple-markup
                                         "foo"))))
               (make-music 'EventChord
                 'origin #<location <string>:1:16>
                 'elements (list
                            (make-music 'NoteEvent
                              'origin #<location <string>:1:16>
                              'duration (ly:make-duration 4 0 1 1)
                              'pitch (ly:make-pitch -1 1 0))))))

The 'origin property of chords (eg. <c e>) is not given at all:

  guile> (mus:display (lyp:parse-string "<c e>"))
  (make-music 'SequentialMusic
    'origin #<location <string>:1:1>
    'elements (list
               (make-music 'EventChord
                 'elements (list
                            (make-music 'NoteEvent
                              'duration (ly:make-duration 2 0 1 1)
                              'pitch (ly:make-pitch -1 0 0))
                            (make-music 'NoteEvent
                              'duration (ly:make-duration 2 0 1 1)
                              'pitch (ly:make-pitch -1 2 0))))))

Moreover, when parsing multi-line strings using
`ly:parser-parse-string', the line numbers in locations are always 1.

I would like to (try to) improve the way that locations are stored in
music expression (and maybe, if some switch is on, storing not only
the input beginning but also input end or the input string). Are there
things I should know about these problems? Maybe this is not really
doable?

I know you are busy with more important stuff, it's OK if you don't
have time to answer.

nicolas





reply via email to

[Prev in Thread] Current Thread [Next in Thread]