Here is the LL(1) grammar used to decode a subtreeSpecification as described by RFC 3672
<SubtreeSpecification> ::= '{' <spse> <base-e> <chopSpecification> <spse> <refinement-e> '}'
<base-e> ::=
«base» <sps> <localName> <spse> ',' <spse> |
e
<chopSpecification> ::= «chopSpecification» '{' <spse> <chopSpecification-in> '}'
<chopSpecification-in> ::=
«specificExclusions» <spse> <chop-set-of-choice> <spse> <specificExclusions-follower> |
«minimum» <sps> <number> <spse> <minimum-follower> |
«maximum» <sps> <number> <spse>
<specificExclusions-follower> ::=
',' <spse> «minimum» <sps> <number> <spse> <minimum-follower> |
',' <spse> «maximum» <sps> <number> <spse>
<minimum-follower> ::= ',' <spse> «maximum» <sps> <number> <spse>
<refinement-e> ::=
«specificationFilter» <sps> <refinement> |
e
<refinement> ::=
«item» <spse> ':' <spse> OID <spse> |
«and» <spse> ':' <spse> <set-of-refinement> |
«or» <spse> ':' <spse> <set-of-refinement> |
«not» <spse> ':' <spse> <refinement> |
<set-of-refinement> ::= '{' <spse> <refinement> <refinements> '}' <spse>
<refinements> ::=
',' <spse> <refinement> |
e
<localName> ::= '"' DN '"'