Thomas Beale wrote:

> archetype_id: qualified_rm_entity ?.? domain_concept ?.? version_id
>
> qualified_rm_entity: rm_originator ?-? rm_name ?-? rm_entity
> rm_originator: V_NAME
> rm_name: V_NAME
> rm_entity: V_NAME
>
> domain_concept: concept_name { ?-? specialisation }
> concept_name: V_NAME
> specialisation: V_NAME
>
> version_id: ?v? V_NONZERO_DIGIT [ V_NUMBER ] [ ?.? V_NUMBER [ ?.?
> V_NUMBER ] ]
>
> V_NONZERO_DIGIT: [1-9]
> V_DIGIT: [0-9]
> V_NUMBER: [0-9]*
> V_NAME: [a-zA-Z][a-zA-Z0-9_]+
>
>
> The PERL regular expression equivalent of the above is as follows:
> [a-zA-Z]\w+(-[a-zA-Z]\w+){2}\.[a-zA-Z]\w+(-[a-zA-Z]\w+)*\.v[1-9]\d*(\.\d+){0,2}


This all looks correct to me now, Thomas, except for the version_id 
production rule:

?v? V_NONZERO_DIGIT [ V_NUMBER ] [ ?.? V_NUMBER [ ?.? V_NUMBER ] ]

I considered but rejected this idea, because it permits amputated version 
numbers such as these:

    v1.
    v1..
    v1..1
    v1.1.

I abandoned the "V_NUMBER" idea because it allows the two optional suffixes 
to have no digits! You could of course fix that by redefining V_NUMBER like 
so:

V_NUMBER: [0-9]+

But then it would force you to start with a two-digit version number. v1, v2 
through to v9 would all be illegal versions. Not good!

My solution is a bit tedious, but at least it is (I believe) correct:

'v' V_NONZERO_DIGIT { V_DIGIT } [ '.' V_DIGIT { V_DIGIT } ] [ '.' V_DIGIT 
{ V_DIGIT } ]
V_DIGIT: [0-9]
V_NONZERO_DIGIT: [1-9]

Or, if you prefer to nest the second optional part, you could do this:

'v' V_NONZERO_DIGIT { V_DIGIT } [ '.' V_DIGIT { V_DIGIT } [ '.' V_DIGIT { 
V_DIGIT } ] ]

Both are correct, but I personally find the flattened out rule a bit easier 
to read.

Can someone think of something simpler that is still correct?

- Peter 



Reply via email to