1) I would question why we use 'V'? and 'P'* instead of 'V' and 'P' 'P'*. As written, it allows the V or P to be omitted entirely, but omission is already catered for by the
number term (as '.' fraction is optional)
2) If 'V'? becomes 'V' then clause ('#'* 'V'? integer) is invalid as it contradicts bullet #1 as
integer allows '#'.
3) Clause ('V'? integer) similarly, but it's redundant anyway as it is implied by the clause in 2)
4) Clause ('P'* integer) can be rewritten as ('P'
'P'* '0'* 0) which removes need for bullet #2
5) As you observe, bullets #3, #4 & #5 add nothing.
I think we can rewrite the syntax as below and remove all the bullets.
vpinteger := pinteger | (vinteger exponent?)
pinteger := ('P' 'P'* '0'* '0') | (integer 'P'* 'P' )
vinteger := ('#'* '0'* 'V' '0'* '0') | (integer
'V')
Note that I have avoided the obvious and more convenient use of 'X'+ because the + qualifier is not used elsewhere in Fig 4, I suspect to avoid confusion with the '+' symbol.
I would also suggest that the exponent term is incorrect. Surely you need at least an 'E' or a '+' .
exponent := ('E' | '+' | 'E+') '0'* '0'
And what does the text " - special Characters" and " - quote" signify in Fig 4?
Regards
Steve Hanson
IBM Integration, Hursley, UK
Architect, IBM DFDL
Co-Chair, OGF DFDL Working Group
tel:+44-7717-378890
Note: I work Tuesday to Friday