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
Readable-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/readable-discuss

Reply via email to