dom/xslt/xpath/txExprLexer.h

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
     2 /* This Source Code Form is subject to the terms of the Mozilla Public
     3  * License, v. 2.0. If a copy of the MPL was not distributed with this
     4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 #ifndef MITREXSL_EXPRLEXER_H
     8 #define MITREXSL_EXPRLEXER_H
    10 #include "txCore.h"
    11 #include "nsString.h"
    13 /**
    14  * A Token class for the ExprLexer.
    15  *
    16  * This class was ported from XSL:P, an open source Java based 
    17  * XSLT processor, written by yours truly.
    18  */
    19 class Token
    20 {
    21 public:
    23     /**
    24      * Token types
    25      */
    26     enum Type {
    27         //-- Trivial Tokens
    28         NULL_TOKEN = 1,
    29         LITERAL,
    30         NUMBER,
    31         CNAME,
    32         VAR_REFERENCE,
    33         PARENT_NODE,
    34         SELF_NODE,
    35         R_PAREN,
    36         R_BRACKET, // 9
    37         /**
    38          * start of tokens for 3.7, bullet 1
    39          * ExprLexer::nextIsOperatorToken bails if the tokens aren't
    40          * consecutive.
    41          */
    42         COMMA,
    43         AT_SIGN,
    44         L_PAREN,
    45         L_BRACKET,
    46         AXIS_IDENTIFIER,
    48         // These tokens include their following left parenthesis
    49         FUNCTION_NAME_AND_PAREN, // 15
    50         COMMENT_AND_PAREN,
    51         NODE_AND_PAREN,
    52         PROC_INST_AND_PAREN,
    53         TEXT_AND_PAREN,
    55         /**
    56          * operators
    57          */
    58         //-- boolean ops
    59         AND_OP, // 20
    60         OR_OP,
    62         //-- relational
    63         EQUAL_OP, // 22
    64         NOT_EQUAL_OP,
    65         LESS_THAN_OP,
    66         GREATER_THAN_OP,
    67         LESS_OR_EQUAL_OP,
    68         GREATER_OR_EQUAL_OP,
    69         //-- additive operators
    70         ADDITION_OP, // 28
    71         SUBTRACTION_OP,
    72         //-- multiplicative
    73         DIVIDE_OP, // 30
    74         MULTIPLY_OP,
    75         MODULUS_OP,
    76         //-- path operators
    77         PARENT_OP, // 33
    78         ANCESTOR_OP,
    79         UNION_OP,
    80         /**
    81          * end of tokens for 3.7, bullet 1 -/
    82          */
    83         //-- Special endtoken
    84         END // 36
    85     };
    88     /**
    89      * Constructors
    90      */
    91     typedef nsASingleFragmentString::const_char_iterator iterator;
    93     Token(iterator aStart, iterator aEnd, Type aType)
    94         : mStart(aStart),
    95           mEnd(aEnd),
    96           mType(aType),
    97           mNext(nullptr)
    98     {
    99     }
   100     Token(iterator aChar, Type aType)
   101         : mStart(aChar),
   102           mEnd(aChar + 1),
   103           mType(aType),
   104           mNext(nullptr)
   105     {
   106     }
   108     const nsDependentSubstring Value()
   109     {
   110         return Substring(mStart, mEnd);
   111     }
   113     iterator mStart, mEnd;
   114     Type mType;
   115     Token* mNext;
   116 };
   118 /**
   119  * A class for splitting an "Expr" String into tokens and
   120  * performing  basic Lexical Analysis.
   121  *
   122  * This class was ported from XSL:P, an open source Java based XSL processor
   123  */
   125 class txExprLexer
   126 {
   127 public:
   129     txExprLexer();
   130     ~txExprLexer();
   132     /**
   133      * Parse the given string.
   134      * returns an error result if lexing failed.
   135      * The given string must outlive the use of the lexer, as the
   136      * generated Tokens point to Substrings of it.
   137      * mPosition points to the offending location in case of an error.
   138      */
   139     nsresult parse(const nsASingleFragmentString& aPattern);
   141     typedef nsASingleFragmentString::const_char_iterator iterator;
   142     iterator mPosition;
   144     /**
   145      * Functions for iterating over the TokenList
   146      */
   148     Token* nextToken();
   149     Token* peek()
   150     {
   151         NS_ASSERTION(mCurrentItem, "peek called uninitialized lexer");
   152         return mCurrentItem;
   153     }
   154     Token* peekAhead()
   155     {
   156         NS_ASSERTION(mCurrentItem, "peekAhead called on uninitialized lexer");
   157         // Don't peek past the end node
   158         return (mCurrentItem && mCurrentItem->mNext) ? mCurrentItem->mNext : mCurrentItem;
   159     }
   160     bool hasMoreTokens()
   161     {
   162         NS_ASSERTION(mCurrentItem, "HasMoreTokens called on uninitialized lexer");
   163         return (mCurrentItem && mCurrentItem->mType != Token::END);
   164     }
   166     /**
   167      * Trivial Tokens
   168      */
   169     //-- LF, changed to enum
   170     enum _TrivialTokens {
   171         D_QUOTE        = '\"',
   172         S_QUOTE        = '\'',
   173         L_PAREN        = '(',
   174         R_PAREN        = ')',
   175         L_BRACKET      = '[',
   176         R_BRACKET      = ']',
   177         L_ANGLE        = '<',
   178         R_ANGLE        = '>',
   179         COMMA          = ',',
   180         PERIOD         = '.',
   181         ASTERIX        = '*',
   182         FORWARD_SLASH  = '/',
   183         EQUAL          = '=',
   184         BANG           = '!',
   185         VERT_BAR       = '|',
   186         AT_SIGN        = '@',
   187         DOLLAR_SIGN    = '$',
   188         PLUS           = '+',
   189         HYPHEN         = '-',
   190         COLON          = ':',
   191         //-- whitespace tokens
   192         SPACE          = ' ',
   193         TX_TAB            = '\t',
   194         TX_CR             = '\n',
   195         TX_LF             = '\r'
   196     };
   198 private:
   200     Token* mCurrentItem;
   201     Token* mFirstItem;
   202     Token* mLastItem;
   204     int mTokenCount;
   206     void addToken(Token* aToken);
   208     /**
   209      * Returns true if the following Token should be an operator.
   210      * This is a helper for the first bullet of [XPath 3.7]
   211      *  Lexical Structure
   212      */
   213     bool nextIsOperatorToken(Token* aToken);
   215     /**
   216      * Returns true if the given character represents a numeric letter (digit)
   217      * Implemented in ExprLexerChars.cpp
   218      */
   219     static bool isXPathDigit(char16_t ch)
   220     {
   221         return (ch >= '0' && ch <= '9');
   222     }
   223 };
   225 #endif

mercurial