summaryrefslogtreecommitdiffstats
path: root/src/dom/xpathparser.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/dom/xpathparser.h')
-rw-r--r--src/dom/xpathparser.h801
1 files changed, 0 insertions, 801 deletions
diff --git a/src/dom/xpathparser.h b/src/dom/xpathparser.h
deleted file mode 100644
index 7e5f774f1..000000000
--- a/src/dom/xpathparser.h
+++ /dev/null
@@ -1,801 +0,0 @@
-#ifndef SEEN_XPATHPARSER_H
-#define SEEN_XPATHPARSER_H
-
-/**
- * @file
- * Phoebe DOM Implementation.
- *
- * This is a C++ approximation of the W3C DOM model, which follows
- * fairly closely the specifications in the various .idl files, copies of
- * which are provided for reference. Most important is this one:
- *
- * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
- */
-/*
- * Authors:
- * Bob Jamison
- *
- * Copyright (C) 2005-2007 Bob Jamison
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#include <string>
-#include <vector>
-
-#include "dom.h"
-#include "xpathtoken.h"
-
-namespace org
-{
-namespace w3c
-{
-namespace dom
-{
-namespace xpath
-{
-
-typedef dom::DOMString DOMString;
-typedef dom::Node Node;
-typedef dom::NodeList NodeList;
-
-
-
-//########################################################################
-//# L E X I C A L D E F I N I T I O N S
-//########################################################################
-
-
-typedef struct
-{
- int ival;
- char const *sval;
-} LookupEntry;
-
-
-
-//Note: in the following definitions, where the starts of
-//strings are similar, put the longer definitions first
-
-/**
- *
- */
-typedef enum
-{
- COMMENT,
- TEXT,
- PROCESSING_INSTRUCTION,
- NODE
-} NodeType;
-
-
-static LookupEntry nodeTypeTable [] =
-{
- { COMMENT, "comment" },
- { TEXT, "text" },
- { PROCESSING_INSTRUCTION, "processing-instruction" },
- { NODE, "node" },
- { -1, NULL }
-};
-
-
-/**
- *
- */
-typedef enum
-{
- ANCESTOR_OR_SELF,
- ANCESTOR,
- ATTRIBUTE,
- CHILD,
- DESCENDANT_OR_SELF,
- DESCENDANT,
- FOLLOWING_SIBLING,
- FOLLOWING,
- NAMESPACE,
- PARENT,
- PRECEDING_SIBLING,
- PRECEDING,
- SELF
-} AxisNameType;
-
-
-static LookupEntry axisNameTable [] =
-{
- { ANCESTOR_OR_SELF, "ancestor-or-self" },
- { ANCESTOR, "ancestor" },
- { ATTRIBUTE, "attribute" },
- { CHILD, "child" },
- { DESCENDANT_OR_SELF, "descendant-or-self"},
- { DESCENDANT, "descendant" },
- { FOLLOWING_SIBLING, "following-sibling" },
- { FOLLOWING, "following" },
- { NAMESPACE, "namespace" },
- { PARENT, "parent" },
- { PRECEDING_SIBLING, "preceding-sibling" },
- { PRECEDING, "preceding" },
- { SELF, "self" },
- { -1, NULL }
-};
-
-
-/**
- *
- */
-typedef enum
-{
- NONE = 0,
- CHAR, //default if none of the below
- //Expr tokens
- LPAREN,
- RPAREN,
- LBRACKET,
- RBRACKET,
- DOUBLE_DOT,
- DOT,
- AMPR,
- COMMA,
- DOUBLE_COLON,
- NAME_TEST,
- NODE_TYPE,
- OPERATOR,
- FUNCTION_NAME,
- AXIS_NAME,
- LITERAL,
- NUMBER,
- VARIABLE_REFERENCE,
- //Operator tokens
- AND,
- OR,
- MOD,
- DIV,
- MULTIPLY,
- DOUBLE_SLASH,
- SLASH,
- PIPE,
- PLUS,
- MINUS,
- EQUALS,
- NOT_EQUALS,
- LESS_THAN_EQUALS,
- LESS_THAN,
- GREATER_THAN_EQUALS,
- GREATER_THAN
-} LexTokType;
-
-
-/*
-* Be VERY careful that this table matches the LexicalTokenType enum
-* declaration above.
-*/
-static LookupEntry exprTokenTable [] =
-{
- { NONE, "xxNONExx" },
- { CHAR, "CHAR" },
- //Expr tokens
- { LPAREN, "(" },
- { RPAREN, ")" },
- { LBRACKET, "[" },
- { RBRACKET, "]" },
- { DOUBLE_DOT, ".." },
- { DOT, "." },
- { AMPR, "@" },
- { COMMA, "," },
- { DOUBLE_COLON, "::" },
- { NAME_TEST, "NameTest" },
- { NODE_TYPE, "NodeType" },
- { OPERATOR, "Operator" },
- { FUNCTION_NAME, "FunctionName" },
- { AXIS_NAME, "AxisName" },
- { LITERAL, "Literal" },
- { NUMBER, "Number" },
- { VARIABLE_REFERENCE, "VariableReference" },
- { -1, NULL }
-};
-
-static LookupEntry operatorTable [] =
-{
- { NONE, "xxNONExx" },
- //Operator tokens
- { AND, "and" },
- { OR, "or" },
- { MOD, "mod" },
- { DIV, "div" },
- { MULTIPLY, "*" },
- { DOUBLE_SLASH, "//" },
- { SLASH, "/" },
- { PIPE, "|" },
- { PLUS, "+" },
- { MINUS, "-" },
- { EQUALS, "=" },
- { NOT_EQUALS, "!=" },
- { LESS_THAN_EQUALS, "<=" },
- { LESS_THAN, "<" },
- { GREATER_THAN_EQUALS, ">=" },
- { GREATER_THAN, ">" },
- { -1, NULL }
-};
-
-
-/**
- *
- */
-class LexTok
-{
-public:
- LexTok(const LexTok &tok)
- {
- type = tok.type;
- location = tok.location;
- sval = tok.sval;
- dval = tok.dval;
- ival = tok.ival;
- }
- LexTok()
- { init(); }
- LexTok(int theType, int loc)
- { init(); type = theType; location = loc;}
- LexTok(int theType, int loc, const DOMString &val)
- { init(); type = theType; location = loc; sval = val; }
- LexTok(int theType, int loc, double val)
- { init(); type = theType; location = loc; dval = val; }
- LexTok(int theType, int loc, long val)
- { init(); type = theType; location = loc; ival = val; }
-
- void print()
- {
- if (type == OPERATOR)
- {
- char const *tokenStr = "unknown";
- for (LookupEntry const *entry = operatorTable; entry->sval ; entry++)
- {
- if (entry->ival == ival)
- {
- tokenStr = entry->sval;
- break;
- }
- }
- printf("(%s)\n", tokenStr);
- }
- else if (type == NODE_TYPE)
- {
- char const *tokenStr = "unknown";
- for (LookupEntry *entry = nodeTypeTable; entry->sval ; entry++)
- {
- if (entry->ival == ival)
- {
- tokenStr = entry->sval;
- break;
- }
- }
- printf("{{%s}}\n", tokenStr);
- }
- else if (type == AXIS_NAME)
- {
- char const *tokenStr = "unknown";
- for (LookupEntry *entry = axisNameTable; entry->sval ; entry++)
- {
- if (entry->ival == ival)
- {
- tokenStr = entry->sval;
- break;
- }
- }
- printf("{%s}\n", tokenStr);
- }
- else if (type == CHAR)
- printf("'%c'\n", (char)ival);
- else if (type == NAME_TEST)
- printf("\"%s\"\n", sval.c_str());
- else if (type == LITERAL)
- printf("L'%s'\n", sval.c_str());
- else if (type == FUNCTION_NAME)
- printf("%s()\n", sval.c_str());
- else if (type == NUMBER)
- printf("#%f\n", dval);
- else
- {
- char const *tokenStr = "unknown";
- for (LookupEntry *entry = exprTokenTable; entry->sval ; entry++)
- {
- if (entry->ival == type)
- {
- tokenStr = entry->sval;
- break;
- }
- }
- printf("%s\n", tokenStr);
- //printf("%s [%s/%f/%ld]\n", tokenStr, sval.c_str(), dval, ival);
- }
- }
-
- int getType()
- { return type; }
- int getLocation()
- { return location; }
- DOMString &getStringValue()
- { return sval; }
- double getDoubleValue()
- { return dval; }
- long getIntValue()
- { return ival; }
-
-private:
- void init()
- {
- type = NONE;
- location = 0;
- dval = 0.0;
- ival = 0;
- }
-
- int type;
- int location;
- DOMString sval;
- double dval;
- long ival;
-};
-
-
-
-
-
-//########################################################################
-//# P A R S E R
-//########################################################################
-
-class XPathParser
-{
-public:
-
- //#################################
- //# CONSTRUCTOR
- //#################################
-
- /**
- *
- */
- XPathParser() :
- debug(false),
- parsebuf(0),
- parselen(0),
- position(0),
- numberString(),
- number(0),
- lexicalTokens(),
- tokens()
- {
- }
-
- /**
- *
- */
- virtual ~XPathParser() {}
-
- /**
- *
- */
- bool getDebug()
- { return debug; }
-
- /**
- *
- */
- void setDebug(bool val)
- { debug = val; }
-
-
-
- /**
- * Normally not called directly unless for string parsing testing
- */
- bool parse(const DOMString &str);
-
- /**
- * This is the big one. Called by the xpath-dom api to fetch
- * nodes from a DOM tree.
- */
- NodeList evaluate(const NodePtr root, const DOMString &str);
-
-
-
-private:
-
- //#################################
- //# MESSAGES
- //#################################
-
- /**
- *
- */
- void trace(const char *fmt, ...)
- #ifdef G_GNUC_PRINTF
- G_GNUC_PRINTF(2, 3)
- #endif
- ;
-
- /**
- *
- */
- void traceStack(const char *name, int pos, int depth);
-
- /**
- *
- */
- void error(const char *fmt, ...)
- #ifdef G_GNUC_PRINTF
- G_GNUC_PRINTF(2, 3)
- #endif
- ;
-
- //#################################
- //# LEXICAL SCANNING
- //#################################
-
- /**
- * Add a lexical token of a given type to the list
- */
- void lexTokAdd(int type, int loc);
- void lexTokAdd(int type, int loc, const DOMString &val);
- void lexTokAdd(int type, int loc, double val);
- void lexTokAdd(int type, int loc, long val);
-
- /**
- *
- */
- void lexicalTokenDump();
-
- /**
- *
- */
- LexTok lexTok(int p);
-
- /**
- *
- */
- int lexTokType(int p);
-
- /**
- *
- */
- int peek(int p);
-
- /**
- *
- */
- int get(int p);
-
- /**
- *
- */
- int getword(int p, DOMString &str);
-
- /**
- *
- */
- int match(int p, const char *str);
-
- /**
- *
- */
- int skipwhite(int p);
-
- /**
- *
- */
- int getNumber(int p, double &dresult);
-
- /**
- *
- */
- int getLiteral(int p, DOMString &result);
-
- /**
- *
- */
- int getNameTest(int p0, DOMString &result);
-
- /**
- *
- */
- int getNCName(int p0, DOMString &result);
-
-
-
-
- /**
- *
- */
- int lexicalScan();
-
-
- //#################################
- //# GRAMMAR PARSING
- //#################################
-
- /**
- * Add a newly derived token to the token list;
- */
- void tokAdd(const Token &token);
-
- void tokAdd(int type);
-
- void tokAdd(int type, long val);
-
- void tokAdd(int type, double val);
-
- void tokAdd(int type, const DOMString &val);
-
-
- /**
- * The grammar definitions marked [1]-[39] are directly
- * from the W3C XPath grammar spacification.
- */
-
- /**
- * [1]
- */
- int getLocationPath(int p0, int depth);
-
- /**
- * [2]
- */
- int getAbsoluteLocationPath(int p0, int depth);
-
- /**
- * [3]
- */
- int getRelativeLocationPath(int p0, int depth);
-
- /**
- * [4]
- */
- int getStep(int p0, int depth);
-
- /**
- * [5]
- */
- int getAxisSpecifier(int p0, int depth);
-
- /**
- * [6]
- */
- int getAxisName(int p0, int depth);
-
- /**
- * [7]
- */
- int getNodeTest(int p0, int depth);
-
- /**
- * [8]
- */
- int getPredicate(int p0, int depth);
-
- /**
- * [9]
- */
- int getPredicateExpr(int p0, int depth);
-
- /**
- * [10]
- */
- int getAbbreviatedAbsoluteLocationPath(int p0, int depth);
- /**
- * [11]
- */
- int getAbbreviatedRelativeLocationPath(int p0, int depth);
- /**
- * [12]
- */
- int getAbbreviatedStep(int p0, int depth);
-
- /**
- * [13]
- */
- int getAbbreviatedAxisSpecifier(int p0, int depth);
-
- /**
- * [14]
- */
- int getExpr(int p0, int depth);
-
- /**
- * [15]
- */
- int getPrimaryExpr(int p0, int depth);
-
- /**
- * [16]
- */
- int getFunctionCall(int p0, int depth);
-
- /**
- * [17]
- */
- int getArgument(int p0, int depth);
-
- /**
- * [18]
- */
- int getUnionExpr(int p0, int depth);
-
- /**
- * [19]
- */
- int getPathExpr(int p0, int depth);
-
- /**
- * [20]
- */
- int getFilterExpr(int p0, int depth);
-
- /**
- * [21]
- */
- int getOrExpr(int p0, int depth);
-
- /**
- * [22]
- */
- int getAndExpr(int p0, int depth);
-
- /**
- * [23]
- */
- int getEqualityExpr(int p0, int depth);
-
- /**
- * [24]
- */
- int getRelationalExpr(int p0, int depth);
-
- /**
- * [25]
- */
- int getAdditiveExpr(int p0, int depth);
-
- /**
- * [26]
- */
- int getMultiplicativeExpr(int p0, int depth);
-
- /**
- * [27]
- */
- int getUnaryExpr(int p0, int depth);
-
- /**
- * [28]
- */
- int getExprToken(int p0, int depth);
-
- /**
- * [29]
- */
- int getLiteral(int p0, int depth);
-
- /**
- * [30]
- */
- int getNumber(int p0, int depth);
-
- /**
- * [31]
- */
- int getDigits(int p0, int depth);
-
- /**
- * [32]
- */
- int getOperator(int p0, int depth);
-
- /**
- * [33]
- */
- int getOperatorName(int p0, int depth);
-
- /**
- * [34]
- */
- int getMultiplyOperator(int p0, int depth);
-
- /**
- * [35]
- */
- int getFunctionName(int p0, int depth);
-
- /**
- * [36]
- */
- int getVariableReference(int p0, int depth);
-
- /**
- * [37]
- */
- int getNameTest(int p0, int depth);
-
- /**
- * [38]
- */
- int getNodeType(int p0, int depth);
-
- /**
- * [39]
- */
- int getExprWhitespace(int p0, int depth);
-
-
-
- //#################################
- //# DATA ITEMS
- //#################################
-
- /**
- *
- */
- bool debug;
-
- /**
- *
- */
- char *parsebuf;
-
- /**
- *
- */
- int parselen;
-
- /**
- *
- */
- int position;
-
- /**
- *
- */
- DOMString numberString;
-
- /**
- *
- */
- double number;
-
-
- /**
- * The result of the first lexical scan
- */
- std::vector<LexTok> lexicalTokens;
-
- /**
- * The result of parsing. If parsing was successful, then
- * this is executable via execute()
- */
- TokenList tokens;
-};
-
-
-} // namespace xpath
-} // namespace dom
-} // namespace w3c
-} // namespace org
-#endif // SEEN_XPATHPARSER_H
-//#########################################################################
-//# E N D O F F I L E
-//#########################################################################