I'm trying to tweak the BNF language so that the BNF rules we give are simple
and clear (and easy to implement). I have a crazy idea that I think helps:
preventative productions.
File spec-almkglor.txt has some rules for defining our various extensions e.g.:
(i-expr lvl) -> SPLICE head eol-comment-lines
(if (= (length $2) 1)
(car $2)
$2)
The problem is that this kind of rule is ambiguous compared to this:
(i-expr lvl) -> head eol-comment-lines
(if (= (length $1) 1)
(car $1)
$1)
... because the obvious implementation of "head" would gobble up SPLICE. The
precedence rules in theory handle this, but fails when things are in a longer
sequence. E.G.:
a b $ c d
needs to have a completely different interpretation from:
a b {$} c d
With a "preventative production" I can clearly state that head must NOT consume
"$" and "\\", and then the i-expr rules stay much clearer, as shown below. I
also have an idea of how to implement this that's really simple, keeping the
whole code simple (and thus more likely to be actually correct).
Thoughts?
--- David A. Wheeler
========================
A preventative production is defined using "::=!" instead of "::=";
a preventative production defines a term
sequence that must <i>not</i> match a production of that name,
even if it would have otherwise (see below).
...
; A "head" is forbidden from including certain special markers.
; Preventative production definitions are not a normal feature of BNF.
; However, by specifying it this way, the BNF is much, much simpler;
; we can declare these cases here and then use these markers in the i-expr
; production.
; You can implement this, if "head" is a procedure, by having the procedure
; return two values, the "special marker" ('none if none) and list
; of head items up to (but not including) the marker.
; Note that these only match to the LITERAL characters; {$} doesn't match!
head ::=! DOLLAR terminate-n-expr
head ::=! BACKSLASH BACKSLASH terminate-n-expr
...
; Initial "\\" - ignore it.
i-expr ::= BACKSLASH BACKSLASH hspace+ i-expr
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Readable-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/readable-discuss