001// $ANTLR 2.7.7 (20060906): "schema.g" -> "AntlrSchemaParser.java"$
002
003/*
004 *  Licensed to the Apache Software Foundation (ASF) under one
005 *  or more contributor license agreements.  See the NOTICE file
006 *  distributed with this work for additional information
007 *  regarding copyright ownership.  The ASF licenses this file
008 *  to you under the Apache License, Version 2.0 (the
009 *  "License"); you may not use this file except in compliance
010 *  with the License.  You may obtain a copy of the License at
011 *  
012 *    http://www.apache.org/licenses/LICENSE-2.0
013 *  
014 *  Unless required by applicable law or agreed to in writing,
015 *  software distributed under the License is distributed on an
016 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017 *  KIND, either express or implied.  See the License for the
018 *  specific language governing permissions and limitations
019 *  under the License. 
020 *  
021 */
022package org.apache.directory.shared.ldap.model.schema.syntaxes;
023
024import java.io.StringReader;
025import java.util.ArrayList;
026import java.util.HashMap;
027import java.util.List;
028import java.util.Map;
029
030import org.apache.directory.shared.ldap.model.schema.parsers.LdapComparatorDescription;
031import org.apache.directory.shared.ldap.model.schema.DITContentRule;
032import org.apache.directory.shared.ldap.model.schema.DITStructureRule;
033import org.apache.directory.shared.ldap.model.schema.LdapSyntax;
034import org.apache.directory.shared.ldap.model.schema.MatchingRule;
035import org.apache.directory.shared.ldap.model.schema.MatchingRuleUse;
036import org.apache.directory.shared.ldap.model.schema.NameForm;
037import org.apache.directory.shared.ldap.model.schema.parsers.NormalizerDescription;
038import org.apache.directory.shared.ldap.model.schema.parsers.ParserMonitor;
039import org.apache.directory.shared.ldap.model.schema.AttributeType;
040import org.apache.directory.shared.ldap.model.schema.ObjectClass;
041import org.apache.directory.shared.ldap.model.schema.parsers.SyntaxCheckerDescription;
042import org.apache.directory.shared.ldap.model.schema.syntaxCheckers.OpenLdapObjectIdentifierMacro;
043import org.apache.directory.shared.ldap.model.schema.ObjectClassTypeEnum;
044import org.apache.directory.shared.ldap.model.schema.UsageEnum;
045
046
047import antlr.TokenBuffer;
048import antlr.TokenStreamException;
049import antlr.TokenStreamIOException;
050import antlr.ANTLRException;
051import antlr.LLkParser;
052import antlr.Token;
053import antlr.TokenStream;
054import antlr.RecognitionException;
055import antlr.NoViableAltException;
056import antlr.MismatchedTokenException;
057import antlr.SemanticException;
058import antlr.ParserSharedInputState;
059import antlr.collections.impl.BitSet;
060
061/**
062 * An antlr generated schema main parser.
063 *
064 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
065 */
066public class AntlrSchemaParser extends antlr.LLkParser       implements AntlrSchemaTokenTypes
067 {
068
069    private ParserMonitor monitor = null;
070    private boolean isQuirksModeEnabled = false;
071    public void setParserMonitor( ParserMonitor monitor )
072    {
073        this.monitor = monitor;
074    }
075    private void matchedProduction( String msg )
076    {
077        if ( null != monitor )
078        {
079            monitor.matchedProduction( msg );
080        }
081    }
082    public void setQuirksMode( boolean enabled )
083    {
084        this.isQuirksModeEnabled = enabled;
085    }
086    public boolean isQuirksMode()
087    {
088        return this.isQuirksModeEnabled;
089    }
090    static class Extension
091    {
092        String key = "";
093        List<String> values = new ArrayList<String>();
094        
095        public void addValue( String value )
096        {
097            this.values.add( value );
098        }
099    }
100    static class NoidLen
101    {
102        String noid = "";
103        long len = 0L;
104    }
105    static class ElementTracker
106    {
107        Map<String, Integer> elementMap = new HashMap<String, Integer>();
108        void track(String element, Token token) throws SemanticException 
109        {
110            if(elementMap.containsKey(element))
111            {
112                throw new SemanticException( element + " appears twice.", token.getFilename(), token.getLine() , token.getColumn() );
113            }
114            elementMap.put(element, Integer.valueOf(1));
115        }
116        boolean contains(String element) 
117        {
118            return elementMap.containsKey(element);
119        }
120    }
121
122
123protected AntlrSchemaParser(TokenBuffer tokenBuf, int k) {
124  super(tokenBuf,k);
125  tokenNames = _tokenNames;
126}
127
128public AntlrSchemaParser(TokenBuffer tokenBuf) {
129  this(tokenBuf,3);
130}
131
132protected AntlrSchemaParser(TokenStream lexer, int k) {
133  super(lexer,k);
134  tokenNames = _tokenNames;
135}
136
137public AntlrSchemaParser(TokenStream lexer) {
138  this(lexer,3);
139}
140
141public AntlrSchemaParser(ParserSharedInputState state) {
142  super(state,3);
143  tokenNames = _tokenNames;
144}
145
146        public final List<Object>  openLdapSchema() throws RecognitionException, TokenStreamException {
147                List<Object> list = new ArrayList<Object>();
148                
149                
150                AttributeType attributeType = null;
151                ObjectClass objectClass = null;
152                OpenLdapObjectIdentifierMacro oloid = null;
153                
154                
155                {
156                _loop155:
157                do {
158                        switch ( LA(1)) {
159                        case OBJECTIDENTIFIER:
160                        {
161                                oloid=openLdapObjectIdentifier();
162                                list.add( oloid );
163                                break;
164                        }
165                        case ATTRIBUTETYPE:
166                        {
167                                attributeType=openLdapAttributeType();
168                                list.add( attributeType );
169                                break;
170                        }
171                        case OBJECTCLASS:
172                        {
173                                objectClass=openLdapObjectClass();
174                                list.add( objectClass );
175                                break;
176                        }
177                        default:
178                        {
179                                break _loop155;
180                        }
181                        }
182                } while (true);
183                }
184                return list;
185        }
186        
187        public final OpenLdapObjectIdentifierMacro  openLdapObjectIdentifier() throws RecognitionException, TokenStreamException {
188                OpenLdapObjectIdentifierMacro oloid;
189                
190                Token  oi = null;
191                
192                matchedProduction( "openLdapObjectIdentifier()" );
193                
194                
195                {
196                oi = LT(1);
197                match(OBJECTIDENTIFIER);
198                
199                String[] nameAndValue = oi.getText().split( " " );
200                oloid = new OpenLdapObjectIdentifierMacro();
201                oloid.setName( nameAndValue[0] );
202                oloid.setRawOidOrNameSuffix( nameAndValue[1] );
203                
204                }
205                return oloid;
206        }
207        
208        public final AttributeType  openLdapAttributeType() throws RecognitionException, TokenStreamException {
209                AttributeType attributeType;
210                
211                
212                matchedProduction( "openLdapAttributeType()" );
213                
214                
215                {
216                match(ATTRIBUTETYPE);
217                {
218                attributeType=attributeTypeDescription();
219                }
220                }
221                return attributeType;
222        }
223        
224        public final ObjectClass  openLdapObjectClass() throws RecognitionException, TokenStreamException {
225                ObjectClass objectClass;
226                
227                
228                matchedProduction( "openLdapObjectClass()" );
229                
230                
231                {
232                match(OBJECTCLASS);
233                {
234                objectClass=objectClassDescription();
235                }
236                }
237                return objectClass;
238        }
239        
240/**
241     * Production for matching object class descriptions. It is fault-tolerant
242     * against element ordering.
243     *
244     * <pre>
245     * ObjectClassDescription = LPAREN WSP
246     *     numericoid                 ; object identifier
247     *     [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
248     *     [ SP "DESC" SP qdstring ]  ; description
249     *     [ SP "OBSOLETE" ]          ; not active
250     *     [ SP "SUP" SP oids ]       ; superior object classes
251     *     [ SP kind ]                ; kind of class
252     *     [ SP "MUST" SP oids ]      ; attribute types
253     *     [ SP "MAY" SP oids ]       ; attribute types
254     *     extensions WSP RPAREN
255     *
256     * kind = "ABSTRACT" / "STRUCTURAL" / "AUXILIARY"
257     * 
258     * extensions = *( SP xstring SP qdstrings )
259     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
260     * </pre>
261    */
262        public final ObjectClass  objectClassDescription() throws RecognitionException, TokenStreamException {
263                ObjectClass objectClass;
264                
265                Token  oid = null;
266                Token  name = null;
267                Token  desc = null;
268                Token  obsolete = null;
269                Token  sup = null;
270                Token  kind1 = null;
271                Token  kind2 = null;
272                Token  kind3 = null;
273                Token  must = null;
274                Token  may = null;
275                Token  extension = null;
276                
277                matchedProduction( "objectClassDescription()" );
278                ElementTracker et = new ElementTracker();
279                
280                
281                {
282                oid = LT(1);
283                match(STARTNUMERICOID);
284                objectClass = new ObjectClass(numericoid(oid.getText()));
285                }
286                {
287                _loop175:
288                do {
289                        switch ( LA(1)) {
290                        case NAME:
291                        {
292                                {
293                                name = LT(1);
294                                match(NAME);
295                                et.track("NAME", name); objectClass.setNames(qdescrs(name.getText()));
296                                }
297                                break;
298                        }
299                        case DESC:
300                        {
301                                {
302                                desc = LT(1);
303                                match(DESC);
304                                et.track("DESC", desc); objectClass.setDescription(qdstring(desc.getText()));
305                                }
306                                break;
307                        }
308                        case OBSOLETE:
309                        {
310                                {
311                                obsolete = LT(1);
312                                match(OBSOLETE);
313                                et.track("OBSOLETE", obsolete); objectClass.setObsolete( true );
314                                }
315                                break;
316                        }
317                        case SUP:
318                        {
319                                {
320                                sup = LT(1);
321                                match(SUP);
322                                et.track("SUP", sup); objectClass.setSuperiorOids(oids(sup.getText()));
323                                }
324                                break;
325                        }
326                        case ABSTRACT:
327                        case STRUCTURAL:
328                        case AUXILIARY:
329                        {
330                                {
331                                switch ( LA(1)) {
332                                case ABSTRACT:
333                                {
334                                        kind1 = LT(1);
335                                        match(ABSTRACT);
336                                        et.track("KIND", kind1); objectClass.setType( ObjectClassTypeEnum.ABSTRACT );
337                                        break;
338                                }
339                                case STRUCTURAL:
340                                {
341                                        kind2 = LT(1);
342                                        match(STRUCTURAL);
343                                        et.track("KIND", kind2); objectClass.setType( ObjectClassTypeEnum.STRUCTURAL );
344                                        break;
345                                }
346                                case AUXILIARY:
347                                {
348                                        kind3 = LT(1);
349                                        match(AUXILIARY);
350                                        et.track("KIND", kind3); objectClass.setType( ObjectClassTypeEnum.AUXILIARY );
351                                        break;
352                                }
353                                default:
354                                {
355                                        throw new NoViableAltException(LT(1), getFilename());
356                                }
357                                }
358                                }
359                                break;
360                        }
361                        case MUST:
362                        {
363                                {
364                                must = LT(1);
365                                match(MUST);
366                                et.track("MUST", must); objectClass.setMustAttributeTypeOids(oids(must.getText()));
367                                }
368                                break;
369                        }
370                        case MAY:
371                        {
372                                {
373                                may = LT(1);
374                                match(MAY);
375                                et.track("MAY", may); objectClass.setMayAttributeTypeOids(oids(may.getText()));
376                                }
377                                break;
378                        }
379                        case EXTENSION:
380                        {
381                                {
382                                extension = LT(1);
383                                match(EXTENSION);
384                                
385                                Extension ex = extension(extension.getText());
386                                et.track(ex.key, extension); 
387                                objectClass.addExtension(ex.key, ex.values); 
388                                
389                                }
390                                break;
391                        }
392                        default:
393                        {
394                                break _loop175;
395                        }
396                        }
397                } while (true);
398                }
399                match(RPAR);
400                return objectClass;
401        }
402        
403/**
404     * Production for matching attribute type descriptions. It is fault-tolerant
405     * against element ordering.
406     *
407     * <pre>
408     * AttributeTypeDescription = LPAREN WSP
409     *     numericoid                    ; object identifier
410     *     [ SP "NAME" SP qdescrs ]      ; short names (descriptors)
411     *     [ SP "DESC" SP qdstring ]     ; description
412     *     [ SP "OBSOLETE" ]             ; not active
413     *     [ SP "SUP" SP oid ]           ; supertype
414     *     [ SP "EQUALITY" SP oid ]      ; equality matching rule
415     *     [ SP "ORDERING" SP oid ]      ; ordering matching rule
416     *     [ SP "SUBSTR" SP oid ]        ; substrings matching rule
417     *     [ SP "SYNTAX" SP noidlen ]    ; value syntax
418     *     [ SP "SINGLE-VALUE" ]         ; single-value
419     *     [ SP "COLLECTIVE" ]           ; collective
420     *     [ SP "NO-USER-MODIFICATION" ] ; not user modifiable
421     *     [ SP "USAGE" SP usage ]       ; usage
422     *     extensions WSP RPAREN         ; extensions
423     * 
424     * usage = "userApplications"     /  ; user
425     *         "directoryOperation"   /  ; directory operational
426     *         "distributedOperation" /  ; DSA-shared operational
427     *         "dSAOperation"            ; DSA-specific operational     
428     * 
429     * extensions = *( SP xstring SP qdstrings )
430     * xstring = "X" HYPHEN 1*( ALPHA / HYPHEN / USCORE ) 
431     * </pre>
432    */
433        public final AttributeType  attributeTypeDescription() throws RecognitionException, TokenStreamException {
434                AttributeType attributeType;
435                
436                Token  oid = null;
437                Token  name = null;
438                Token  desc = null;
439                Token  obsolete = null;
440                Token  superior = null;
441                Token  equality = null;
442                Token  ordering = null;
443                Token  substring = null;
444                Token  syntax = null;
445                Token  singleValued = null;
446                Token  collective = null;
447                Token  noUserModification = null;
448                Token  usage1 = null;
449                Token  usage2 = null;
450                Token  usage3 = null;
451                Token  usage4 = null;
452                Token  extension = null;
453                
454                matchedProduction( "attributeTypeDescription()" );
455                ElementTracker et = new ElementTracker();
456                
457                
458                {
459                oid = LT(1);
460                match(STARTNUMERICOID);
461                attributeType = new AttributeType(numericoid(oid.getText()));
462                }
463                {
464                _loop194:
465                do {
466                        switch ( LA(1)) {
467                        case NAME:
468                        {
469                                {
470                                name = LT(1);
471                                match(NAME);
472                                et.track("NAME", name); attributeType.setNames(qdescrs(name.getText()));
473                                }
474                                break;
475                        }
476                        case DESC:
477                        {
478                                {
479                                desc = LT(1);
480                                match(DESC);
481                                et.track("DESC", desc); attributeType.setDescription(qdstring(desc.getText()));
482                                }
483                                break;
484                        }
485                        case OBSOLETE:
486                        {
487                                {
488                                obsolete = LT(1);
489                                match(OBSOLETE);
490                                et.track("OBSOLETE", obsolete); attributeType.setObsolete( true );
491                                }
492                                break;
493                        }
494                        case SUP:
495                        {
496                                {
497                                superior = LT(1);
498                                match(SUP);
499                                et.track("SUP", superior); attributeType.setSuperiorOid(oid(superior.getText()));
500                                }
501                                break;
502                        }
503                        case EQUALITY:
504                        {
505                                {
506                                equality = LT(1);
507                                match(EQUALITY);
508                                et.track("EQUALITY", equality); attributeType.setEqualityOid(oid(equality.getText()));
509                                }
510                                break;
511                        }
512                        case ORDERING:
513                        {
514                                {
515                                ordering = LT(1);
516                                match(ORDERING);
517                                et.track("ORDERING", ordering); attributeType.setOrderingOid(oid(ordering.getText()));
518                                }
519                                break;
520                        }
521                        case SUBSTR:
522                        {
523                                {
524                                substring = LT(1);
525                                match(SUBSTR);
526                                et.track("SUBSTR", substring); attributeType.setSubstringOid(oid(substring.getText()));
527                                }
528                                break;
529                        }
530                        case SYNTAX:
531                        {
532                                {
533                                syntax = LT(1);
534                                match(SYNTAX);
535                                
536                                et.track("SYNTAX", syntax); 
537                                NoidLen noidlen = noidlen(syntax.getText());
538                                attributeType.setSyntaxOid(noidlen.noid); 
539                                attributeType.setSyntaxLength(noidlen.len);
540                                
541                                }
542                                break;
543                        }
544                        case SINGLE_VALUE:
545                        {
546                                {
547                                singleValued = LT(1);
548                                match(SINGLE_VALUE);
549                                et.track("SINGLE_VALUE", singleValued); attributeType.setSingleValued( true );
550                                }
551                                break;
552                        }
553                        case COLLECTIVE:
554                        {
555                                {
556                                collective = LT(1);
557                                match(COLLECTIVE);
558                                et.track("COLLECTIVE", collective); attributeType.setCollective( true );
559                                }
560                                break;
561                        }
562                        case NO_USER_MODIFICATION:
563                        {
564                                {
565                                noUserModification = LT(1);
566                                match(NO_USER_MODIFICATION);
567                                et.track("NO_USER_MODIFICATION", noUserModification); attributeType.setUserModifiable( false );
568                                }
569                                break;
570                        }
571                        case USAGE:
572                        {
573                                {
574                                if ((LA(1)==USAGE) && (LA(2)==WHSP||LA(2)==USER_APPLICATIONS)) {
575                                        usage1 = LT(1);
576                                        match(USAGE);
577                                        {
578                                        _loop192:
579                                        do {
580                                                if ((LA(1)==WHSP)) {
581                                                        match(WHSP);
582                                                }
583                                                else {
584                                                        break _loop192;
585                                                }
586                                                
587                                        } while (true);
588                                        }
589                                        match(USER_APPLICATIONS);
590                                        et.track("USAGE", usage1); attributeType.setUsage( UsageEnum.USER_APPLICATIONS );
591                                }
592                                else if ((LA(1)==USAGE) && (LA(2)==DIRECTORY_OPERATION)) {
593                                        usage2 = LT(1);
594                                        match(USAGE);
595                                        match(DIRECTORY_OPERATION);
596                                        et.track("USAGE", usage2); attributeType.setUsage( UsageEnum.DIRECTORY_OPERATION );
597                                }
598                                else if ((LA(1)==USAGE) && (LA(2)==DISTRIBUTED_OPERATION)) {
599                                        usage3 = LT(1);
600                                        match(USAGE);
601                                        match(DISTRIBUTED_OPERATION);
602                                        et.track("USAGE", usage3); attributeType.setUsage( UsageEnum.DISTRIBUTED_OPERATION );
603                                }
604                                else if ((LA(1)==USAGE) && (LA(2)==DSA_OPERATION)) {
605                                        usage4 = LT(1);
606                                        match(USAGE);
607                                        match(DSA_OPERATION);
608                                        et.track("USAGE", usage4); attributeType.setUsage( UsageEnum.DSA_OPERATION );
609                                }
610                                else {
611                                        throw new NoViableAltException(LT(1), getFilename());
612                                }
613                                
614                                }
615                                break;
616                        }
617                        case EXTENSION:
618                        {
619                                {
620                                extension = LT(1);
621                                match(EXTENSION);
622                                
623                                Extension ex = extension(extension.getText());
624                                et.track(ex.key, extension); 
625                                attributeType.addExtension(ex.key, ex.values); 
626                                
627                                }
628                                break;
629                        }
630                        default:
631                        {
632                                break _loop194;
633                        }
634                        }
635                } while (true);
636                }
637                match(RPAR);
638                
639                if( !isQuirksModeEnabled )
640                {
641                // semantic check: required elements
642                if( !et.contains("SYNTAX") && !et.contains("SUP") ) 
643                {
644                throw new SemanticException( "One of SYNTAX or SUP is required", null, 0, 0 );
645                }
646                
647                // COLLECTIVE requires USAGE userApplications
648                if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
649                {
650                throw new SemanticException( "COLLECTIVE requires USAGE userApplications", null, 0, 0 );
651                }
652                
653                // NO-USER-MODIFICATION requires an operational USAGE.
654                if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
655                {
656                throw new SemanticException( "NO-USER-MODIFICATION requires an operational USAGE", null, 0, 0 );
657                }
658                }
659                
660                return attributeType;
661        }
662        
663/**
664     * Production for matching ldap syntax descriptions. It is fault-tolerant
665     * against element ordering.
666     *
667     * <pre>
668     * SyntaxDescription = LPAREN WSP
669     *    numericoid                 ; object identifier
670     *    [ SP "DESC" SP qdstring ]  ; description
671     *    extensions WSP RPAREN      ; extensions
672     * </pre>
673    */
674        public final LdapSyntax  ldapSyntaxDescription() throws RecognitionException, TokenStreamException {
675                LdapSyntax ldapSyntax;
676                
677                Token  oid = null;
678                Token  name = null;
679                Token  desc = null;
680                Token  extension = null;
681                
682                matchedProduction( "ldapSyntaxDescription()" );
683                ElementTracker et = new ElementTracker();
684                
685                
686                {
687                oid = LT(1);
688                match(STARTNUMERICOID);
689                ldapSyntax = new LdapSyntax(numericoid(oid.getText()));
690                }
691                {
692                _loop201:
693                do {
694                        switch ( LA(1)) {
695                        case NAME:
696                        {
697                                {
698                                name = LT(1);
699                                match(NAME);
700                                et.track("NAME", name); ldapSyntax.setNames(qdescrs(name.getText()));
701                                }
702                                break;
703                        }
704                        case DESC:
705                        {
706                                {
707                                desc = LT(1);
708                                match(DESC);
709                                et.track("DESC", desc); ldapSyntax.setDescription(qdstring(desc.getText()));
710                                }
711                                break;
712                        }
713                        case EXTENSION:
714                        {
715                                {
716                                extension = LT(1);
717                                match(EXTENSION);
718                                
719                                Extension ex = extension(extension.getText());
720                                et.track(ex.key, extension); 
721                                ldapSyntax.addExtension(ex.key, ex.values); 
722                                
723                                }
724                                break;
725                        }
726                        default:
727                        {
728                                break _loop201;
729                        }
730                        }
731                } while (true);
732                }
733                match(RPAR);
734                return ldapSyntax;
735        }
736        
737/**
738     * Production for matching rule descriptions. It is fault-tolerant
739     * against element ordering.
740     *
741     * <pre>
742     * MatchingRuleDescription = LPAREN WSP
743     *    numericoid                 ; object identifier
744     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
745     *    [ SP "DESC" SP qdstring ]  ; description
746     *    [ SP "OBSOLETE" ]          ; not active
747     *    SP "SYNTAX" SP numericoid  ; assertion syntax
748     *    extensions WSP RPAREN      ; extensions
749     * </pre>
750    */
751        public final MatchingRule  matchingRuleDescription() throws RecognitionException, TokenStreamException {
752                MatchingRule matchingRule;
753                
754                Token  oid = null;
755                Token  name = null;
756                Token  desc = null;
757                Token  obsolete = null;
758                Token  syntax = null;
759                Token  extension = null;
760                
761                matchedProduction( "matchingRuleDescription()" );
762                ElementTracker et = new ElementTracker();
763                
764                
765                {
766                oid = LT(1);
767                match(STARTNUMERICOID);
768                matchingRule = new MatchingRule(numericoid(oid.getText()));
769                }
770                {
771                _loop210:
772                do {
773                        switch ( LA(1)) {
774                        case NAME:
775                        {
776                                {
777                                name = LT(1);
778                                match(NAME);
779                                et.track("NAME", name); matchingRule.setNames(qdescrs(name.getText()));
780                                }
781                                break;
782                        }
783                        case DESC:
784                        {
785                                {
786                                desc = LT(1);
787                                match(DESC);
788                                et.track("DESC", desc); matchingRule.setDescription(qdstring(desc.getText()));
789                                }
790                                break;
791                        }
792                        case OBSOLETE:
793                        {
794                                {
795                                obsolete = LT(1);
796                                match(OBSOLETE);
797                                et.track("OBSOLETE", obsolete); matchingRule.setObsolete( true );
798                                }
799                                break;
800                        }
801                        case SYNTAX:
802                        {
803                                {
804                                syntax = LT(1);
805                                match(SYNTAX);
806                                et.track("SYNTAX", syntax); matchingRule.setSyntaxOid(numericoid(syntax.getText()));
807                                }
808                                break;
809                        }
810                        case EXTENSION:
811                        {
812                                {
813                                extension = LT(1);
814                                match(EXTENSION);
815                                
816                                Extension ex = extension(extension.getText());
817                                et.track(ex.key, extension); 
818                                matchingRule.addExtension(ex.key, ex.values); 
819                                
820                                }
821                                break;
822                        }
823                        default:
824                        {
825                                break _loop210;
826                        }
827                        }
828                } while (true);
829                }
830                match(RPAR);
831                
832                if( !isQuirksModeEnabled )
833                {    
834                // semantic check: required elements
835                if( !et.contains("SYNTAX") ) {
836                throw new SemanticException( "SYNTAX is required", null, 0, 0 );
837                }
838                }
839                
840                return matchingRule;
841        }
842        
843/**
844     * Production for matching rule use descriptions. It is fault-tolerant
845     * against element ordering.
846     *
847     * <pre>
848     * MatchingRuleUseDescription = LPAREN WSP
849     *    numericoid                 ; object identifier
850     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
851     *    [ SP "DESC" SP qdstring ]  ; description
852     *    [ SP "OBSOLETE" ]          ; not active
853     *    SP "APPLIES" SP oids       ; attribute types
854     *    extensions WSP RPAREN      ; extensions
855     * </pre>
856    */
857        public final MatchingRuleUse  matchingRuleUseDescription() throws RecognitionException, TokenStreamException {
858                MatchingRuleUse matchingRuleUse;
859                
860                Token  oid = null;
861                Token  name = null;
862                Token  desc = null;
863                Token  obsolete = null;
864                Token  applies = null;
865                Token  extension = null;
866                
867                matchedProduction( "matchingRuleUseDescription()" );
868                ElementTracker et = new ElementTracker();
869                
870                
871                {
872                oid = LT(1);
873                match(STARTNUMERICOID);
874                matchingRuleUse = new MatchingRuleUse(numericoid(oid.getText()));
875                }
876                {
877                _loop219:
878                do {
879                        switch ( LA(1)) {
880                        case NAME:
881                        {
882                                {
883                                name = LT(1);
884                                match(NAME);
885                                et.track("NAME", name); matchingRuleUse.setNames(qdescrs(name.getText()));
886                                }
887                                break;
888                        }
889                        case DESC:
890                        {
891                                {
892                                desc = LT(1);
893                                match(DESC);
894                                et.track("DESC", desc); matchingRuleUse.setDescription(qdstring(desc.getText()));
895                                }
896                                break;
897                        }
898                        case OBSOLETE:
899                        {
900                                {
901                                obsolete = LT(1);
902                                match(OBSOLETE);
903                                et.track("OBSOLETE", obsolete); matchingRuleUse.setObsolete( true );
904                                }
905                                break;
906                        }
907                        case APPLIES:
908                        {
909                                {
910                                applies = LT(1);
911                                match(APPLIES);
912                                et.track("APPLIES", applies); matchingRuleUse.setApplicableAttributeOids(oids(applies.getText()));
913                                }
914                                break;
915                        }
916                        case EXTENSION:
917                        {
918                                {
919                                extension = LT(1);
920                                match(EXTENSION);
921                                
922                                Extension ex = extension(extension.getText());
923                                et.track(ex.key, extension); 
924                                matchingRuleUse.addExtension(ex.key, ex.values); 
925                                
926                                }
927                                break;
928                        }
929                        default:
930                        {
931                                break _loop219;
932                        }
933                        }
934                } while (true);
935                }
936                match(RPAR);
937                
938                if( !isQuirksModeEnabled )
939                {
940                // semantic check: required elements
941                if( !et.contains("APPLIES") ) {
942                throw new SemanticException( "APPLIES is required", null, 0, 0 );
943                }
944                }
945                
946                return matchingRuleUse;
947        }
948        
949/**
950     * Production for DIT content rule descriptions. It is fault-tolerant
951     * against element ordering.
952     *
953     * <pre>
954     * DITContentRuleDescription = LPAREN WSP
955     *    numericoid                 ; object identifier
956     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
957     *    [ SP "DESC" SP qdstring ]  ; description
958     *    [ SP "OBSOLETE" ]          ; not active
959     *    [ SP "AUX" SP oids ]       ; auxiliary object classes
960     *    [ SP "MUST" SP oids ]      ; attribute types
961     *    [ SP "MAY" SP oids ]       ; attribute types
962     *    [ SP "NOT" SP oids ]       ; attribute types
963     *    extensions WSP RPAREN      ; extensions
964     * </pre>
965    */
966        public final DITContentRule  ditContentRuleDescription() throws RecognitionException, TokenStreamException {
967                DITContentRule ditContentRule;
968                
969                Token  oid = null;
970                Token  name = null;
971                Token  desc = null;
972                Token  obsolete = null;
973                Token  aux = null;
974                Token  must = null;
975                Token  may = null;
976                Token  not = null;
977                Token  extension = null;
978                
979                matchedProduction( "ditContentRuleDescription()" );
980                ElementTracker et = new ElementTracker();
981                
982                
983                {
984                oid = LT(1);
985                match(STARTNUMERICOID);
986                ditContentRule = new DITContentRule(numericoid(oid.getText()));
987                }
988                {
989                _loop231:
990                do {
991                        switch ( LA(1)) {
992                        case NAME:
993                        {
994                                {
995                                name = LT(1);
996                                match(NAME);
997                                et.track("NAME", name); ditContentRule.setNames(qdescrs(name.getText()));
998                                }
999                                break;
1000                        }
1001                        case DESC:
1002                        {
1003                                {
1004                                desc = LT(1);
1005                                match(DESC);
1006                                et.track("DESC", desc); ditContentRule.setDescription(qdstring(desc.getText()));
1007                                }
1008                                break;
1009                        }
1010                        case OBSOLETE:
1011                        {
1012                                {
1013                                obsolete = LT(1);
1014                                match(OBSOLETE);
1015                                et.track("OBSOLETE", obsolete); ditContentRule.setObsolete( true );
1016                                }
1017                                break;
1018                        }
1019                        case AUX:
1020                        {
1021                                {
1022                                aux = LT(1);
1023                                match(AUX);
1024                                et.track("AUX", aux); ditContentRule.setAuxObjectClassOids(oids(aux.getText()));
1025                                }
1026                                break;
1027                        }
1028                        case MUST:
1029                        {
1030                                {
1031                                must = LT(1);
1032                                match(MUST);
1033                                et.track("MUST", must); ditContentRule.setMustAttributeTypeOids(oids(must.getText()));
1034                                }
1035                                break;
1036                        }
1037                        case MAY:
1038                        {
1039                                {
1040                                may = LT(1);
1041                                match(MAY);
1042                                et.track("MAY", may); ditContentRule.setMayAttributeTypeOids(oids(may.getText()));
1043                                }
1044                                break;
1045                        }
1046                        case NOT:
1047                        {
1048                                {
1049                                not = LT(1);
1050                                match(NOT);
1051                                et.track("NOT", not); ditContentRule.setNotAttributeTypeOids(oids(not.getText()));
1052                                }
1053                                break;
1054                        }
1055                        case EXTENSION:
1056                        {
1057                                {
1058                                extension = LT(1);
1059                                match(EXTENSION);
1060                                
1061                                Extension ex = extension(extension.getText());
1062                                et.track(ex.key, extension); 
1063                                ditContentRule.addExtension(ex.key, ex.values); 
1064                                
1065                                }
1066                                break;
1067                        }
1068                        default:
1069                        {
1070                                break _loop231;
1071                        }
1072                        }
1073                } while (true);
1074                }
1075                match(RPAR);
1076                return ditContentRule;
1077        }
1078        
1079/**
1080     * Production for DIT structure rules descriptions. It is fault-tolerant
1081     * against element ordering.
1082     *
1083     * <pre>
1084     * DITStructureRuleDescription = LPAREN WSP
1085     *   ruleid                     ; rule identifier
1086     *   [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
1087     *   [ SP "DESC" SP qdstring ]  ; description
1088     *   [ SP "OBSOLETE" ]          ; not active
1089     *   SP "FORM" SP oid           ; NameForm
1090     *   [ SP "SUP" ruleids ]       ; superior rules
1091     *   extensions WSP RPAREN      ; extensions
1092     *
1093     * ruleids = ruleid / ( LPAREN WSP ruleidlist WSP RPAREN )
1094     * ruleidlist = ruleid *( SP ruleid )
1095     * ruleid = number
1096     * </pre>
1097    */
1098        public final DITStructureRule  ditStructureRuleDescription() throws RecognitionException, TokenStreamException {
1099                DITStructureRule ditStructureRule;
1100                
1101                Token  ruleid = null;
1102                Token  name = null;
1103                Token  desc = null;
1104                Token  obsolete = null;
1105                Token  form = null;
1106                Token  sup = null;
1107                Token  extension = null;
1108                
1109                matchedProduction( "ditStructureRuleDescription()" );
1110                ElementTracker et = new ElementTracker();
1111                
1112                
1113                {
1114                ruleid = LT(1);
1115                match(STARTNUMERICOID);
1116                ditStructureRule = new DITStructureRule(ruleid(ruleid.getText()));
1117                }
1118                {
1119                _loop241:
1120                do {
1121                        switch ( LA(1)) {
1122                        case NAME:
1123                        {
1124                                {
1125                                name = LT(1);
1126                                match(NAME);
1127                                et.track("NAME", name); ditStructureRule.setNames(qdescrs(name.getText()));
1128                                }
1129                                break;
1130                        }
1131                        case DESC:
1132                        {
1133                                {
1134                                desc = LT(1);
1135                                match(DESC);
1136                                et.track("DESC", desc); ditStructureRule.setDescription(qdstring(desc.getText()));
1137                                }
1138                                break;
1139                        }
1140                        case OBSOLETE:
1141                        {
1142                                {
1143                                obsolete = LT(1);
1144                                match(OBSOLETE);
1145                                et.track("OBSOLETE", obsolete); ditStructureRule.setObsolete( true );
1146                                }
1147                                break;
1148                        }
1149                        case FORM:
1150                        {
1151                                {
1152                                form = LT(1);
1153                                match(FORM);
1154                                et.track("FORM", form); ditStructureRule.setForm(oid(form.getText()));
1155                                }
1156                                break;
1157                        }
1158                        case SUP:
1159                        {
1160                                {
1161                                sup = LT(1);
1162                                match(SUP);
1163                                et.track("SUP", sup); ditStructureRule.setSuperRules(ruleids(sup.getText()));
1164                                }
1165                                break;
1166                        }
1167                        case EXTENSION:
1168                        {
1169                                {
1170                                extension = LT(1);
1171                                match(EXTENSION);
1172                                
1173                                Extension ex = extension(extension.getText());
1174                                et.track(ex.key, extension); 
1175                                ditStructureRule.addExtension(ex.key, ex.values); 
1176                                
1177                                }
1178                                break;
1179                        }
1180                        default:
1181                        {
1182                                break _loop241;
1183                        }
1184                        }
1185                } while (true);
1186                }
1187                match(RPAR);
1188                
1189                if( !isQuirksModeEnabled )
1190                {
1191                // semantic check: required elements
1192                if( !et.contains("FORM") ) {
1193                throw new SemanticException( "FORM is required", null, 0, 0 );
1194                }
1195                }
1196                
1197                return ditStructureRule;
1198        }
1199        
1200/**
1201     * Production for name form descriptions. It is fault-tolerant
1202     * against element ordering.
1203     *
1204     * <pre>
1205     * NameFormDescription = LPAREN WSP
1206     *    numericoid                 ; object identifier
1207     *    [ SP "NAME" SP qdescrs ]   ; short names (descriptors)
1208     *    [ SP "DESC" SP qdstring ]  ; description
1209     *    [ SP "OBSOLETE" ]          ; not active
1210     *    SP "OC" SP oid             ; structural object class
1211     *    SP "MUST" SP oids          ; attribute types
1212     *    [ SP "MAY" SP oids ]       ; attribute types
1213     *    extensions WSP RPAREN      ; extensions
1214     * </pre>
1215    */
1216        public final NameForm  nameFormDescription() throws RecognitionException, TokenStreamException {
1217                NameForm nameForm;
1218                
1219                Token  oid = null;
1220                Token  name = null;
1221                Token  desc = null;
1222                Token  obsolete = null;
1223                Token  oc = null;
1224                Token  must = null;
1225                Token  may = null;
1226                Token  extension = null;
1227                
1228                matchedProduction( "nameFormDescription()" );
1229                ElementTracker et = new ElementTracker();
1230                
1231                
1232                {
1233                oid = LT(1);
1234                match(STARTNUMERICOID);
1235                nameForm = new NameForm(numericoid(oid.getText()));
1236                }
1237                {
1238                _loop252:
1239                do {
1240                        switch ( LA(1)) {
1241                        case NAME:
1242                        {
1243                                {
1244                                name = LT(1);
1245                                match(NAME);
1246                                et.track("NAME", name); nameForm.setNames(qdescrs(name.getText()));
1247                                }
1248                                break;
1249                        }
1250                        case DESC:
1251                        {
1252                                {
1253                                desc = LT(1);
1254                                match(DESC);
1255                                et.track("DESC", desc); nameForm.setDescription(qdstring(desc.getText()));
1256                                }
1257                                break;
1258                        }
1259                        case OBSOLETE:
1260                        {
1261                                {
1262                                obsolete = LT(1);
1263                                match(OBSOLETE);
1264                                et.track("OBSOLETE", obsolete); nameForm.setObsolete( true );
1265                                }
1266                                break;
1267                        }
1268                        case OC:
1269                        {
1270                                {
1271                                oc = LT(1);
1272                                match(OC);
1273                                et.track("OC", oc); nameForm.setStructuralObjectClassOid(oid(oc.getText()));
1274                                }
1275                                break;
1276                        }
1277                        case MUST:
1278                        {
1279                                {
1280                                must = LT(1);
1281                                match(MUST);
1282                                et.track("MUST", must); nameForm.setMustAttributeTypeOids(oids(must.getText()));
1283                                }
1284                                break;
1285                        }
1286                        case MAY:
1287                        {
1288                                {
1289                                may = LT(1);
1290                                match(MAY);
1291                                et.track("MAY", may); nameForm.setMayAttributeTypeOids(oids(may.getText()));
1292                                }
1293                                break;
1294                        }
1295                        case EXTENSION:
1296                        {
1297                                {
1298                                extension = LT(1);
1299                                match(EXTENSION);
1300                                
1301                                Extension ex = extension(extension.getText());
1302                                et.track(ex.key, extension); 
1303                                nameForm.addExtension(ex.key, ex.values); 
1304                                
1305                                }
1306                                break;
1307                        }
1308                        default:
1309                        {
1310                                break _loop252;
1311                        }
1312                        }
1313                } while (true);
1314                }
1315                match(RPAR);
1316                
1317                if( !isQuirksModeEnabled )
1318                {
1319                // semantic check: required elements
1320                if( !et.contains("MUST") ) {
1321                throw new SemanticException( "MUST is required", null, 0, 0 );
1322                }
1323                if( !et.contains("OC") ) {
1324                throw new SemanticException( "OC is required", null, 0, 0 );
1325                }
1326                
1327                // semantic check: MUST and MAY must be disjoint
1328                //List<String> aList = new ArrayList<String>( nfd.getMustAttributeTypes() );
1329                //aList.retainAll( nfd.getMayAttributeTypes() );
1330                //if( !aList.isEmpty() ) 
1331                //{
1332                //    throw new SemanticException( "MUST and MAY must be disjoint, "+aList.get( 0 )+" appears in both", null, 0, 0 );
1333                //}
1334                }
1335                
1336                return nameForm;
1337        }
1338        
1339/**
1340     * Production for comparator descriptions. It is fault-tolerant
1341     * against element ordering.
1342     *
1343     * <pre>
1344     * LdapComparator = LPAREN WSP
1345     *       numericoid                           ; object identifier
1346     *       [ SP "DESC" SP qdstring ]            ; description
1347     *       SP "FQCN" SP fqcn                    ; fully qualified class name
1348     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
1349     *       extensions WSP RPAREN                ; extensions
1350     * 
1351     * base64          = *(4base64-char)
1352     * base64-char     = ALPHA / DIGIT / "+" / "/"
1353     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
1354     * fqcnComponent = ???
1355     * </pre>
1356    */
1357        public final LdapComparatorDescription  ldapComparator() throws RecognitionException, TokenStreamException {
1358                LdapComparatorDescription lcd;
1359                
1360                Token  oid = null;
1361                Token  desc = null;
1362                Token  fqcn = null;
1363                Token  bytecode = null;
1364                Token  extension = null;
1365                
1366                matchedProduction( "ldapComparator()" );
1367                ElementTracker et = new ElementTracker();
1368                
1369                
1370                {
1371                oid = LT(1);
1372                match(STARTNUMERICOID);
1373                lcd = new LdapComparatorDescription(numericoid(oid.getText()));
1374                }
1375                {
1376                _loop260:
1377                do {
1378                        switch ( LA(1)) {
1379                        case DESC:
1380                        {
1381                                {
1382                                desc = LT(1);
1383                                match(DESC);
1384                                et.track("DESC", desc); lcd.setDescription(qdstring(desc.getText()));
1385                                }
1386                                break;
1387                        }
1388                        case FQCN:
1389                        {
1390                                {
1391                                fqcn = LT(1);
1392                                match(FQCN);
1393                                et.track("FQCN", fqcn); lcd.setFqcn(fqcn.getText());
1394                                }
1395                                break;
1396                        }
1397                        case BYTECODE:
1398                        {
1399                                {
1400                                bytecode = LT(1);
1401                                match(BYTECODE);
1402                                et.track("BYTECODE", bytecode); lcd.setBytecode(bytecode.getText());
1403                                }
1404                                break;
1405                        }
1406                        case EXTENSION:
1407                        {
1408                                {
1409                                extension = LT(1);
1410                                match(EXTENSION);
1411                                
1412                                Extension ex = extension(extension.getText());
1413                                et.track(ex.key, extension); 
1414                                lcd.addExtension(ex.key, ex.values); 
1415                                
1416                                }
1417                                break;
1418                        }
1419                        default:
1420                        {
1421                                break _loop260;
1422                        }
1423                        }
1424                } while (true);
1425                }
1426                match(RPAR);
1427                
1428                if( !isQuirksModeEnabled )
1429                {
1430                // semantic check: required elements
1431                if( !et.contains("FQCN") ) {
1432                throw new SemanticException( "FQCN is required", null, 0, 0 );
1433                }
1434                
1435                // semantic check: length should be divisible by 4
1436                if( ( lcd.getBytecode() != null ) && ( lcd.getBytecode().length() % 4 != 0 ) ) {
1437                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
1438                }
1439                }
1440                
1441                return lcd;
1442        }
1443        
1444/**
1445     * Production for normalizer descriptions. It is fault-tolerant
1446     * against element ordering.
1447     *
1448     * <pre>
1449     * NormalizerDescription = LPAREN WSP
1450     *       numericoid                           ; object identifier
1451     *       [ SP "DESC" SP qdstring ]            ; description
1452     *       SP "FQCN" SP fqcn                    ; fully qualified class name
1453     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
1454     *       extensions WSP RPAREN                ; extensions
1455     * 
1456     * base64          = *(4base64-char)
1457     * base64-char     = ALPHA / DIGIT / "+" / "/"
1458     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
1459     * fqcnComponent = ???
1460     * </pre>
1461    */
1462        public final NormalizerDescription  normalizerDescription() throws RecognitionException, TokenStreamException {
1463                NormalizerDescription nd;
1464                
1465                Token  oid = null;
1466                Token  desc = null;
1467                Token  fqcn = null;
1468                Token  bytecode = null;
1469                Token  extension = null;
1470                
1471                matchedProduction( "normalizerDescription()" );
1472                ElementTracker et = new ElementTracker();
1473                
1474                
1475                {
1476                oid = LT(1);
1477                match(STARTNUMERICOID);
1478                nd = new NormalizerDescription(numericoid(oid.getText()));
1479                }
1480                {
1481                _loop268:
1482                do {
1483                        switch ( LA(1)) {
1484                        case DESC:
1485                        {
1486                                {
1487                                desc = LT(1);
1488                                match(DESC);
1489                                et.track("DESC", desc); nd.setDescription(qdstring(desc.getText()));
1490                                }
1491                                break;
1492                        }
1493                        case FQCN:
1494                        {
1495                                {
1496                                fqcn = LT(1);
1497                                match(FQCN);
1498                                et.track("FQCN", fqcn); nd.setFqcn(fqcn.getText());
1499                                }
1500                                break;
1501                        }
1502                        case BYTECODE:
1503                        {
1504                                {
1505                                bytecode = LT(1);
1506                                match(BYTECODE);
1507                                et.track("BYTECODE", bytecode); nd.setBytecode(bytecode.getText());
1508                                }
1509                                break;
1510                        }
1511                        case EXTENSION:
1512                        {
1513                                {
1514                                extension = LT(1);
1515                                match(EXTENSION);
1516                                
1517                                Extension ex = extension(extension.getText());
1518                                et.track(ex.key, extension); 
1519                                nd.addExtension(ex.key, ex.values); 
1520                                
1521                                }
1522                                break;
1523                        }
1524                        default:
1525                        {
1526                                break _loop268;
1527                        }
1528                        }
1529                } while (true);
1530                }
1531                match(RPAR);
1532                
1533                if( !isQuirksModeEnabled )
1534                {
1535                // semantic check: required elements
1536                if( !et.contains("FQCN") ) {
1537                throw new SemanticException( "FQCN is required", null, 0, 0 );
1538                }
1539                
1540                // semantic check: length should be divisible by 4
1541                if( nd.getBytecode() != null && ( nd.getBytecode().length() % 4 != 0 ) ) {
1542                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
1543                }     
1544                }   
1545                
1546                return nd;
1547        }
1548        
1549/**
1550     * Production for syntax checker descriptions. It is fault-tolerant
1551     * against element ordering.
1552     *
1553     * <pre>
1554     * SyntaxCheckerDescription = LPAREN WSP
1555     *       numericoid                           ; object identifier
1556     *       [ SP "DESC" SP qdstring ]            ; description
1557     *       SP "FQCN" SP fqcn                    ; fully qualified class name
1558     *       [ SP "BYTECODE" SP base64 ]          ; optional base64 encoded bytecode
1559     *       extensions WSP RPAREN                ; extensions
1560     * 
1561     * base64          = *(4base64-char)
1562     * base64-char     = ALPHA / DIGIT / "+" / "/"
1563     * fqcn = fqcnComponent 1*( DOT fqcnComponent )
1564     * fqcnComponent = ???
1565     * </pre>
1566    */
1567        public final SyntaxCheckerDescription  syntaxCheckerDescription() throws RecognitionException, TokenStreamException {
1568                SyntaxCheckerDescription scd;
1569                
1570                Token  oid = null;
1571                Token  desc = null;
1572                Token  fqcn = null;
1573                Token  bytecode = null;
1574                Token  extension = null;
1575                
1576                matchedProduction( "syntaxCheckerDescription()" );
1577                ElementTracker et = new ElementTracker();
1578                
1579                
1580                {
1581                oid = LT(1);
1582                match(STARTNUMERICOID);
1583                scd = new SyntaxCheckerDescription(numericoid(oid.getText()));
1584                }
1585                {
1586                _loop276:
1587                do {
1588                        switch ( LA(1)) {
1589                        case DESC:
1590                        {
1591                                {
1592                                desc = LT(1);
1593                                match(DESC);
1594                                et.track("DESC", desc); scd.setDescription(qdstring(desc.getText()));
1595                                }
1596                                break;
1597                        }
1598                        case FQCN:
1599                        {
1600                                {
1601                                fqcn = LT(1);
1602                                match(FQCN);
1603                                et.track("FQCN", fqcn); scd.setFqcn(fqcn.getText());
1604                                }
1605                                break;
1606                        }
1607                        case BYTECODE:
1608                        {
1609                                {
1610                                bytecode = LT(1);
1611                                match(BYTECODE);
1612                                et.track("BYTECODE", bytecode); scd.setBytecode(bytecode.getText());
1613                                }
1614                                break;
1615                        }
1616                        case EXTENSION:
1617                        {
1618                                {
1619                                extension = LT(1);
1620                                match(EXTENSION);
1621                                
1622                                Extension ex = extension(extension.getText());
1623                                et.track(ex.key, extension); 
1624                                scd.addExtension(ex.key, ex.values); 
1625                                
1626                                }
1627                                break;
1628                        }
1629                        default:
1630                        {
1631                                break _loop276;
1632                        }
1633                        }
1634                } while (true);
1635                }
1636                match(RPAR);
1637                
1638                if( !isQuirksModeEnabled )
1639                {
1640                // semantic check: required elements
1641                if( !et.contains("FQCN") ) {
1642                throw new SemanticException( "FQCN is required", null, 0, 0 );
1643                }
1644                
1645                // semantic check: length should be divisible by 4
1646                if( scd.getBytecode() != null && ( scd.getBytecode().length() % 4 != 0 ) ) {
1647                throw new SemanticException( "BYTECODE must be divisible by 4", null, 0, 0 );
1648                }  
1649                }      
1650                
1651                return scd;
1652        }
1653        
1654        public final NoidLen  noidlen(
1655                String s
1656        ) throws RecognitionException, TokenStreamException {
1657                NoidLen noidlen;
1658                
1659                
1660                matchedProduction( "noidlen()" );
1661                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1662                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1663                parser.setParserMonitor(monitor);
1664                noidlen = isQuirksModeEnabled ? parser.quirksNoidlen() : parser.noidlen();
1665                
1666                
1667                return noidlen;
1668        }
1669        
1670        public final Extension  extension(
1671                String s
1672        ) throws RecognitionException, TokenStreamException {
1673                Extension extension;
1674                
1675                
1676                matchedProduction( "extension()" );
1677                AntlrSchemaExtensionLexer lexer = new AntlrSchemaExtensionLexer(new StringReader(s));
1678                AntlrSchemaExtensionParser parser = new AntlrSchemaExtensionParser(lexer);
1679                extension = parser.extension();
1680                
1681                
1682                return extension;
1683        }
1684        
1685        public final String  numericoid(
1686                String s
1687        ) throws RecognitionException, TokenStreamException {
1688                String numericoid;
1689                
1690                
1691                matchedProduction( "numericoid()");
1692                if(isQuirksModeEnabled)
1693                {
1694                numericoid = oid(s);
1695                }
1696                else
1697                {
1698                                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1699                                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1700                                parser.setParserMonitor(monitor);
1701                                numericoid = parser.numericoid();
1702                }
1703                
1704                
1705                return numericoid;
1706        }
1707        
1708        public final String  oid(
1709                String s
1710        ) throws RecognitionException, TokenStreamException {
1711                String oid;
1712                
1713                
1714                matchedProduction( "oid()" );
1715                List<String> oids = oids(s);
1716                if( oids.size() != 1 ) 
1717                {
1718                throw new SemanticException( "Exactly one OID expected", null, 0, 0 );
1719                }
1720                oid = oids.get(0);
1721                
1722                
1723                return oid;
1724        }
1725        
1726        public final List<String>  oids(
1727                String s
1728        ) throws RecognitionException, TokenStreamException {
1729                List<String> oids;
1730                
1731                
1732                matchedProduction( "oids()" );
1733                if(isQuirksModeEnabled)
1734                {
1735                oids = qdescrs(s);
1736                }
1737                else
1738                {
1739                                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1740                                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1741                                parser.setParserMonitor(monitor);
1742                                oids = parser.oids();
1743                            }
1744                
1745                
1746                return oids;
1747        }
1748        
1749        public final String  qdescr(
1750                String s
1751        ) throws RecognitionException, TokenStreamException {
1752                String qdescr;
1753                
1754                
1755                matchedProduction( "qdescr()" );
1756                List<String> qdescrs = qdescrs(s);
1757                if( qdescrs.size() != 1 ) 
1758                {
1759                throw new SemanticException( "Exactly one qdescrs expected", null, 0, 0 );
1760                }
1761                qdescr = qdescrs.get(0);
1762                
1763                
1764                return qdescr;
1765        }
1766        
1767        public final List<String>  qdescrs(
1768                String s
1769        ) throws RecognitionException, TokenStreamException {
1770                List<String> qdescrs;
1771                
1772                
1773                matchedProduction( "qdescrs()" );
1774                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1775                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1776                parser.setParserMonitor(monitor);
1777                qdescrs = isQuirksModeEnabled ? parser.quirksQdescrs() : parser.qdescrs();
1778                
1779                
1780                return qdescrs;
1781        }
1782        
1783        public final String  qdstring(
1784                String s
1785        ) throws RecognitionException, TokenStreamException {
1786                String qdstring;
1787                
1788                
1789                matchedProduction( "qdstring()" );
1790                List<String> qdstrings = qdstrings(s);
1791                if( qdstrings.size() != 1 ) 
1792                {
1793                throw new SemanticException( "Exactly one qdstrings expected", null, 0, 0 );
1794                }
1795                qdstring = qdstrings.get(0);
1796                
1797                
1798                return qdstring;
1799        }
1800        
1801        public final List<String>  qdstrings(
1802                String s
1803        ) throws RecognitionException, TokenStreamException {
1804                List<String> qdstrings;
1805                
1806                
1807                matchedProduction( "qdstrings()" );
1808                AntlrSchemaQdstringLexer lexer = new AntlrSchemaQdstringLexer(new StringReader(s));
1809                AntlrSchemaQdstringParser parser = new AntlrSchemaQdstringParser(lexer);
1810                parser.setParserMonitor(monitor);
1811                qdstrings = parser.qdstrings();
1812                
1813                
1814                return qdstrings;
1815        }
1816        
1817        public final Integer  ruleid(
1818                String s
1819        ) throws RecognitionException, TokenStreamException {
1820                Integer ruleid;
1821                
1822                
1823                matchedProduction( "ruleid()" );
1824                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1825                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1826                parser.setParserMonitor(monitor);
1827                ruleid = parser.ruleid();
1828                
1829                
1830                return ruleid;
1831        }
1832        
1833        public final List<Integer>  ruleids(
1834                String s
1835        ) throws RecognitionException, TokenStreamException {
1836                List<Integer> ruleids;
1837                
1838                
1839                matchedProduction( "ruleids()" );
1840                AntlrSchemaValueLexer lexer = new AntlrSchemaValueLexer(new StringReader(s));
1841                AntlrSchemaValueParser parser = new AntlrSchemaValueParser(lexer);
1842                parser.setParserMonitor(monitor);
1843                ruleids = parser.ruleids();
1844                
1845                
1846                return ruleids;
1847        }
1848        
1849        
1850        public static final String[] _tokenNames = {
1851                "<0>",
1852                "EOF",
1853                "<2>",
1854                "NULL_TREE_LOOKAHEAD",
1855                "WHSP",
1856                "LPAR",
1857                "RPAR",
1858                "QUOTE",
1859                "DOLLAR",
1860                "LBRACKET",
1861                "RBRACKET",
1862                "LEN",
1863                "SINGLE_VALUE",
1864                "COLLECTIVE",
1865                "NO_USER_MODIFICATION",
1866                "OBSOLETE",
1867                "ABSTRACT",
1868                "STRUCTURAL",
1869                "AUXILIARY",
1870                "OBJECTIDENTIFIER",
1871                "OBJECTCLASS",
1872                "ATTRIBUTETYPE",
1873                "STARTNUMERICOID",
1874                "NAME",
1875                "DESC",
1876                "SUP",
1877                "MUST",
1878                "MAY",
1879                "AUX",
1880                "NOT",
1881                "FORM",
1882                "OC",
1883                "EQUALITY",
1884                "ORDERING",
1885                "SUBSTR",
1886                "SYNTAX",
1887                "APPLIES",
1888                "EXTENSION",
1889                "FQCN",
1890                "BYTECODE",
1891                "AUX_OR_AUXILIARY",
1892                "VALUES",
1893                "VALUE",
1894                "UNQUOTED_STRING",
1895                "QUOTED_STRING",
1896                "FQCN_VALUE",
1897                "FQCN_IDENTIFIER",
1898                "FQCN_LETTER",
1899                "FQCN_LETTERORDIGIT",
1900                "BYTECODE_VALUE",
1901                "USAGE",
1902                "USER_APPLICATIONS",
1903                "DIRECTORY_OPERATION",
1904                "DISTRIBUTED_OPERATION",
1905                "DSA_OPERATION"
1906        };
1907        
1908        
1909        }