[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 <xah...@gmail.com> wrote:
> On Dec 17, 10:22 am, Helmut Eller <eller.hel...@gmail.com> 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/
>
> ☄
- Re: how to use parsing expressing grammar,
Xah Lee <=
Re: how to use parsing expressing grammar, ashishnkadakia, 2008/12/24