WebCore/xml/XPathParser.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright 2005 Maksim Orlovich <maksim@kde.org>
       
     3  * Copyright (C) 2006 Apple Computer, Inc.
       
     4  *
       
     5  * Redistribution and use in source and binary forms, with or without
       
     6  * modification, are permitted provided that the following conditions
       
     7  * are met:
       
     8  * 
       
     9  * 1. Redistributions of source code must retain the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer.
       
    11  * 2. Redistributions in binary form must reproduce the above copyright
       
    12  *    notice, this list of conditions and the following disclaimer in the
       
    13  *    documentation and/or other materials provided with the distribution.
       
    14  * 
       
    15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
       
    16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
       
    17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
       
    18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
       
    19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
       
    20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
       
    21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
       
    22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
       
    24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    25  */
       
    26 
       
    27 #ifndef XPathParser_h
       
    28 #define XPathParser_h
       
    29 
       
    30 #if ENABLE(XPATH)
       
    31 
       
    32 #include "XPathStep.h"
       
    33 #include "XPathPredicate.h"
       
    34 
       
    35 namespace WebCore {
       
    36 
       
    37     typedef int ExceptionCode;
       
    38 
       
    39     class XPathNSResolver;
       
    40 
       
    41     namespace XPath {
       
    42 
       
    43         class Expression;
       
    44         class ParseNode;
       
    45         class Predicate;
       
    46 
       
    47         struct Token {
       
    48             int type;
       
    49             String str;
       
    50             Step::Axis axis;
       
    51             NumericOp::Opcode numop;
       
    52             EqTestOp::Opcode eqop;
       
    53             
       
    54             Token(int t) : type(t) {}
       
    55             Token(int t, const String& v): type(t), str(v) {}
       
    56             Token(int t, Step::Axis v): type(t), axis(v) {}
       
    57             Token(int t, NumericOp::Opcode v): type(t), numop(v) {}
       
    58             Token(int t, EqTestOp::Opcode v): type(t), eqop(v) {}
       
    59         };
       
    60 
       
    61         class Parser : public Noncopyable {
       
    62         public:
       
    63             Parser();
       
    64 
       
    65             XPathNSResolver* resolver() const { return m_resolver.get(); }
       
    66             bool expandQName(const String& qName, String& localName, String& namespaceURI);
       
    67 
       
    68             Expression* parseStatement(const String& statement, PassRefPtr<XPathNSResolver>, ExceptionCode&);
       
    69 
       
    70             static Parser* current() { return currentParser; }
       
    71 
       
    72             int lex(void* yylval);
       
    73 
       
    74             Expression* m_topExpr;
       
    75             bool m_gotNamespaceError;
       
    76 
       
    77             void registerParseNode(ParseNode*);
       
    78             void unregisterParseNode(ParseNode*);
       
    79 
       
    80             void registerPredicateVector(Vector<Predicate*>*);
       
    81             void deletePredicateVector(Vector<Predicate*>*);
       
    82 
       
    83             void registerExpressionVector(Vector<Expression*>*);
       
    84             void deleteExpressionVector(Vector<Expression*>*);
       
    85 
       
    86             void registerString(String*);
       
    87             void deleteString(String*);
       
    88 
       
    89             void registerNodeTest(Step::NodeTest*);
       
    90             void deleteNodeTest(Step::NodeTest*);
       
    91 
       
    92         private:
       
    93             bool isOperatorContext() const;
       
    94 
       
    95             void skipWS();
       
    96             Token makeTokenAndAdvance(int type, int advance = 1);
       
    97             Token makeTokenAndAdvance(int type, NumericOp::Opcode, int advance = 1);
       
    98             Token makeTokenAndAdvance(int type, EqTestOp::Opcode, int advance = 1);
       
    99             char peekAheadHelper();
       
   100             char peekCurHelper();
       
   101 
       
   102             Token lexString();
       
   103             Token lexNumber();
       
   104             bool lexNCName(String&);
       
   105             bool lexQName(String&);
       
   106 
       
   107             Token nextToken();
       
   108             Token nextTokenInternal();
       
   109 
       
   110             void reset(const String& data);
       
   111 
       
   112             static Parser* currentParser;
       
   113 
       
   114             unsigned m_nextPos;
       
   115             String m_data;
       
   116             int m_lastTokenType;
       
   117             RefPtr<XPathNSResolver> m_resolver;
       
   118 
       
   119             HashSet<ParseNode*> m_parseNodes;
       
   120             HashSet<Vector<Predicate*>*> m_predicateVectors;
       
   121             HashSet<Vector<Expression*>*> m_expressionVectors;
       
   122             HashSet<String*> m_strings;
       
   123             HashSet<Step::NodeTest*> m_nodeTests;
       
   124         };
       
   125 
       
   126     }
       
   127 }
       
   128 
       
   129 #endif // ENABLE(XPATH)
       
   130 
       
   131 #endif