help-gnu-emacs
[Top][All Lists]
Advanced

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

Re: how to use parsing expressing grammar


From: Xah Lee
Subject: Re: how to use parsing expressing grammar
Date: Sat, 20 Dec 2008 00:42:18 -0800 (PST)
User-agent: G2/1.0

more questions on parsing expression grammar.

let's say i want to change tags of the form

“<img src="archimedesspiral.png">”

into

“<img src="★">”

I tried the following:

(defun doMyReplace ()
(interactive)
  (peg-parse
   (start imgTag)
  (imgTag "<img" whitespace "src=" "\"" (replace filePath "★") "\""
">")
  (whitespace [" "])
  (filePath [a-z "."])
   )
)

then placed my cursor at the beginning of the tag, then call
doMyReplace. It doesn't seems to work, except moving cursor to after
the “a”.

I spent about 20 min but couldn't see what's wrong with my code?

----------------

in general, i wanted to use PEG to do transformation from html 4
transitional to html 4 strict. I have maybe 3 hundred files to do
this. One of the primary change from html 4 trans to html 4 strict is
that any image tag now needs to be wrapped with “div”.

So basically,

<img ...>

needs to become

<div><img ...></div>

The first job i tried to do to as a simplification, is to try to write
a img tag matcher to test with. here's my code:

(defun doMyReplace ()
(interactive)
  (peg-parse
  (imgTag "<img" whitespace
 "src=" "\"" filePath "\"" whitespace
 "alt=" "\"" (replace altStr "★") "\"" whitespace
 "height=" "\"" digits "\"" whitespace
 "width=" "\"" digits "\""
 ">")
  (whitespace ["\n "])
  (digits [0-9])
  (filePath [A-Z a-z "./_"])
  (altStr [A-Z a-z "./ '"])
   )
)

but then couldn't get it to work.

Any help appreciated.

Btw, would you be interested in starting a mailing list on PEG in
emacs? e.g. yasnippet has one thru google, nxml has one in yahoo
group, ljupdate has one in livejournal. I think it'd be helpful.

  Xah
∑ http://xahlee.org/

☄

On Dec 19, 3:27 pm, Xah Lee <address@hidden> wrote:
> On Dec 17, 10:22 am, Helmut Eller <address@hidden> wrote:
>
>
>
> > * Helmut Eller [2008-12-17 16:21+0100] writes:
>
> > > Recording positions in this manner is obviously tedious and it just
> > > shows that the package hasn't received much battle testing.  As a little
> > > improvement we could define a custom "region" operator which acts
> > > similarly as the *list operator, but instead of collecting a list we
> > > push the start and end positions.  E.g.:
>
> > I released a new version of peg.el and added a replace operator.
> > We can now match and replace without helper function:
>
> > (defun parse3 ()
> >   (peg-parse
> >    (start _ "<hr>" _ title _ ul)
> >    (title "<p>" (replace (* (not "</p>") (any)) "See also:") "</p>")
> >    (ul (replace "<ul>" "<p>") _ (*list li _) (replace "</ul>" "</p>"))
> >    (li (replace "<li>" "") (* (not "</li>") (any)) (replace "</li>" "<br>"))
> >    (_ (* (or whitespace comment)))
> >    (whitespace ["\n\t "])
> >    (comment "<-- " (* (not "-->") (any)) "-->")))
>
> > Helmut.
>
> Holy cow. This worked! LOL!
>
> Thanks!
>
>   Xah
>http://xahlee.org/
>
>



reply via email to

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