You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2005/09/02 23:37:10 UTC
svn commit: r267308 -
/directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g
Author: elecharny
Date: Fri Sep 2 14:37:07 2005
New Revision: 267308
URL: http://svn.apache.org/viewcvs?rev=267308&view=rev
Log:
Switched to the newer file from shared/ldap
Added:
directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g
Added: directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g
URL: http://svn.apache.org/viewcvs/directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g?rev=267308&view=auto
==============================================================================
--- directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g (added)
+++ directory/shared/ldap/branches/new-codec-integration/common/src/antlr/subtree-specification.g Fri Sep 2 14:37:07 2005
@@ -0,0 +1,498 @@
+header
+{
+/*
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+
+package org.apache.ldap.common.subtree;
+
+import java.util.Set;
+import java.util.HashSet;
+import java.util.ArrayList;
+
+import javax.naming.Name;
+import javax.naming.NamingException;
+
+import org.apache.ldap.common.name.DnParser;
+import org.apache.ldap.common.name.NameComponentNormalizer;
+import org.apache.ldap.common.filter.ExprNode;
+import org.apache.ldap.common.filter.LeafNode;
+import org.apache.ldap.common.filter.SimpleNode;
+import org.apache.ldap.common.filter.BranchNode;
+import org.apache.ldap.common.filter.AbstractExprNode;
+import org.apache.ldap.common.subtree.SubtreeSpecification;
+import org.apache.ldap.common.subtree.SubtreeSpecificationModifier;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+}
+
+
+// ----------------------------------------------------------------------------
+// parser class definition
+// ----------------------------------------------------------------------------
+
+/**
+ * The antlr generated subtree specification parser.
+ *
+ * @see <a href="http://www.faqs.org/rfcs/rfc3672.html">RFC 3672</a>
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+class AntlrSubtreeSpecificationParser extends Parser;
+
+
+// ----------------------------------------------------------------------------
+// parser options
+// ----------------------------------------------------------------------------
+
+options
+{
+ k = 3;
+
+ defaultErrorHandler = false;
+}
+
+
+// ----------------------------------------------------------------------------
+// parser initialization
+// ----------------------------------------------------------------------------
+
+{
+ private static final Logger log = LoggerFactory.getLogger( AntlrSubtreeSpecificationParser.class );
+ private DnParser dnParser;
+
+ private boolean isNormalizing = false;
+ NameComponentNormalizer normalizer;
+
+ private Set chopBeforeExclusions = new HashSet();
+ private Set chopAfterExclusions = new HashSet();
+
+ SubtreeSpecificationModifier ssModifier = null;
+
+ /**
+ * Creates a (normalizing) subordinate DnParser for parsing LocalNames.
+ * This method MUST be called for each instance while we cannot do
+ * constructor overloading for this class.
+ *
+ * @return the DnParser to be used for parsing LocalNames
+ */
+ public void init()
+ {
+ try
+ {
+ if( isNormalizing )
+ {
+ dnParser = new DnParser( normalizer );
+ }
+ else
+ {
+ dnParser = new DnParser();
+ }
+ }
+ catch ( NamingException e )
+ {
+ String msg = "Failed to initialize the subordinate DnParser for this AntlrSubtreeSpecificationParser";
+
+ // We throw a NPE since this variable cannot be null for proper operation
+ // so we can catch the null pointer before the dnParser is even used.
+
+ throw new NullPointerException( "dnParser is null: " + msg );
+ }
+ }
+
+ /**
+ * Sets the NameComponentNormalizer for this parser's dnParser.
+ */
+ public void setNormalizer(NameComponentNormalizer normalizer)
+ {
+ this.normalizer = normalizer;
+ this.isNormalizing = true;
+ }
+}
+
+
+// ----------------------------------------------------------------------------
+// parser productions
+// ----------------------------------------------------------------------------
+
+wrapperEntryPoint returns [SubtreeSpecification ss]
+{
+ log.debug( "entered wrapperEntryPoint()" );
+ ss = null;
+ SubtreeSpecification tempSs = null;
+} :
+ tempSs=subtreeSpecification "end"
+ {
+ ss = tempSs;
+ }
+ ;
+
+
+subtreeSpecification returns [SubtreeSpecification ss]
+{
+ log.debug( "entered subtreeSpecification()" );
+ // clear out ss and ssModifier in case something is left from the last parse
+ ss = null;
+ ssModifier = new SubtreeSpecificationModifier();
+} :
+ LBRACKET
+ ( SP ss_base )?
+ ( SEP SP ss_specificExclusions )?
+ ( SEP SP ss_minimum )?
+ ( SEP SP ss_maximum )?
+ ( SEP SP ss_specificationFilter )?
+ SP RBRACKET
+ {
+ ss = ssModifier.getSubtreeSpecification();
+ }
+ ;
+
+
+ss_base
+{
+ log.debug( "entered ss_base()" );
+ Name base = null;
+} :
+ "base" (SP)+ base=localName
+ {
+ ssModifier.setBase( base );
+ }
+ ;
+
+
+ss_specificExclusions
+{
+ log.debug( "entered ss_specificExclusions()" );
+} :
+ "specificExclusions" ( SP )+ specificExclusions
+ {
+ ssModifier.setChopBeforeExclusions( chopBeforeExclusions );
+ ssModifier.setChopAfterExclusions( chopAfterExclusions );
+ }
+ ;
+
+
+specificExclusions
+{
+ log.debug( "entered specificExclusions()" );
+} :
+ LBRACKET
+ ( SP specificExclusion
+ (SEP SP specificExclusion)*
+ )?
+ SP RBRACKET
+ ;
+
+
+specificExclusion
+{
+ log.debug( "entered specificExclusion()" );
+} :
+ chopBefore | chopAfter
+ ;
+
+
+chopBefore
+{
+ log.debug( "entered chopBefore()" );
+ Name chopBeforeExclusion = null;
+} :
+ "chopBefore" COLON chopBeforeExclusion=localName
+ {
+ chopBeforeExclusions.add( chopBeforeExclusion );
+ }
+ ;
+
+
+chopAfter
+{
+ log.debug( "entered chopAfter()" );
+ Name chopAfterExclusion = null;
+} :
+ "chopAfter" COLON chopAfterExclusion=localName
+ {
+ chopAfterExclusions.add( chopAfterExclusion );
+ }
+ ;
+
+
+ss_minimum
+{
+ log.debug( "entered ss_minimum()" );
+ int minimum = 0;
+} :
+ "minimum" ( SP )+ minimum=baseDistance
+ {
+ ssModifier.setMinBaseDistance( minimum );
+ }
+ ;
+
+
+ss_maximum
+{
+ log.debug( "entered ss_maximum()" );
+ int maximum = 0;
+} :
+ "maximum" ( SP )+ maximum=baseDistance
+ {
+ ssModifier.setMaxBaseDistance( maximum );
+ }
+ ;
+
+
+ss_specificationFilter
+{
+ log.debug( "entered ss_specificationFilter()" );
+ ExprNode theRefinement = null;
+}:
+ ( "specificationFilter" ( SP )+ theRefinement=refinement
+ {
+ ssModifier.setRefinement( theRefinement );
+ } )?
+ ;
+
+
+localName returns [Name name]
+{
+ log.debug( "entered localName()" );
+ name = null;
+} :
+ token:DQUOTEDSTRING
+ {
+ name = dnParser.parse( token.getText() );
+ }
+ ;
+ exception
+ catch [Exception e]
+ {
+ throw new RecognitionException( "dnParser failed." + e.getMessage() );
+ }
+
+
+baseDistance returns [int distance]
+{
+ log.debug( "entered baseDistance()" );
+ distance = 0;
+} :
+ token:NUMBER
+ {
+ distance = Integer.parseInt( token.getText() );
+ }
+ ;
+
+
+refinement returns [ExprNode node]
+{
+ log.debug( "entered refinement()" );
+ node = null;
+} :
+ node=item | node=and | node=or | node=not
+ ;
+
+
+item returns [LeafNode node]
+{
+ log.debug( "entered item()" );
+ node = null;
+ String oid = null;
+} :
+ "item" COLON oid=objectIdentifier
+ {
+ node = new SimpleNode( "objectClass" , oid , AbstractExprNode.EQUALITY );
+ }
+ ;
+
+
+objectIdentifier returns [String oid]
+{
+ oid = null;
+} :
+ token1:DESCR
+ {
+ oid = token1.getText();
+ }
+ |
+ token2:NUMERICOID
+ {
+ oid = token2.getText();
+ }
+ ;
+
+
+and returns [BranchNode node]
+{
+ log.debug( "entered and()" );
+ node = null;
+ ArrayList children = null;
+} :
+ "and" COLON children=refinements
+ {
+ node = new BranchNode( AbstractExprNode.AND , children );
+ }
+ ;
+
+
+or returns [BranchNode node]
+{
+ log.debug( "entered or()" );
+ node = null;
+ ArrayList children = null;
+} :
+ "or" COLON children=refinements
+ {
+ node = new BranchNode( AbstractExprNode.OR , children );
+ }
+ ;
+
+
+not returns [BranchNode node]
+{
+ log.debug( "entered not()" );
+ node = null;
+ ArrayList children = null;
+} :
+ "not" COLON children=refinements
+ {
+ node = new BranchNode( AbstractExprNode.NOT , children );
+ }
+ ;
+
+
+refinements returns [ArrayList children]
+{
+ log.debug( "entered refinements()" );
+ children = null;
+ ExprNode child = null;
+ ArrayList tempChildren = new ArrayList();
+} :
+ LBRACKET
+ ( SP
+ child=refinement
+ {
+ tempChildren.add( child );
+ }
+ ( SEP SP child=refinement
+ {
+ tempChildren.add( child );
+ } )*
+ )? SP RBRACKET
+ {
+ children = tempChildren;
+ }
+ ;
+
+
+// ----------------------------------------------------------------------------
+// lexer class definition
+// ----------------------------------------------------------------------------
+
+/**
+ * The parser's primary lexer.
+ *
+ * @see <a href="http://www.faqs.org/rfcs/rfc3672.html">RFC 3672</a>
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$
+ */
+class AntlrSubtreeSpecificationLexer extends Lexer;
+
+
+// ----------------------------------------------------------------------------
+// lexer options
+// ----------------------------------------------------------------------------
+
+options
+{
+ k = 3;
+
+ charVocabulary = '\u0001'..'\u0127';
+
+ testLiterals = false;
+}
+
+
+//----------------------------------------------------------------------------
+// lexer initialization
+//----------------------------------------------------------------------------
+
+{
+ private static final Logger log = LoggerFactory.getLogger( AntlrSubtreeSpecificationLexer.class );
+}
+
+
+// ----------------------------------------------------------------------------
+// attribute description lexer rules from models
+// ----------------------------------------------------------------------------
+
+SP : ' ' ;
+
+COLON : ':' { log.debug( "matched COLON(':')" ); } ;
+
+LBRACKET : '{' { log.debug( "matched LBRACKET('{')" ); } ;
+
+RBRACKET : '}' { log.debug( "matched RBRACKET('}')" ); } ;
+
+DQUOTE : '"' { log.debug( "matched DQUOTE('\"')" ); } ;
+
+SEP : ',' { log.debug( "matched SEP(',')" ); } ;
+
+DQUOTEDSTRING : DQUOTE! ( SAFEUTF8CHAR )* DQUOTE! { log.debug( "matched DQUOTEDSTRING: \"" + getText() + "\"" ); } ;
+
+DESCR options { testLiterals = true; } : ALPHA ( ALPHA | DIGIT | '-' )* { log.debug( "matched DESCR" ); } ;
+
+// This rule is required to prevent nondeterminism problem caused by NUMBER and NUMERICOID rules.
+
+NUMBER_OR_NUMERICOID
+ :
+ ( NUMBER DOT ) => NUMERICOID
+ {
+ $setType(NUMERICOID);
+ }
+ |
+ NUMBER
+ {
+ $setType(NUMBER);
+ }
+ ;
+
+protected NUMBER: DIGIT | ( LDIGIT ( DIGIT )+ ) { log.debug( "matched NUMBER: " + getText() ); } ;
+
+protected NUMERICOID: NUMBER ( DOT NUMBER )+ { log.debug( "matched NUMERICOID: " + getText() ); } ;
+
+protected DOT: '.' ;
+
+protected DIGIT: '0' | LDIGIT ;
+
+protected LDIGIT: '1'..'9' ;
+
+protected ALPHA: 'A'..'Z' | 'a'..'z' ;
+
+// This is all messed up - could not figure out how to get antlr to represent
+// the safe UTF-8 character set from RFC 3642 for production SafeUTF8Character
+
+protected SAFEUTF8CHAR:
+ '\u0001'..'\u0021' |
+ '\u0023'..'\u007F' |
+ '\u00c0'..'\u00d6' |
+ '\u00d8'..'\u00f6' |
+ '\u00f8'..'\u00ff' |
+ '\u0100'..'\u1fff' |
+ '\u3040'..'\u318f' |
+ '\u3300'..'\u337f' |
+ '\u3400'..'\u3d2d' |
+ '\u4e00'..'\u9fff' |
+ '\uf900'..'\ufaff' ;