| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: https://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the QtXmlPatterns module of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:LGPL$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at https://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU Lesser General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
| 19 | ** General Public License version 3 as published by the Free Software |
| 20 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| 21 | ** packaging of this file. Please review the following information to |
| 22 | ** ensure the GNU Lesser General Public License version 3 requirements |
| 23 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| 24 | ** |
| 25 | ** GNU General Public License Usage |
| 26 | ** Alternatively, this file may be used under the terms of the GNU |
| 27 | ** General Public License version 2.0 or (at your option) the GNU General |
| 28 | ** Public license version 3 or any later version approved by the KDE Free |
| 29 | ** Qt Foundation. The licenses are as published by the Free Software |
| 30 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| 31 | ** included in the packaging of this file. Please review the following |
| 32 | ** information to ensure the GNU General Public License requirements will |
| 33 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| 34 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
| 35 | ** |
| 36 | ** $QT_END_LICENSE$ |
| 37 | ** |
| 38 | ****************************************************************************/ |
| 39 | |
| 40 | // |
| 41 | // W A R N I N G |
| 42 | // ------------- |
| 43 | // |
| 44 | // This file is not part of the Qt API. It exists purely as an |
| 45 | // implementation detail. This header file may change from version to |
| 46 | // version without notice, or even be removed. |
| 47 | // |
| 48 | // We mean it. |
| 49 | |
| 50 | /* A Bison parser, made by GNU Bison 3.3.2. */ |
| 51 | |
| 52 | /* Bison implementation for Yacc-like parsers in C |
| 53 | |
| 54 | Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation, |
| 55 | Inc. |
| 56 | |
| 57 | This program is free software: you can redistribute it and/or modify |
| 58 | it under the terms of the GNU General Public License as published by |
| 59 | the Free Software Foundation, either version 3 of the License, or |
| 60 | (at your option) any later version. |
| 61 | |
| 62 | This program is distributed in the hope that it will be useful, |
| 63 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 64 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 65 | GNU General Public License for more details. |
| 66 | |
| 67 | You should have received a copy of the GNU General Public License |
| 68 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 69 | |
| 70 | /* As a special exception, you may create a larger work that contains |
| 71 | part or all of the Bison parser skeleton and distribute that work |
| 72 | under terms of your choice, so long as that work isn't itself a |
| 73 | parser generator using the skeleton or a modified version thereof |
| 74 | as a parser skeleton. Alternatively, if you modify or redistribute |
| 75 | the parser skeleton itself, you may (at your option) remove this |
| 76 | special exception, which will cause the skeleton and the resulting |
| 77 | Bison output files to be licensed under the GNU General Public |
| 78 | License without this special exception. |
| 79 | |
| 80 | This special exception was added by the Free Software Foundation in |
| 81 | version 2.2 of Bison. */ |
| 82 | |
| 83 | /* C LALR(1) parser skeleton written by Richard Stallman, by |
| 84 | simplifying the original so-called "semantic" parser. */ |
| 85 | |
| 86 | /* All symbols defined below should begin with yy or YY, to avoid |
| 87 | infringing on user name space. This should be done even for local |
| 88 | variables, as they might otherwise be expanded by user macros. |
| 89 | There are some unavoidable exceptions within include files to |
| 90 | define necessary library symbols; they are noted "INFRINGES ON |
| 91 | USER NAME SPACE" below. */ |
| 92 | |
| 93 | /* Undocumented macros, especially those whose name start with YY_, |
| 94 | are private implementation details. Do not rely on them. */ |
| 95 | |
| 96 | /* Identify Bison output. */ |
| 97 | #define YYBISON 1 |
| 98 | |
| 99 | /* Bison version. */ |
| 100 | #define YYBISON_VERSION "3.3.2" |
| 101 | |
| 102 | /* Skeleton name. */ |
| 103 | #define YYSKELETON_NAME "yacc.c" |
| 104 | |
| 105 | /* Pure parsers. */ |
| 106 | #define YYPURE 1 |
| 107 | |
| 108 | /* Push parsers. */ |
| 109 | #define YYPUSH 0 |
| 110 | |
| 111 | /* Pull parsers. */ |
| 112 | #define YYPULL 1 |
| 113 | |
| 114 | /* Substitute the type names. */ |
| 115 | #define YYSTYPE XPATHSTYPE |
| 116 | #define YYLTYPE XPATHLTYPE |
| 117 | /* Substitute the variable and function names. */ |
| 118 | #define yyparse XPathparse |
| 119 | #define yylex XPathlex |
| 120 | #define yyerror XPatherror |
| 121 | #define yydebug XPathdebug |
| 122 | #define yynerrs XPathnerrs |
| 123 | |
| 124 | |
| 125 | /* First part of user prologue. */ |
| 126 | #line 50 "querytransformparser.ypp" /* yacc.c:337 */ |
| 127 | |
| 128 | /**************************************************************************** |
| 129 | ** |
| 130 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 131 | ** Contact: https://www.qt.io/licensing/ |
| 132 | ** |
| 133 | ** This file is part of the QtXmlPatterns module of the Qt Toolkit. |
| 134 | ** |
| 135 | ** $QT_BEGIN_LICENSE:LGPL$ |
| 136 | ** Commercial License Usage |
| 137 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 138 | ** accordance with the commercial license agreement provided with the |
| 139 | ** Software or, alternatively, in accordance with the terms contained in |
| 140 | ** a written agreement between you and The Qt Company. For licensing terms |
| 141 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 142 | ** information use the contact form at https://www.qt.io/contact-us. |
| 143 | ** |
| 144 | ** GNU Lesser General Public License Usage |
| 145 | ** Alternatively, this file may be used under the terms of the GNU Lesser |
| 146 | ** General Public License version 3 as published by the Free Software |
| 147 | ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| 148 | ** packaging of this file. Please review the following information to |
| 149 | ** ensure the GNU Lesser General Public License version 3 requirements |
| 150 | ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| 151 | ** |
| 152 | ** GNU General Public License Usage |
| 153 | ** Alternatively, this file may be used under the terms of the GNU |
| 154 | ** General Public License version 2.0 or (at your option) the GNU General |
| 155 | ** Public license version 3 or any later version approved by the KDE Free |
| 156 | ** Qt Foundation. The licenses are as published by the Free Software |
| 157 | ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| 158 | ** included in the packaging of this file. Please review the following |
| 159 | ** information to ensure the GNU General Public License requirements will |
| 160 | ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| 161 | ** https://www.gnu.org/licenses/gpl-3.0.html. |
| 162 | ** |
| 163 | ** $QT_END_LICENSE$ |
| 164 | ** |
| 165 | ****************************************************************************/ |
| 166 | |
| 167 | // |
| 168 | // W A R N I N G |
| 169 | // ------------- |
| 170 | // |
| 171 | // This file is not part of the Qt API. It exists purely as an |
| 172 | // implementation detail. This header file may change from version to |
| 173 | // version without notice, or even be removed. |
| 174 | // |
| 175 | // We mean it. |
| 176 | |
| 177 | #include <limits> |
| 178 | |
| 179 | #include <QUrl> |
| 180 | |
| 181 | #include <private/qabstractfloat_p.h> |
| 182 | #include <private/qandexpression_p.h> |
| 183 | #include <private/qanyuri_p.h> |
| 184 | #include <private/qapplytemplate_p.h> |
| 185 | #include <private/qargumentreference_p.h> |
| 186 | #include <private/qarithmeticexpression_p.h> |
| 187 | #include <private/qatomicstring_p.h> |
| 188 | #include <private/qattributeconstructor_p.h> |
| 189 | #include <private/qattributenamevalidator_p.h> |
| 190 | #include <private/qaxisstep_p.h> |
| 191 | #include <private/qbuiltintypes_p.h> |
| 192 | #include <private/qcalltemplate_p.h> |
| 193 | #include <private/qcastableas_p.h> |
| 194 | #include <private/qcastas_p.h> |
| 195 | #include <private/qcombinenodes_p.h> |
| 196 | #include <private/qcommentconstructor_p.h> |
| 197 | #include <private/qcommonnamespaces_p.h> |
| 198 | #include <private/qcommonsequencetypes_p.h> |
| 199 | #include <private/qcommonvalues_p.h> |
| 200 | #include <private/qcomputednamespaceconstructor_p.h> |
| 201 | #include <private/qcontextitem_p.h> |
| 202 | #include <private/qcopyof_p.h> |
| 203 | #include <private/qcurrentitemstore_p.h> |
| 204 | #include <private/qdebug_p.h> |
| 205 | #include <private/qdelegatingnamespaceresolver_p.h> |
| 206 | #include <private/qdocumentconstructor_p.h> |
| 207 | #include <private/qelementconstructor_p.h> |
| 208 | #include <private/qemptysequence_p.h> |
| 209 | #include <private/qemptysequencetype_p.h> |
| 210 | #include <private/qevaluationcache_p.h> |
| 211 | #include <private/qexpressionfactory_p.h> |
| 212 | #include <private/qexpressionsequence_p.h> |
| 213 | #include <private/qexpressionvariablereference_p.h> |
| 214 | #include <private/qexternalvariablereference_p.h> |
| 215 | #include <private/qforclause_p.h> |
| 216 | #include <private/qfunctioncall_p.h> |
| 217 | #include <private/qfunctionfactory_p.h> |
| 218 | #include <private/qfunctionsignature_p.h> |
| 219 | #include <private/qgeneralcomparison_p.h> |
| 220 | #include <private/qgenericpredicate_p.h> |
| 221 | #include <private/qgenericsequencetype_p.h> |
| 222 | #include <private/qifthenclause_p.h> |
| 223 | #include <private/qinstanceof_p.h> |
| 224 | #include <private/qletclause_p.h> |
| 225 | #include <private/qliteral_p.h> |
| 226 | #include <private/qlocalnametest_p.h> |
| 227 | #include <private/qnamespaceconstructor_p.h> |
| 228 | #include <private/qnamespacenametest_p.h> |
| 229 | #include <private/qncnameconstructor_p.h> |
| 230 | #include <private/qnodecomparison_p.h> |
| 231 | #include <private/qnodesort_p.h> |
| 232 | #include <private/qorderby_p.h> |
| 233 | #include <private/qorexpression_p.h> |
| 234 | #include <private/qparsercontext_p.h> |
| 235 | #include <private/qpath_p.h> |
| 236 | #include <private/qpatternistlocale_p.h> |
| 237 | #include <private/qpositionalvariablereference_p.h> |
| 238 | #include <private/qprocessinginstructionconstructor_p.h> |
| 239 | #include <private/qqnameconstructor_p.h> |
| 240 | #include <private/qqnametest_p.h> |
| 241 | #include <private/qqnamevalue_p.h> |
| 242 | #include <private/qquantifiedexpression_p.h> |
| 243 | #include <private/qrangeexpression_p.h> |
| 244 | #include <private/qrangevariablereference_p.h> |
| 245 | #include <private/qreturnorderby_p.h> |
| 246 | #include <private/qschemanumeric_p.h> |
| 247 | #include <private/qschematypefactory_p.h> |
| 248 | #include <private/qsimplecontentconstructor_p.h> |
| 249 | #include <private/qstaticbaseuristore_p.h> |
| 250 | #include <private/qstaticcompatibilitystore_p.h> |
| 251 | #include <private/qtemplateparameterreference_p.h> |
| 252 | #include <private/qtemplate_p.h> |
| 253 | #include <private/qtextnodeconstructor_p.h> |
| 254 | #include <private/qtokenizer_p.h> |
| 255 | #include <private/qtreatas_p.h> |
| 256 | #include <private/qtypechecker_p.h> |
| 257 | #include <private/qunaryexpression_p.h> |
| 258 | #include <private/qunresolvedvariablereference_p.h> |
| 259 | #include <private/quserfunctioncallsite_p.h> |
| 260 | #include <private/qvaluecomparison_p.h> |
| 261 | #include <private/qxpathhelper_p.h> |
| 262 | #include <private/qxsltsimplecontentconstructor_p.h> |
| 263 | |
| 264 | /* |
| 265 | * The cpp generated with bison 2.1 wants to |
| 266 | * redeclare the C-like prototypes of 'malloc' and 'free', so we avoid that. |
| 267 | */ |
| 268 | #define YYMALLOC malloc |
| 269 | #define YYFREE free |
| 270 | |
| 271 | QT_BEGIN_NAMESPACE |
| 272 | |
| 273 | /* Due to Qt's QT_BEGIN_NAMESPACE magic, we can't use `using namespace', for some |
| 274 | * undocumented reason. */ |
| 275 | namespace QPatternist |
| 276 | { |
| 277 | |
| 278 | /** |
| 279 | * "Macro that you define with #define in the Bison declarations |
| 280 | * section to request verbose, specific error message strings when |
| 281 | * yyerror is called." |
| 282 | */ |
| 283 | #define YYERROR_VERBOSE 1 |
| 284 | |
| 285 | #define YYLTYPE_IS_TRIVIAL 0 |
| 286 | #define YYINITDEPTH 1 |
| 287 | #define yyoverflow parseInfo->handleStackOverflow |
| 288 | |
| 289 | /* Suppresses `warning: "YYENABLE_NLS" is not defined` |
| 290 | * @c YYENABLE_NLS enables Bison internationalization, and we don't |
| 291 | * use that, so disable it. See the Bison Manual, section 4.5 Parser Internationalization. |
| 292 | */ |
| 293 | #define YYENABLE_NLS 0 |
| 294 | |
| 295 | static inline QSourceLocation fromYYLTYPE(const YYLTYPE &sourceLocator, |
| 296 | const ParserContext *const parseInfo) |
| 297 | { |
| 298 | return QSourceLocation(parseInfo->tokenizer->queryURI(), |
| 299 | sourceLocator.first_line, |
| 300 | sourceLocator.first_column); |
| 301 | } |
| 302 | |
| 303 | /** |
| 304 | * @internal |
| 305 | * @relates QXmlQuery |
| 306 | */ |
| 307 | typedef QFlags<QXmlQuery::QueryLanguage> QueryLanguages; |
| 308 | |
| 309 | /** |
| 310 | * @short Flags invalid expressions and declarations in the currently |
| 311 | * parsed language. |
| 312 | * |
| 313 | * Since this grammar is used for several languages: XQuery 1.0, XSL-T 2.0, and |
| 314 | * XPath 2.0 inside XSL-T, and field and selector patterns in W3C XML Schema's |
| 315 | * identity constraints, it is the union of all the constructs in these |
| 316 | * languages. However, when dealing with each language individually, we |
| 317 | * regularly need to disallow some expressions, such as direct element |
| 318 | * constructors when parsing XSL-T, or the typeswitch when parsing XPath. |
| 319 | * |
| 320 | * This is further complicated by that XSLTTokenizer sometimes generates code |
| 321 | * which is allowed in XQuery but not in XPath. For that reason the token |
| 322 | * INTERNAL is sometimes generated, which signals that an expression, for |
| 323 | * instance the @c let clause, should not be flagged as an error, because it's |
| 324 | * used for internal purposes. |
| 325 | * |
| 326 | * Hence, this function is called from each expression and declaration with @p |
| 327 | * allowedLanguages stating what languages it is allowed in. |
| 328 | * |
| 329 | * If @p isInternal is @c true, no error is raised. Otherwise, if the current |
| 330 | * language is not in @p allowedLanguages, an error is raised. |
| 331 | */ |
| 332 | static void allowedIn(const QueryLanguages allowedLanguages, |
| 333 | const ParserContext *const parseInfo, |
| 334 | const YYLTYPE &sourceLocator, |
| 335 | const bool isInternal = false) |
| 336 | { |
| 337 | /* We treat XPath 2.0 as a subset of XSL-T 2.0, so if XPath 2.0 is allowed |
| 338 | * and XSL-T is the language, it's ok. */ |
| 339 | if(!isInternal && |
| 340 | (!allowedLanguages.testFlag(flag: parseInfo->languageAccent) && !(allowedLanguages.testFlag(flag: QXmlQuery::XPath20) && parseInfo->languageAccent == QXmlQuery::XSLT20))) |
| 341 | { |
| 342 | |
| 343 | QString langName; |
| 344 | |
| 345 | switch(parseInfo->languageAccent) |
| 346 | { |
| 347 | case QXmlQuery::XPath20: |
| 348 | langName = QLatin1String("XPath 2.0" ); |
| 349 | break; |
| 350 | case QXmlQuery::XSLT20: |
| 351 | langName = QLatin1String("XSL-T 2.0" ); |
| 352 | break; |
| 353 | case QXmlQuery::XQuery10: |
| 354 | langName = QLatin1String("XQuery 1.0" ); |
| 355 | break; |
| 356 | case QXmlQuery::XmlSchema11IdentityConstraintSelector: |
| 357 | langName = QtXmlPatterns::tr(sourceText: "W3C XML Schema identity constraint selector" ); |
| 358 | break; |
| 359 | case QXmlQuery::XmlSchema11IdentityConstraintField: |
| 360 | langName = QtXmlPatterns::tr(sourceText: "W3C XML Schema identity constraint field" ); |
| 361 | break; |
| 362 | } |
| 363 | |
| 364 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A construct was encountered " |
| 365 | "which is disallowed in the current language(%1)." ).arg(a: langName), |
| 366 | errorCode: ReportContext::XPST0003, |
| 367 | sourceLocation: fromYYLTYPE(sourceLocator, parseInfo)); |
| 368 | |
| 369 | } |
| 370 | } |
| 371 | |
| 372 | static inline bool isVariableReference(const Expression::ID id) |
| 373 | { |
| 374 | return id == Expression::IDExpressionVariableReference |
| 375 | || id == Expression::IDRangeVariableReference |
| 376 | || id == Expression::IDArgumentReference; |
| 377 | } |
| 378 | |
| 379 | class ReflectYYLTYPE : public SourceLocationReflection |
| 380 | { |
| 381 | public: |
| 382 | inline ReflectYYLTYPE(const YYLTYPE &sourceLocator, |
| 383 | const ParserContext *const pi) : m_sl(sourceLocator) |
| 384 | , m_parseInfo(pi) |
| 385 | { |
| 386 | } |
| 387 | |
| 388 | virtual const SourceLocationReflection *actualReflection() const |
| 389 | { |
| 390 | return this; |
| 391 | } |
| 392 | |
| 393 | virtual QSourceLocation sourceLocation() const |
| 394 | { |
| 395 | return fromYYLTYPE(sourceLocator: m_sl, parseInfo: m_parseInfo); |
| 396 | } |
| 397 | |
| 398 | virtual QString description() const |
| 399 | { |
| 400 | Q_ASSERT(false); |
| 401 | return QString(); |
| 402 | } |
| 403 | |
| 404 | private: |
| 405 | const YYLTYPE &m_sl; |
| 406 | const ParserContext *const m_parseInfo; |
| 407 | }; |
| 408 | |
| 409 | /** |
| 410 | * @short Centralizes a translation string for the purpose of increasing consistency. |
| 411 | */ |
| 412 | static inline QString unknownType() |
| 413 | { |
| 414 | return QtXmlPatterns::tr(sourceText: "%1 is an unknown schema type." ); |
| 415 | } |
| 416 | |
| 417 | static inline Expression::Ptr create(Expression *const expr, |
| 418 | const YYLTYPE &sourceLocator, |
| 419 | const ParserContext *const parseInfo) |
| 420 | { |
| 421 | parseInfo->staticContext->addLocation(reflection: expr, location: fromYYLTYPE(sourceLocator, parseInfo)); |
| 422 | return Expression::Ptr(expr); |
| 423 | } |
| 424 | |
| 425 | static inline Template::Ptr create(Template *const expr, |
| 426 | const YYLTYPE &sourceLocator, |
| 427 | const ParserContext *const parseInfo) |
| 428 | { |
| 429 | parseInfo->staticContext->addLocation(reflection: expr, location: fromYYLTYPE(sourceLocator, parseInfo)); |
| 430 | return Template::Ptr(expr); |
| 431 | } |
| 432 | |
| 433 | static inline Expression::Ptr create(const Expression::Ptr &expr, |
| 434 | const YYLTYPE &sourceLocator, |
| 435 | const ParserContext *const parseInfo) |
| 436 | { |
| 437 | parseInfo->staticContext->addLocation(reflection: expr.data(), location: fromYYLTYPE(sourceLocator, parseInfo)); |
| 438 | return expr; |
| 439 | } |
| 440 | |
| 441 | static Expression::Ptr createSimpleContent(const Expression::Ptr &source, |
| 442 | const YYLTYPE &sourceLocator, |
| 443 | const ParserContext *const parseInfo) |
| 444 | { |
| 445 | return create(expr: parseInfo->isXSLT() ? new XSLTSimpleContentConstructor(source) : new SimpleContentConstructor(source), |
| 446 | sourceLocator, |
| 447 | parseInfo); |
| 448 | } |
| 449 | |
| 450 | static void loadPattern(const Expression::Ptr &matchPattern, |
| 451 | TemplatePattern::Vector &ourPatterns, |
| 452 | const TemplatePattern::ID id, |
| 453 | const PatternPriority priority, |
| 454 | const Template::Ptr &temp) |
| 455 | { |
| 456 | Q_ASSERT(temp); |
| 457 | |
| 458 | const PatternPriority effectivePriority = qIsNaN(d: priority) ? matchPattern->patternPriority() : priority; |
| 459 | |
| 460 | ourPatterns.append(t: TemplatePattern::Ptr(new TemplatePattern(matchPattern, effectivePriority, id, temp))); |
| 461 | } |
| 462 | |
| 463 | static Expression::Ptr typeCheckTemplateBody(const Expression::Ptr &body, |
| 464 | const SequenceType::Ptr &reqType, |
| 465 | const ParserContext *const parseInfo) |
| 466 | { |
| 467 | return TypeChecker::applyFunctionConversion(operand: body, reqType, |
| 468 | context: parseInfo->staticContext, |
| 469 | code: ReportContext::XTTE0505, |
| 470 | TypeChecker::Options(TypeChecker::AutomaticallyConvert | TypeChecker::GeneratePromotion)); |
| 471 | } |
| 472 | |
| 473 | static void registerNamedTemplate(const QXmlName &name, |
| 474 | const Expression::Ptr &body, |
| 475 | ParserContext *const parseInfo, |
| 476 | const YYLTYPE &sourceLocator, |
| 477 | const Template::Ptr &temp) |
| 478 | { |
| 479 | Template::Ptr &e = parseInfo->namedTemplates[name]; |
| 480 | |
| 481 | if(e) |
| 482 | { |
| 483 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A template with name %1 " |
| 484 | "has already been declared." ) |
| 485 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), |
| 486 | name)), |
| 487 | errorCode: ReportContext::XTSE0660, |
| 488 | sourceLocation: fromYYLTYPE(sourceLocator, parseInfo)); |
| 489 | } |
| 490 | else |
| 491 | { |
| 492 | e = temp; |
| 493 | e->body = body; |
| 494 | } |
| 495 | } |
| 496 | |
| 497 | /** |
| 498 | * @short Centralizes code for creating numeric literals. |
| 499 | */ |
| 500 | template<typename TNumberClass> |
| 501 | Expression::Ptr createNumericLiteral(const QString &in, |
| 502 | const YYLTYPE &sl, |
| 503 | const ParserContext *const parseInfo) |
| 504 | { |
| 505 | const Item num(TNumberClass::fromLexical(in)); |
| 506 | |
| 507 | if(num.template as<AtomicValue>()->hasError()) |
| 508 | { |
| 509 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is not a valid numeric literal." ) |
| 510 | .arg(a: formatData(data: in)), |
| 511 | errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: sl, parseInfo)); |
| 512 | return Expression::Ptr(); /* Avoid compiler warning. */ |
| 513 | } |
| 514 | else |
| 515 | return create(expr: new Literal(num), sourceLocator: sl, parseInfo); |
| 516 | } |
| 517 | |
| 518 | /** |
| 519 | * @short The generated Bison parser calls this function when there is a parse error. |
| 520 | * |
| 521 | * It is not called, nor should be, for logical errors(which the Bison not know about). For those, |
| 522 | * ReportContext::error() is called. |
| 523 | */ |
| 524 | static int XPatherror(YYLTYPE *sourceLocator, const ParserContext *const parseInfo, const char *const msg) |
| 525 | { |
| 526 | Q_UNUSED(sourceLocator); |
| 527 | Q_ASSERT(parseInfo); |
| 528 | |
| 529 | parseInfo->staticContext->error(message: escape(input: QLatin1String(msg)), errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: *sourceLocator, parseInfo)); |
| 530 | return 1; |
| 531 | } |
| 532 | |
| 533 | /** |
| 534 | * When we want to connect the OrderBy and ReturnOrderBy, it might be that we have other expressions, such |
| 535 | * as @c where and @c let inbetween. We need to continue through them. This function does that. |
| 536 | */ |
| 537 | static ReturnOrderBy *locateReturnClause(const Expression::Ptr &expr) |
| 538 | { |
| 539 | Q_ASSERT(expr); |
| 540 | |
| 541 | const Expression::ID id = expr->id(); |
| 542 | if(id == Expression::IDLetClause || id == Expression::IDIfThenClause || id == Expression::IDForClause) |
| 543 | return locateReturnClause(expr: expr->operands()[1]); |
| 544 | else if(id == Expression::IDReturnOrderBy) |
| 545 | return expr->as<ReturnOrderBy>(); |
| 546 | else |
| 547 | return 0; |
| 548 | } |
| 549 | |
| 550 | static inline bool isPredicate(const Expression::ID id) |
| 551 | { |
| 552 | return id == Expression::IDGenericPredicate || |
| 553 | id == Expression::IDFirstItemPredicate; |
| 554 | } |
| 555 | |
| 556 | /** |
| 557 | * Assumes expr is an AxisStep wrapped in some kind of predicates or paths. Filters |
| 558 | * through the predicates and returns the AxisStep. |
| 559 | */ |
| 560 | static Expression::Ptr findAxisStep(const Expression::Ptr &expr, |
| 561 | const bool throughStructures = true) |
| 562 | { |
| 563 | Q_ASSERT(expr); |
| 564 | |
| 565 | if(!throughStructures) |
| 566 | return expr; |
| 567 | |
| 568 | Expression *candidate = expr.data(); |
| 569 | Expression::ID id = candidate->id(); |
| 570 | |
| 571 | while(isPredicate(id) || id == Expression::IDPath) |
| 572 | { |
| 573 | const Expression::List &children = candidate->operands(); |
| 574 | if(children.isEmpty()) |
| 575 | return Expression::Ptr(); |
| 576 | else |
| 577 | { |
| 578 | candidate = children.first().data(); |
| 579 | id = candidate->id(); |
| 580 | } |
| 581 | } |
| 582 | |
| 583 | if(id == Expression::IDEmptySequence) |
| 584 | return Expression::Ptr(); |
| 585 | else |
| 586 | { |
| 587 | Q_ASSERT(candidate->is(Expression::IDAxisStep)); |
| 588 | return Expression::Ptr(candidate); |
| 589 | } |
| 590 | } |
| 591 | |
| 592 | static void changeToTopAxis(const Expression::Ptr &op) |
| 593 | { |
| 594 | /* This axis must have been written away by now. */ |
| 595 | Q_ASSERT(op->as<AxisStep>()->axis() != QXmlNodeModelIndex::AxisChild); |
| 596 | |
| 597 | if(op->as<AxisStep>()->axis() != QXmlNodeModelIndex::AxisSelf) |
| 598 | op->as<AxisStep>()->setAxis(QXmlNodeModelIndex::AxisAttributeOrTop); |
| 599 | } |
| 600 | |
| 601 | /** |
| 602 | * @short Writes @p operand1 and @p operand2, two operands in an XSL-T pattern, |
| 603 | * into an equivalent XPath expression. |
| 604 | * |
| 605 | * Essentially, the following rewrite is done: |
| 606 | * |
| 607 | * <tt> |
| 608 | * axis1::test1(a)/axis2::test2(b) |
| 609 | * => |
| 610 | * child-or-top::test2(b)[parent::test1(a)] |
| 611 | * </tt> |
| 612 | * |
| 613 | * Section 5.5.3 The Meaning of a Pattern talks about rewrites that are applied to |
| 614 | * only the first step in a pattern, but since we're doing rewrites more radically, |
| 615 | * its line of reasoning cannot be followed. |
| 616 | * |
| 617 | * Keep in mind the rewrites that non-terminal PatternStep do. |
| 618 | * |
| 619 | * @see createIdPatternPath() |
| 620 | */ |
| 621 | static inline Expression::Ptr createPatternPath(const Expression::Ptr &operand1, |
| 622 | const Expression::Ptr &operand2, |
| 623 | const QXmlNodeModelIndex::Axis axis, |
| 624 | const YYLTYPE &sl, |
| 625 | const ParserContext *const parseInfo) |
| 626 | { |
| 627 | const Expression::Ptr operandL(findAxisStep(expr: operand1, throughStructures: false)); |
| 628 | |
| 629 | if(operandL->is(i: Expression::IDAxisStep)) |
| 630 | operandL->as<AxisStep>()->setAxis(axis); |
| 631 | else |
| 632 | findAxisStep(expr: operand1)->as<AxisStep>()->setAxis(axis); |
| 633 | |
| 634 | return create(expr: GenericPredicate::create(sourceExpression: operand2, predicateExpression: operandL, |
| 635 | context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: sl, parseInfo)), sourceLocator: sl, parseInfo); |
| 636 | } |
| 637 | |
| 638 | /** |
| 639 | * @short Performs the same role as createPatternPath(), but is tailored |
| 640 | * for @c fn:key() and @c fn:id(). |
| 641 | * |
| 642 | * @c fn:key() and @c fn:id() can be part of path patterns(only as the first step, |
| 643 | * to be precise) and that poses a challenge to rewriting because what |
| 644 | * createPatternPath() is not possible to express, since the functions cannot be |
| 645 | * node tests. E.g, this rewrite is not possible: |
| 646 | * |
| 647 | * <tt> |
| 648 | * id-or-key/abc |
| 649 | * => |
| 650 | * child-or-top::abc[parent::id-or-key] |
| 651 | * </tt> |
| 652 | * |
| 653 | * Our approach is to rewrite like this: |
| 654 | * |
| 655 | * <tt> |
| 656 | * id-or-key/abc |
| 657 | * => |
| 658 | * child-or-top::abc[parent::node is id-or-key] |
| 659 | * </tt> |
| 660 | * |
| 661 | * @p operand1 is the call to @c fn:key() or @c fn:id(), @p operand2 |
| 662 | * the right operand, and @p axis the target axis to rewrite to. |
| 663 | * |
| 664 | * @see createPatternPath() |
| 665 | */ |
| 666 | static inline Expression::Ptr createIdPatternPath(const Expression::Ptr &operand1, |
| 667 | const Expression::Ptr &operand2, |
| 668 | const QXmlNodeModelIndex::Axis axis, |
| 669 | const YYLTYPE &sl, |
| 670 | const ParserContext *const parseInfo) |
| 671 | { |
| 672 | const Expression::Ptr operandR(findAxisStep(expr: operand2)); |
| 673 | Q_ASSERT(operandR); |
| 674 | changeToTopAxis(op: operandR); |
| 675 | |
| 676 | const Expression::Ptr parentStep(create(expr: new AxisStep(axis, BuiltinTypes::node), |
| 677 | sourceLocator: sl, |
| 678 | parseInfo)); |
| 679 | const Expression::Ptr isComp(create(expr: new NodeComparison(parentStep, |
| 680 | QXmlNodeModelIndex::Is, |
| 681 | operand1), |
| 682 | sourceLocator: sl, |
| 683 | parseInfo)); |
| 684 | |
| 685 | return create(expr: GenericPredicate::create(sourceExpression: operandR, predicateExpression: isComp, |
| 686 | context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: sl, parseInfo)), sourceLocator: sl, parseInfo); |
| 687 | } |
| 688 | |
| 689 | /** |
| 690 | * @short Centralizes a translation message, for the |
| 691 | * purpose of consistency and modularization. |
| 692 | */ |
| 693 | static inline QString prologMessage(const char *const msg) |
| 694 | { |
| 695 | Q_ASSERT(msg); |
| 696 | return QtXmlPatterns::tr(sourceText: "Only one %1 declaration can occur in the query prolog." ).arg(a: formatKeyword(keyword: msg)); |
| 697 | } |
| 698 | |
| 699 | /** |
| 700 | * @short Resolves against the static base URI and checks that @p collation |
| 701 | * is a supported Unicode Collation. |
| 702 | * |
| 703 | * "If a default collation declaration specifies a collation by a |
| 704 | * relative URI, that relative URI is resolved to an absolute |
| 705 | * URI using the base URI in the static context." |
| 706 | * |
| 707 | * @returns the Unicode Collation properly resolved, if @p collation is a valid collation |
| 708 | */ |
| 709 | template<const ReportContext::ErrorCode errorCode> |
| 710 | static QUrl resolveAndCheckCollation(const QString &collation, |
| 711 | const ParserContext *const parseInfo, |
| 712 | const YYLTYPE &sl) |
| 713 | { |
| 714 | Q_ASSERT(parseInfo); |
| 715 | const ReflectYYLTYPE ryy(sl, parseInfo); |
| 716 | |
| 717 | QUrl uri(AnyURI::toQUrl<ReportContext::XQST0046>(value: collation, context: parseInfo->staticContext, r: &ryy)); |
| 718 | |
| 719 | if(uri.isRelative()) |
| 720 | uri = parseInfo->staticContext->baseURI().resolved(relative: uri); |
| 721 | |
| 722 | XPathHelper::checkCollationSupport<errorCode>(uri.toString(), parseInfo->staticContext, &ryy); |
| 723 | |
| 724 | return uri; |
| 725 | } |
| 726 | |
| 727 | /* The Bison generated parser declares macros that aren't used |
| 728 | * so suppress the warnings by fake usage of them. |
| 729 | * |
| 730 | * We do the same for some more defines in the first action. */ |
| 731 | #if defined(YYLSP_NEEDED) \ |
| 732 | || defined(YYBISON) \ |
| 733 | || defined(YYBISON_VERSION) \ |
| 734 | || defined(YYPURE) \ |
| 735 | || defined(yydebug) \ |
| 736 | || defined(YYSKELETON_NAME) |
| 737 | #endif |
| 738 | |
| 739 | /** |
| 740 | * Wraps @p operand with a CopyOf in case it makes any difference. |
| 741 | * |
| 742 | * There is no need to wrap the return value in a call to create(), it's |
| 743 | * already done. |
| 744 | */ |
| 745 | static Expression::Ptr createCopyOf(const Expression::Ptr &operand, |
| 746 | const ParserContext *const parseInfo, |
| 747 | const YYLTYPE &sl) |
| 748 | { |
| 749 | return create(expr: new CopyOf(operand, parseInfo->inheritNamespacesMode, |
| 750 | parseInfo->preserveNamespacesMode), sourceLocator: sl, parseInfo); |
| 751 | } |
| 752 | |
| 753 | static Expression::Ptr createCompatStore(const Expression::Ptr &expr, |
| 754 | const YYLTYPE &sourceLocator, |
| 755 | const ParserContext *const parseInfo) |
| 756 | { |
| 757 | return create(expr: new StaticCompatibilityStore(expr), sourceLocator, parseInfo); |
| 758 | } |
| 759 | |
| 760 | /** |
| 761 | * @short Creates an Expression that corresponds to <tt>/</tt>. This is literally |
| 762 | * <tt>fn:root(self::node()) treat as document-node()</tt>. |
| 763 | */ |
| 764 | static Expression::Ptr createRootExpression(const ParserContext *const parseInfo, |
| 765 | const YYLTYPE &sl) |
| 766 | { |
| 767 | Q_ASSERT(parseInfo); |
| 768 | const QXmlName name(StandardNamespaces::fn, StandardLocalNames::root); |
| 769 | |
| 770 | Expression::List args; |
| 771 | args.append(t: create(expr: new ContextItem(), sourceLocator: sl, parseInfo)); |
| 772 | |
| 773 | const ReflectYYLTYPE ryy(sl, parseInfo); |
| 774 | |
| 775 | const Expression::Ptr fnRoot(parseInfo->staticContext->functionSignatures() |
| 776 | ->createFunctionCall(name, arguments: args, context: parseInfo->staticContext, r: &ryy)); |
| 777 | Q_ASSERT(fnRoot); |
| 778 | |
| 779 | return create(expr: new TreatAs(create(expr: fnRoot, sourceLocator: sl, parseInfo), CommonSequenceTypes::ExactlyOneDocumentNode), sourceLocator: sl, parseInfo); |
| 780 | } |
| 781 | |
| 782 | static int XPathlex(YYSTYPE *lexVal, YYLTYPE *sourceLocator, const ParserContext *const parseInfo) |
| 783 | { |
| 784 | #ifdef Patternist_DEBUG_PARSER |
| 785 | /** |
| 786 | * "External integer variable set to zero by default. If yydebug |
| 787 | * is given a nonzero value, the parser will output information on |
| 788 | * input symbols and parser action. See section Debugging Your Parser." |
| 789 | */ |
| 790 | # define YYDEBUG 1 |
| 791 | |
| 792 | extern int XPathdebug; |
| 793 | XPathdebug = 1; |
| 794 | #endif |
| 795 | |
| 796 | Q_ASSERT(parseInfo); |
| 797 | |
| 798 | const Tokenizer::Token tok(parseInfo->tokenizer->nextToken(sourceLocator)); |
| 799 | |
| 800 | (*lexVal).sval = tok.value; |
| 801 | |
| 802 | return static_cast<int>(tok.type); |
| 803 | } |
| 804 | |
| 805 | /** |
| 806 | * @short Creates a path expression which contains the step <tt>//</tt> between |
| 807 | * @p begin and and @p end. |
| 808 | * |
| 809 | * <tt>begin//end</tt> is a short form for: <tt>begin/descendant-or-self::node()/end</tt> |
| 810 | * |
| 811 | * This will be compiled as two-path expression: <tt>(/)/(//.)/step/</tt> |
| 812 | */ |
| 813 | static Expression::Ptr createSlashSlashPath(const Expression::Ptr &begin, |
| 814 | const Expression::Ptr &end, |
| 815 | const YYLTYPE &sourceLocator, |
| 816 | const ParserContext *const parseInfo) |
| 817 | { |
| 818 | const Expression::Ptr twoSlash(create(expr: new AxisStep(QXmlNodeModelIndex::AxisDescendantOrSelf, BuiltinTypes::node), sourceLocator, parseInfo)); |
| 819 | const Expression::Ptr p1(create(expr: new Path(begin, twoSlash), sourceLocator, parseInfo)); |
| 820 | |
| 821 | return create(expr: new Path(p1, end), sourceLocator, parseInfo); |
| 822 | } |
| 823 | |
| 824 | /** |
| 825 | * @short Creates a call to <tt>fn:concat()</tt> with @p args as the arguments. |
| 826 | */ |
| 827 | static inline Expression::Ptr createConcatFN(const ParserContext *const parseInfo, |
| 828 | const Expression::List &args, |
| 829 | const YYLTYPE &sourceLocator) |
| 830 | { |
| 831 | Q_ASSERT(parseInfo); |
| 832 | const QXmlName name(StandardNamespaces::fn, StandardLocalNames::concat); |
| 833 | const ReflectYYLTYPE ryy(sourceLocator, parseInfo); |
| 834 | |
| 835 | return create(expr: parseInfo->staticContext->functionSignatures()->createFunctionCall(name, arguments: args, context: parseInfo->staticContext, r: &ryy), |
| 836 | sourceLocator, parseInfo); |
| 837 | } |
| 838 | |
| 839 | static inline Expression::Ptr createDirAttributeValue(const Expression::List &content, |
| 840 | const ParserContext *const parseInfo, |
| 841 | const YYLTYPE &sourceLocator) |
| 842 | { |
| 843 | if(content.isEmpty()) |
| 844 | return create(expr: new EmptySequence(), sourceLocator, parseInfo); |
| 845 | else if(content.size() == 1) |
| 846 | return content.first(); |
| 847 | else |
| 848 | return createConcatFN(parseInfo, args: content, sourceLocator); |
| 849 | } |
| 850 | |
| 851 | /** |
| 852 | * @short Checks for variable initialization circularity. |
| 853 | * |
| 854 | * "A recursive function that checks for recursion is full of ironies." |
| 855 | * |
| 856 | * -- The Salsa Master |
| 857 | * |
| 858 | * Issues an error via @p parseInfo's StaticContext if the initialization |
| 859 | * expression @p checkee for the global variable @p var, contains a variable |
| 860 | * reference to @p var. That is, if there's a circularity. |
| 861 | * |
| 862 | * @see <a href="http://www.w3.org/TR/xquery/#ERRXQST0054">XQuery 1.0: An XML |
| 863 | * Query Language, err:XQST0054</a> |
| 864 | */ |
| 865 | static void checkVariableCircularity(const VariableDeclaration::Ptr &var, |
| 866 | const Expression::Ptr &checkee, |
| 867 | const VariableDeclaration::Type type, |
| 868 | FunctionSignature::List &signList, |
| 869 | const ParserContext *const parseInfo) |
| 870 | { |
| 871 | Q_ASSERT(var); |
| 872 | Q_ASSERT(checkee); |
| 873 | Q_ASSERT(parseInfo); |
| 874 | |
| 875 | const Expression::ID id = checkee->id(); |
| 876 | |
| 877 | if(id == Expression::IDExpressionVariableReference) |
| 878 | { |
| 879 | const ExpressionVariableReference *const ref = |
| 880 | static_cast<const ExpressionVariableReference *>(checkee.data()); |
| 881 | |
| 882 | if(var->slot == ref->slot() && type == ref->variableDeclaration()->type) |
| 883 | { |
| 884 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The initialization of variable %1 " |
| 885 | "depends on itself" ).arg(a: formatKeyword(var, np: parseInfo->staticContext->namePool())), |
| 886 | errorCode: parseInfo->isXSLT() ? ReportContext::XTDE0640 : ReportContext::XQST0054, reflection: ref); |
| 887 | return; |
| 888 | } |
| 889 | else |
| 890 | { |
| 891 | /* If the variable we're checking is below another variable, it can be a recursive |
| 892 | * dependency through functions, so we need to check variable references too. */ |
| 893 | checkVariableCircularity(var, checkee: ref->sourceExpression(), type, signList, parseInfo); |
| 894 | return; |
| 895 | } |
| 896 | } |
| 897 | else if(id == Expression::IDUserFunctionCallsite) |
| 898 | { |
| 899 | const UserFunctionCallsite::Ptr callsite(checkee); |
| 900 | const FunctionSignature::Ptr sign(callsite->callTargetDescription()); |
| 901 | const FunctionSignature::List::const_iterator end(signList.constEnd()); |
| 902 | FunctionSignature::List::const_iterator it(signList.constBegin()); |
| 903 | bool noMatch = true; |
| 904 | |
| 905 | for(; it != end; ++it) |
| 906 | { |
| 907 | if(*it == sign) |
| 908 | { |
| 909 | /* The variable we're checking is depending on a function that's recursive. The |
| 910 | * user has written a weird query, in other words. Since it's the second time |
| 911 | * we've encountered a callsite, we now skip it. */ |
| 912 | noMatch = false; |
| 913 | break; |
| 914 | } |
| 915 | } |
| 916 | |
| 917 | if(noMatch) |
| 918 | { |
| 919 | signList.append(t: sign); |
| 920 | /* Check the body of the function being called. */ |
| 921 | checkVariableCircularity(var, checkee: callsite->body(), type, signList, parseInfo); |
| 922 | } |
| 923 | /* Continue with the operands, such that we also check the arguments of the callsite. */ |
| 924 | } |
| 925 | else if(id == Expression::IDUnresolvedVariableReference) |
| 926 | { |
| 927 | /* We're called before it has rewritten itself. */ |
| 928 | checkVariableCircularity(var, checkee: checkee->as<UnresolvedVariableReference>()->replacement(), type, signList, parseInfo); |
| 929 | } |
| 930 | |
| 931 | /* Check the operands. */ |
| 932 | const Expression::List ops(checkee->operands()); |
| 933 | if(ops.isEmpty()) |
| 934 | return; |
| 935 | |
| 936 | const Expression::List::const_iterator end(ops.constEnd()); |
| 937 | Expression::List::const_iterator it(ops.constBegin()); |
| 938 | |
| 939 | for(; it != end; ++it) |
| 940 | checkVariableCircularity(var, checkee: *it, type, signList, parseInfo); |
| 941 | } |
| 942 | |
| 943 | static void variableUnavailable(const QXmlName &variableName, |
| 944 | const ParserContext *const parseInfo, |
| 945 | const YYLTYPE &location) |
| 946 | { |
| 947 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "No variable with name %1 exists" ) |
| 948 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: variableName)), |
| 949 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: location, parseInfo)); |
| 950 | } |
| 951 | |
| 952 | /** |
| 953 | * The Cardinality in a TypeDeclaration for a variable in a quantification has no effect, |
| 954 | * and this function ensures this by changing @p type to Cardinality Cardinality::zeroOrMore(). |
| 955 | * |
| 956 | * @see <a href="http://www.w3.org/Bugs/Public/show_bug.cgi?id=3305">Bugzilla Bug 3305 |
| 957 | * Cardinality + on range variables</a> |
| 958 | * @see ParserContext::finalizePushedVariable() |
| 959 | */ |
| 960 | static inline SequenceType::Ptr quantificationType(const SequenceType::Ptr &type) |
| 961 | { |
| 962 | Q_ASSERT(type); |
| 963 | return makeGenericSequenceType(itemType: type->itemType(), cardinality: Cardinality::zeroOrMore()); |
| 964 | } |
| 965 | |
| 966 | /** |
| 967 | * @p seqType and @p expr may be @c null. |
| 968 | */ |
| 969 | static Expression::Ptr pushVariable(const QXmlName name, |
| 970 | const SequenceType::Ptr &seqType, |
| 971 | const Expression::Ptr &expr, |
| 972 | const VariableDeclaration::Type type, |
| 973 | const YYLTYPE &sourceLocator, |
| 974 | ParserContext *const parseInfo, |
| 975 | const bool checkSource = true) |
| 976 | { |
| 977 | Q_ASSERT(!name.isNull()); |
| 978 | Q_ASSERT(parseInfo); |
| 979 | |
| 980 | /* -2 will cause Q_ASSERTs to trigger if it isn't changed. */ |
| 981 | VariableSlotID slot = -2; |
| 982 | |
| 983 | switch(type) |
| 984 | { |
| 985 | case VariableDeclaration::FunctionArgument: |
| 986 | case VariableDeclaration::ExpressionVariable: |
| 987 | { |
| 988 | slot = parseInfo->allocateExpressionSlot(); |
| 989 | break; |
| 990 | } |
| 991 | case VariableDeclaration::GlobalVariable: |
| 992 | { |
| 993 | slot = parseInfo->allocateGlobalVariableSlot(); |
| 994 | break; |
| 995 | } |
| 996 | case VariableDeclaration::RangeVariable: |
| 997 | { |
| 998 | slot = parseInfo->staticContext->allocateRangeSlot(); |
| 999 | break; |
| 1000 | } |
| 1001 | case VariableDeclaration::PositionalVariable: |
| 1002 | { |
| 1003 | slot = parseInfo->allocatePositionalSlot(); |
| 1004 | break; |
| 1005 | } |
| 1006 | case VariableDeclaration::TemplateParameter: |
| 1007 | /* Fallthrough. We do nothing, template parameters |
| 1008 | * doesn't use context slots at all, they're hashed |
| 1009 | * on the name. */ |
| 1010 | case VariableDeclaration::ExternalVariable: |
| 1011 | /* We do nothing, external variables doesn't use |
| 1012 | *context slots/stack frames at all. */ |
| 1013 | ; |
| 1014 | } |
| 1015 | |
| 1016 | const VariableDeclaration::Ptr var(new VariableDeclaration(name, slot, type, seqType)); |
| 1017 | |
| 1018 | Expression::Ptr checked; |
| 1019 | |
| 1020 | if(checkSource && seqType) |
| 1021 | { |
| 1022 | if(expr) |
| 1023 | { |
| 1024 | /* We only want to add conversion for function arguments, and variables |
| 1025 | * if we're XSL-T. |
| 1026 | * |
| 1027 | * We unconditionally skip TypeChecker::CheckFocus because the StaticContext we |
| 1028 | * pass hasn't set up the focus yet, since that's the parent's responsibility. */ |
| 1029 | const TypeChecker::Options options(( type == VariableDeclaration::FunctionArgument |
| 1030 | || type == VariableDeclaration::TemplateParameter |
| 1031 | || parseInfo->isXSLT()) |
| 1032 | ? TypeChecker::AutomaticallyConvert : TypeChecker::Options()); |
| 1033 | |
| 1034 | checked = TypeChecker::applyFunctionConversion(operand: expr, reqType: seqType, context: parseInfo->staticContext, |
| 1035 | code: parseInfo->isXSLT() ? ReportContext::XTTE0570 : ReportContext::XPTY0004, |
| 1036 | options); |
| 1037 | } |
| 1038 | } |
| 1039 | else |
| 1040 | checked = expr; |
| 1041 | |
| 1042 | /* Add an evaluation cache for all expression variables. No EvaluationCache is needed for |
| 1043 | * positional variables because in the end they are calls to Iterator::position(). Similarly, |
| 1044 | * no need to cache range variables either because they are calls to DynamicContext::rangeVariable(). |
| 1045 | * |
| 1046 | * We don't do it for function arguments because the Expression being cached depends -- it depends |
| 1047 | * on the callsite. UserFunctionCallsite is responsible for the evaluation caches in that case. |
| 1048 | * |
| 1049 | * In some cases the EvaluationCache instance isn't necessary, but in those cases EvaluationCache |
| 1050 | * optimizes itself away. */ |
| 1051 | if(type == VariableDeclaration::ExpressionVariable) |
| 1052 | checked = create(expr: new EvaluationCache<false>(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); |
| 1053 | else if(type == VariableDeclaration::GlobalVariable) |
| 1054 | checked = create(expr: new EvaluationCache<true>(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); |
| 1055 | |
| 1056 | var->setExpression(checked); |
| 1057 | |
| 1058 | parseInfo->variables.push(t: var); |
| 1059 | return checked; |
| 1060 | } |
| 1061 | |
| 1062 | static inline VariableDeclaration::Ptr variableByName(const QXmlName name, |
| 1063 | const ParserContext *const parseInfo) |
| 1064 | { |
| 1065 | Q_ASSERT(!name.isNull()); |
| 1066 | Q_ASSERT(parseInfo); |
| 1067 | |
| 1068 | /* We walk the list backwards. */ |
| 1069 | const VariableDeclaration::Stack::const_iterator start(parseInfo->variables.constBegin()); |
| 1070 | VariableDeclaration::Stack::const_iterator it(parseInfo->variables.constEnd()); |
| 1071 | |
| 1072 | while(it != start) |
| 1073 | { |
| 1074 | --it; |
| 1075 | Q_ASSERT(*it); |
| 1076 | if((*it)->name == name) |
| 1077 | return *it; |
| 1078 | } |
| 1079 | |
| 1080 | return VariableDeclaration::Ptr(); |
| 1081 | } |
| 1082 | |
| 1083 | static Expression::Ptr resolveVariable(const QXmlName &name, |
| 1084 | const YYLTYPE &sourceLocator, |
| 1085 | ParserContext *const parseInfo, |
| 1086 | const bool raiseErrorOnUnavailability) |
| 1087 | { |
| 1088 | const VariableDeclaration::Ptr var(variableByName(name, parseInfo)); |
| 1089 | Expression::Ptr retval; |
| 1090 | |
| 1091 | if(var && var->type != VariableDeclaration::ExternalVariable) |
| 1092 | { |
| 1093 | switch(var->type) |
| 1094 | { |
| 1095 | case VariableDeclaration::RangeVariable: |
| 1096 | { |
| 1097 | retval = create(expr: new RangeVariableReference(var->expression(), var->slot), sourceLocator, parseInfo); |
| 1098 | break; |
| 1099 | } |
| 1100 | case VariableDeclaration::GlobalVariable: |
| 1101 | /* Fallthrough. From the perspective of an ExpressionVariableReference, it can't tell |
| 1102 | * a difference between a global and a local expression variable. However, the cache |
| 1103 | * mechanism must. */ |
| 1104 | case VariableDeclaration::ExpressionVariable: |
| 1105 | { |
| 1106 | retval = create(expr: new ExpressionVariableReference(var->slot, var.data()), sourceLocator, parseInfo); |
| 1107 | break; |
| 1108 | } |
| 1109 | case VariableDeclaration::FunctionArgument: |
| 1110 | { |
| 1111 | retval = create(expr: new ArgumentReference(var->sequenceType, var->slot), sourceLocator, parseInfo); |
| 1112 | break; |
| 1113 | } |
| 1114 | case VariableDeclaration::PositionalVariable: |
| 1115 | { |
| 1116 | retval = create(expr: new PositionalVariableReference(var->slot), sourceLocator, parseInfo); |
| 1117 | break; |
| 1118 | } |
| 1119 | case VariableDeclaration::TemplateParameter: |
| 1120 | { |
| 1121 | retval = create(expr: new TemplateParameterReference(var.data()), sourceLocator, parseInfo); |
| 1122 | break; |
| 1123 | } |
| 1124 | case VariableDeclaration::ExternalVariable: |
| 1125 | /* This code path will never be hit, but the case |
| 1126 | * label silences a warning. See above. */ |
| 1127 | ; |
| 1128 | } |
| 1129 | Q_ASSERT(retval); |
| 1130 | var->references.append(t: retval); |
| 1131 | } |
| 1132 | else |
| 1133 | { |
| 1134 | /* Let's see if your external variable loader can provide us with one. */ |
| 1135 | const SequenceType::Ptr varType(parseInfo->staticContext-> |
| 1136 | externalVariableLoader()->announceExternalVariable(name, declaredType: CommonSequenceTypes::ZeroOrMoreItems)); |
| 1137 | |
| 1138 | if(varType) |
| 1139 | { |
| 1140 | const Expression::Ptr extRef(create(expr: new ExternalVariableReference(name, varType), sourceLocator, parseInfo)); |
| 1141 | const Expression::Ptr checked(TypeChecker::applyFunctionConversion(operand: extRef, reqType: varType, context: parseInfo->staticContext)); |
| 1142 | retval = checked; |
| 1143 | } |
| 1144 | else if(!raiseErrorOnUnavailability && parseInfo->isXSLT()) |
| 1145 | { |
| 1146 | /* In XSL-T, global variables are in scope for the whole |
| 1147 | * stylesheet, so we must resolve this first at the end. */ |
| 1148 | retval = create(expr: new UnresolvedVariableReference(name), sourceLocator, parseInfo); |
| 1149 | parseInfo->unresolvedVariableReferences.insert(akey: name, avalue: retval); |
| 1150 | } |
| 1151 | else |
| 1152 | variableUnavailable(variableName: name, parseInfo, location: sourceLocator); |
| 1153 | } |
| 1154 | |
| 1155 | return retval; |
| 1156 | } |
| 1157 | |
| 1158 | static Expression::Ptr createReturnOrderBy(const OrderSpecTransfer::List &orderSpecTransfer, |
| 1159 | const Expression::Ptr &returnExpr, |
| 1160 | const OrderBy::Stability stability, |
| 1161 | const YYLTYPE &sourceLocator, |
| 1162 | const ParserContext *const parseInfo) |
| 1163 | { |
| 1164 | // TODO do resize(orderSpec.size() + 1) |
| 1165 | Expression::List exprs; |
| 1166 | OrderBy::OrderSpec::Vector orderSpecs; |
| 1167 | |
| 1168 | exprs.append(t: returnExpr); |
| 1169 | |
| 1170 | const int len = orderSpecTransfer.size(); |
| 1171 | |
| 1172 | for(int i = 0; i < len; ++i) |
| 1173 | { |
| 1174 | exprs.append(t: orderSpecTransfer.at(i).expression); |
| 1175 | orderSpecs.append(t: orderSpecTransfer.at(i).orderSpec); |
| 1176 | } |
| 1177 | |
| 1178 | return create(expr: new ReturnOrderBy(stability, orderSpecs, exprs), sourceLocator, parseInfo); |
| 1179 | } |
| 1180 | |
| 1181 | |
| 1182 | #line 1134 "qquerytransformparser.cpp" /* yacc.c:337 */ |
| 1183 | # ifndef YY_NULLPTR |
| 1184 | # if defined __cplusplus |
| 1185 | # if 201103L <= __cplusplus |
| 1186 | # define YY_NULLPTR nullptr |
| 1187 | # else |
| 1188 | # define YY_NULLPTR 0 |
| 1189 | # endif |
| 1190 | # else |
| 1191 | # define YY_NULLPTR ((void*)0) |
| 1192 | # endif |
| 1193 | # endif |
| 1194 | |
| 1195 | /* Enabling verbose error messages. */ |
| 1196 | #ifdef YYERROR_VERBOSE |
| 1197 | # undef YYERROR_VERBOSE |
| 1198 | # define YYERROR_VERBOSE 1 |
| 1199 | #else |
| 1200 | # define YYERROR_VERBOSE 1 |
| 1201 | #endif |
| 1202 | |
| 1203 | /* In a future release of Bison, this section will be replaced |
| 1204 | by #include "qquerytransformparser_p.h". */ |
| 1205 | #ifndef YY_XPATH_QQUERYTRANSFORMPARSER_P_H_INCLUDED |
| 1206 | # define YY_XPATH_QQUERYTRANSFORMPARSER_P_H_INCLUDED |
| 1207 | /* Debug traces. */ |
| 1208 | #ifndef XPATHDEBUG |
| 1209 | # if defined YYDEBUG |
| 1210 | # if YYDEBUG |
| 1211 | # define XPATHDEBUG 1 |
| 1212 | # else |
| 1213 | # define XPATHDEBUG 0 |
| 1214 | # endif |
| 1215 | # else /* ! defined YYDEBUG */ |
| 1216 | # define XPATHDEBUG 0 |
| 1217 | # endif /* ! defined YYDEBUG */ |
| 1218 | #endif /* ! defined XPATHDEBUG */ |
| 1219 | #if XPATHDEBUG |
| 1220 | extern int XPathdebug; |
| 1221 | #endif |
| 1222 | |
| 1223 | /* Token type. */ |
| 1224 | #ifndef XPATHTOKENTYPE |
| 1225 | # define XPATHTOKENTYPE |
| 1226 | enum XPathtokentype |
| 1227 | { |
| 1228 | T_END_OF_FILE = 0, |
| 1229 | T_STRING_LITERAL = 258, |
| 1230 | T_NON_BOUNDARY_WS = 259, |
| 1231 | T_XPATH2_STRING_LITERAL = 260, |
| 1232 | T_QNAME = 261, |
| 1233 | T_NCNAME = 262, |
| 1234 | T_CLARK_NAME = 263, |
| 1235 | T_ANY_LOCAL_NAME = 264, |
| 1236 | T_ANY_PREFIX = 265, |
| 1237 | T_NUMBER = 266, |
| 1238 | T_XPATH2_NUMBER = 267, |
| 1239 | T_ANCESTOR = 268, |
| 1240 | T_ANCESTOR_OR_SELF = 269, |
| 1241 | T_AND = 270, |
| 1242 | T_APOS = 271, |
| 1243 | T_APPLY_TEMPLATE = 272, |
| 1244 | T_AS = 273, |
| 1245 | T_ASCENDING = 274, |
| 1246 | T_ASSIGN = 275, |
| 1247 | T_AT = 276, |
| 1248 | T_AT_SIGN = 277, |
| 1249 | T_ATTRIBUTE = 278, |
| 1250 | T_AVT = 279, |
| 1251 | T_BAR = 280, |
| 1252 | T_BASEURI = 281, |
| 1253 | T_BEGIN_END_TAG = 282, |
| 1254 | T_BOUNDARY_SPACE = 283, |
| 1255 | T_BY = 284, |
| 1256 | T_CALL_TEMPLATE = 285, |
| 1257 | T_CASE = 286, |
| 1258 | T_CASTABLE = 287, |
| 1259 | T_CAST = 288, |
| 1260 | T_CHILD = 289, |
| 1261 | T_COLLATION = 290, |
| 1262 | T_COLONCOLON = 291, |
| 1263 | T_COMMA = 292, |
| 1264 | T_COMMENT = 293, |
| 1265 | T_COMMENT_START = 294, |
| 1266 | T_CONSTRUCTION = 295, |
| 1267 | T_COPY_NAMESPACES = 296, |
| 1268 | T_CURLY_LBRACE = 297, |
| 1269 | T_CURLY_RBRACE = 298, |
| 1270 | T_DECLARE = 299, |
| 1271 | T_DEFAULT = 300, |
| 1272 | T_DESCENDANT = 301, |
| 1273 | T_DESCENDANT_OR_SELF = 302, |
| 1274 | T_DESCENDING = 303, |
| 1275 | T_DIV = 304, |
| 1276 | T_DOCUMENT = 305, |
| 1277 | T_DOCUMENT_NODE = 306, |
| 1278 | T_DOLLAR = 307, |
| 1279 | T_DOT = 308, |
| 1280 | T_DOTDOT = 309, |
| 1281 | T_ELEMENT = 310, |
| 1282 | T_ELSE = 311, |
| 1283 | T_EMPTY = 312, |
| 1284 | T_EMPTY_SEQUENCE = 313, |
| 1285 | T_ENCODING = 314, |
| 1286 | T_END_SORT = 315, |
| 1287 | T_EQ = 316, |
| 1288 | T_ERROR = 317, |
| 1289 | T_EVERY = 318, |
| 1290 | T_EXCEPT = 319, |
| 1291 | T_EXTERNAL = 320, |
| 1292 | T_FOLLOWING = 321, |
| 1293 | T_FOLLOWING_SIBLING = 322, |
| 1294 | T_FOLLOWS = 323, |
| 1295 | T_FOR_APPLY_TEMPLATE = 324, |
| 1296 | T_FOR = 325, |
| 1297 | T_FUNCTION = 326, |
| 1298 | T_GE = 327, |
| 1299 | T_G_EQ = 328, |
| 1300 | T_G_GE = 329, |
| 1301 | T_G_GT = 330, |
| 1302 | T_G_LE = 331, |
| 1303 | T_G_LT = 332, |
| 1304 | T_G_NE = 333, |
| 1305 | T_GREATEST = 334, |
| 1306 | T_GT = 335, |
| 1307 | T_IDIV = 336, |
| 1308 | T_IF = 337, |
| 1309 | T_IMPORT = 338, |
| 1310 | T_INHERIT = 339, |
| 1311 | T_IN = 340, |
| 1312 | T_INSTANCE = 341, |
| 1313 | T_INTERSECT = 342, |
| 1314 | T_IS = 343, |
| 1315 | T_ITEM = 344, |
| 1316 | T_LAX = 345, |
| 1317 | T_LBRACKET = 346, |
| 1318 | T_LEAST = 347, |
| 1319 | T_LE = 348, |
| 1320 | T_LET = 349, |
| 1321 | T_LPAREN = 350, |
| 1322 | T_LT = 351, |
| 1323 | T_MAP = 352, |
| 1324 | T_MATCHES = 353, |
| 1325 | T_MINUS = 354, |
| 1326 | T_MODE = 355, |
| 1327 | T_MOD = 356, |
| 1328 | T_MODULE = 357, |
| 1329 | T_NAME = 358, |
| 1330 | T_NAMESPACE = 359, |
| 1331 | T_NE = 360, |
| 1332 | T_NODE = 361, |
| 1333 | T_NO_INHERIT = 362, |
| 1334 | T_NO_PRESERVE = 363, |
| 1335 | T_OF = 364, |
| 1336 | T_OPTION = 365, |
| 1337 | T_ORDERED = 366, |
| 1338 | T_ORDERING = 367, |
| 1339 | T_ORDER = 368, |
| 1340 | T_OR = 369, |
| 1341 | T_PARENT = 370, |
| 1342 | T_PI_START = 371, |
| 1343 | T_PLUS = 372, |
| 1344 | T_POSITION_SET = 373, |
| 1345 | T_PRAGMA_END = 374, |
| 1346 | T_PRAGMA_START = 375, |
| 1347 | T_PRECEDES = 376, |
| 1348 | T_PRECEDING = 377, |
| 1349 | T_PRECEDING_SIBLING = 378, |
| 1350 | T_PRESERVE = 379, |
| 1351 | T_PRIORITY = 380, |
| 1352 | T_PROCESSING_INSTRUCTION = 381, |
| 1353 | T_QUESTION = 382, |
| 1354 | T_QUICK_TAG_END = 383, |
| 1355 | T_QUOTE = 384, |
| 1356 | T_RBRACKET = 385, |
| 1357 | T_RETURN = 386, |
| 1358 | T_RPAREN = 387, |
| 1359 | T_SATISFIES = 388, |
| 1360 | T_SCHEMA_ATTRIBUTE = 389, |
| 1361 | T_SCHEMA_ELEMENT = 390, |
| 1362 | T_SCHEMA = 391, |
| 1363 | T_SELF = 392, |
| 1364 | T_SEMI_COLON = 393, |
| 1365 | T_SLASH = 394, |
| 1366 | T_SLASHSLASH = 395, |
| 1367 | T_SOME = 396, |
| 1368 | T_SORT = 397, |
| 1369 | T_STABLE = 398, |
| 1370 | T_STAR = 399, |
| 1371 | T_STRICT = 400, |
| 1372 | T_STRIP = 401, |
| 1373 | T_SUCCESS = 402, |
| 1374 | T_COMMENT_CONTENT = 403, |
| 1375 | T_PI_CONTENT = 404, |
| 1376 | T_PI_TARGET = 405, |
| 1377 | T_XSLT_VERSION = 406, |
| 1378 | T_TEMPLATE = 407, |
| 1379 | T_TEXT = 408, |
| 1380 | T_THEN = 409, |
| 1381 | T_TO = 410, |
| 1382 | T_TREAT = 411, |
| 1383 | T_TUNNEL = 412, |
| 1384 | T_TYPESWITCH = 413, |
| 1385 | T_UNION = 414, |
| 1386 | T_UNORDERED = 415, |
| 1387 | T_VALIDATE = 416, |
| 1388 | T_VARIABLE = 417, |
| 1389 | T_VERSION = 418, |
| 1390 | T_WHERE = 419, |
| 1391 | T_XQUERY = 420, |
| 1392 | T_INTERNAL = 421, |
| 1393 | T_INTERNAL_NAME = 422, |
| 1394 | T_CURRENT = 423 |
| 1395 | }; |
| 1396 | #endif |
| 1397 | |
| 1398 | /* Value type. */ |
| 1399 | |
| 1400 | /* Location type. */ |
| 1401 | #if ! defined XPATHLTYPE && ! defined XPATHLTYPE_IS_DECLARED |
| 1402 | typedef struct XPATHLTYPE XPATHLTYPE; |
| 1403 | struct XPATHLTYPE |
| 1404 | { |
| 1405 | int first_line; |
| 1406 | int first_column; |
| 1407 | int last_line; |
| 1408 | int last_column; |
| 1409 | }; |
| 1410 | # define XPATHLTYPE_IS_DECLARED 1 |
| 1411 | # define XPATHLTYPE_IS_TRIVIAL 1 |
| 1412 | #endif |
| 1413 | |
| 1414 | |
| 1415 | |
| 1416 | int XPathparse (QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo); |
| 1417 | |
| 1418 | #endif /* !YY_XPATH_QQUERYTRANSFORMPARSER_P_H_INCLUDED */ |
| 1419 | |
| 1420 | |
| 1421 | |
| 1422 | #ifdef short |
| 1423 | # undef short |
| 1424 | #endif |
| 1425 | |
| 1426 | #ifdef YYTYPE_UINT8 |
| 1427 | typedef YYTYPE_UINT8 yytype_uint8; |
| 1428 | #else |
| 1429 | typedef unsigned char yytype_uint8; |
| 1430 | #endif |
| 1431 | |
| 1432 | #ifdef YYTYPE_INT8 |
| 1433 | typedef YYTYPE_INT8 yytype_int8; |
| 1434 | #else |
| 1435 | typedef signed char yytype_int8; |
| 1436 | #endif |
| 1437 | |
| 1438 | #ifdef YYTYPE_UINT16 |
| 1439 | typedef YYTYPE_UINT16 yytype_uint16; |
| 1440 | #else |
| 1441 | typedef unsigned short yytype_uint16; |
| 1442 | #endif |
| 1443 | |
| 1444 | #ifdef YYTYPE_INT16 |
| 1445 | typedef YYTYPE_INT16 yytype_int16; |
| 1446 | #else |
| 1447 | typedef short yytype_int16; |
| 1448 | #endif |
| 1449 | |
| 1450 | #ifndef YYSIZE_T |
| 1451 | # ifdef __SIZE_TYPE__ |
| 1452 | # define YYSIZE_T __SIZE_TYPE__ |
| 1453 | # elif defined size_t |
| 1454 | # define YYSIZE_T size_t |
| 1455 | # elif ! defined YYSIZE_T |
| 1456 | # include <stddef.h> /* INFRINGES ON USER NAME SPACE */ |
| 1457 | # define YYSIZE_T size_t |
| 1458 | # else |
| 1459 | # define YYSIZE_T unsigned |
| 1460 | # endif |
| 1461 | #endif |
| 1462 | |
| 1463 | #define YYSIZE_MAXIMUM ((YYSIZE_T) -1) |
| 1464 | |
| 1465 | #ifndef YY_ |
| 1466 | # if defined YYENABLE_NLS && YYENABLE_NLS |
| 1467 | # if ENABLE_NLS |
| 1468 | # include <libintl.h> /* INFRINGES ON USER NAME SPACE */ |
| 1469 | # define YY_(Msgid) dgettext ("bison-runtime", Msgid) |
| 1470 | # endif |
| 1471 | # endif |
| 1472 | # ifndef YY_ |
| 1473 | # define YY_(Msgid) Msgid |
| 1474 | # endif |
| 1475 | #endif |
| 1476 | |
| 1477 | #ifndef YY_ATTRIBUTE |
| 1478 | # if (defined __GNUC__ \ |
| 1479 | && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ |
| 1480 | || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C |
| 1481 | # define YY_ATTRIBUTE(Spec) __attribute__(Spec) |
| 1482 | # else |
| 1483 | # define YY_ATTRIBUTE(Spec) /* empty */ |
| 1484 | # endif |
| 1485 | #endif |
| 1486 | |
| 1487 | #ifndef YY_ATTRIBUTE_PURE |
| 1488 | # define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) |
| 1489 | #endif |
| 1490 | |
| 1491 | #ifndef YY_ATTRIBUTE_UNUSED |
| 1492 | # define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) |
| 1493 | #endif |
| 1494 | |
| 1495 | /* Suppress unused-variable warnings by "using" E. */ |
| 1496 | #if ! defined lint || defined __GNUC__ |
| 1497 | # define YYUSE(E) ((void) (E)) |
| 1498 | #else |
| 1499 | # define YYUSE(E) /* empty */ |
| 1500 | #endif |
| 1501 | |
| 1502 | #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ |
| 1503 | /* Suppress an incorrect diagnostic about yylval being uninitialized. */ |
| 1504 | # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ |
| 1505 | _Pragma ("GCC diagnostic push") \ |
| 1506 | _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ |
| 1507 | _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") |
| 1508 | # define YY_IGNORE_MAYBE_UNINITIALIZED_END \ |
| 1509 | _Pragma ("GCC diagnostic pop") |
| 1510 | #else |
| 1511 | # define YY_INITIAL_VALUE(Value) Value |
| 1512 | #endif |
| 1513 | #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN |
| 1514 | # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN |
| 1515 | # define YY_IGNORE_MAYBE_UNINITIALIZED_END |
| 1516 | #endif |
| 1517 | #ifndef YY_INITIAL_VALUE |
| 1518 | # define YY_INITIAL_VALUE(Value) /* Nothing. */ |
| 1519 | #endif |
| 1520 | |
| 1521 | |
| 1522 | #if ! defined yyoverflow || YYERROR_VERBOSE |
| 1523 | |
| 1524 | /* The parser invokes alloca or malloc; define the necessary symbols. */ |
| 1525 | |
| 1526 | # ifdef YYSTACK_USE_ALLOCA |
| 1527 | # if YYSTACK_USE_ALLOCA |
| 1528 | # ifdef __GNUC__ |
| 1529 | # define YYSTACK_ALLOC __builtin_alloca |
| 1530 | # elif defined __BUILTIN_VA_ARG_INCR |
| 1531 | # include <alloca.h> /* INFRINGES ON USER NAME SPACE */ |
| 1532 | # elif defined _AIX |
| 1533 | # define YYSTACK_ALLOC __alloca |
| 1534 | # elif defined _MSC_VER |
| 1535 | # include <malloc.h> /* INFRINGES ON USER NAME SPACE */ |
| 1536 | # define alloca _alloca |
| 1537 | # else |
| 1538 | # define YYSTACK_ALLOC alloca |
| 1539 | # if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS |
| 1540 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
| 1541 | /* Use EXIT_SUCCESS as a witness for stdlib.h. */ |
| 1542 | # ifndef EXIT_SUCCESS |
| 1543 | # define EXIT_SUCCESS 0 |
| 1544 | # endif |
| 1545 | # endif |
| 1546 | # endif |
| 1547 | # endif |
| 1548 | # endif |
| 1549 | |
| 1550 | # ifdef YYSTACK_ALLOC |
| 1551 | /* Pacify GCC's 'empty if-body' warning. */ |
| 1552 | # define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) |
| 1553 | # ifndef YYSTACK_ALLOC_MAXIMUM |
| 1554 | /* The OS might guarantee only one guard page at the bottom of the stack, |
| 1555 | and a page size can be as small as 4096 bytes. So we cannot safely |
| 1556 | invoke alloca (N) if N exceeds 4096. Use a slightly smaller number |
| 1557 | to allow for a few compiler-allocated temporary stack slots. */ |
| 1558 | # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ |
| 1559 | # endif |
| 1560 | # else |
| 1561 | # define YYSTACK_ALLOC YYMALLOC |
| 1562 | # define YYSTACK_FREE YYFREE |
| 1563 | # ifndef YYSTACK_ALLOC_MAXIMUM |
| 1564 | # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM |
| 1565 | # endif |
| 1566 | # if (defined __cplusplus && ! defined EXIT_SUCCESS \ |
| 1567 | && ! ((defined YYMALLOC || defined malloc) \ |
| 1568 | && (defined YYFREE || defined free))) |
| 1569 | # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ |
| 1570 | # ifndef EXIT_SUCCESS |
| 1571 | # define EXIT_SUCCESS 0 |
| 1572 | # endif |
| 1573 | # endif |
| 1574 | # ifndef YYMALLOC |
| 1575 | # define YYMALLOC malloc |
| 1576 | # if ! defined malloc && ! defined EXIT_SUCCESS |
| 1577 | void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ |
| 1578 | # endif |
| 1579 | # endif |
| 1580 | # ifndef YYFREE |
| 1581 | # define YYFREE free |
| 1582 | # if ! defined free && ! defined EXIT_SUCCESS |
| 1583 | void free (void *); /* INFRINGES ON USER NAME SPACE */ |
| 1584 | # endif |
| 1585 | # endif |
| 1586 | # endif |
| 1587 | #endif /* ! defined yyoverflow || YYERROR_VERBOSE */ |
| 1588 | |
| 1589 | |
| 1590 | #if (! defined yyoverflow \ |
| 1591 | && (! defined __cplusplus \ |
| 1592 | || (defined XPATHLTYPE_IS_TRIVIAL && XPATHLTYPE_IS_TRIVIAL \ |
| 1593 | && defined XPATHSTYPE_IS_TRIVIAL && XPATHSTYPE_IS_TRIVIAL))) |
| 1594 | |
| 1595 | /* A type that is properly aligned for any stack member. */ |
| 1596 | union yyalloc |
| 1597 | { |
| 1598 | yytype_int16 yyss_alloc; |
| 1599 | YYSTYPE yyvs_alloc; |
| 1600 | YYLTYPE yyls_alloc; |
| 1601 | }; |
| 1602 | |
| 1603 | /* The size of the maximum gap between one aligned stack and the next. */ |
| 1604 | # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) |
| 1605 | |
| 1606 | /* The size of an array large to enough to hold all stacks, each with |
| 1607 | N elements. */ |
| 1608 | # define YYSTACK_BYTES(N) \ |
| 1609 | ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ |
| 1610 | + 2 * YYSTACK_GAP_MAXIMUM) |
| 1611 | |
| 1612 | # define YYCOPY_NEEDED 1 |
| 1613 | |
| 1614 | /* Relocate STACK from its old location to the new one. The |
| 1615 | local variables YYSIZE and YYSTACKSIZE give the old and new number of |
| 1616 | elements in the stack, and YYPTR gives the new location of the |
| 1617 | stack. Advance YYPTR to a properly aligned location for the next |
| 1618 | stack. */ |
| 1619 | # define YYSTACK_RELOCATE(Stack_alloc, Stack) \ |
| 1620 | do \ |
| 1621 | { \ |
| 1622 | YYSIZE_T yynewbytes; \ |
| 1623 | YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ |
| 1624 | Stack = &yyptr->Stack_alloc; \ |
| 1625 | yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ |
| 1626 | yyptr += yynewbytes / sizeof (*yyptr); \ |
| 1627 | } \ |
| 1628 | while (0) |
| 1629 | |
| 1630 | #endif |
| 1631 | |
| 1632 | #if defined YYCOPY_NEEDED && YYCOPY_NEEDED |
| 1633 | /* Copy COUNT objects from SRC to DST. The source and destination do |
| 1634 | not overlap. */ |
| 1635 | # ifndef YYCOPY |
| 1636 | # if defined __GNUC__ && 1 < __GNUC__ |
| 1637 | # define YYCOPY(Dst, Src, Count) \ |
| 1638 | __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) |
| 1639 | # else |
| 1640 | # define YYCOPY(Dst, Src, Count) \ |
| 1641 | do \ |
| 1642 | { \ |
| 1643 | YYSIZE_T yyi; \ |
| 1644 | for (yyi = 0; yyi < (Count); yyi++) \ |
| 1645 | (Dst)[yyi] = (Src)[yyi]; \ |
| 1646 | } \ |
| 1647 | while (0) |
| 1648 | # endif |
| 1649 | # endif |
| 1650 | #endif /* !YYCOPY_NEEDED */ |
| 1651 | |
| 1652 | /* YYFINAL -- State number of the termination state. */ |
| 1653 | #define YYFINAL 5 |
| 1654 | /* YYLAST -- Last index in YYTABLE. */ |
| 1655 | #define YYLAST 2052 |
| 1656 | |
| 1657 | /* YYNTOKENS -- Number of terminals. */ |
| 1658 | #define YYNTOKENS 169 |
| 1659 | /* YYNNTS -- Number of nonterminals. */ |
| 1660 | #define YYNNTS 237 |
| 1661 | /* YYNRULES -- Number of rules. */ |
| 1662 | #define YYNRULES 472 |
| 1663 | /* YYNSTATES -- Number of states. */ |
| 1664 | #define YYNSTATES 812 |
| 1665 | |
| 1666 | #define YYUNDEFTOK 2 |
| 1667 | #define YYMAXUTOK 423 |
| 1668 | |
| 1669 | /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM |
| 1670 | as returned by yylex, with out-of-bounds checking. */ |
| 1671 | #define YYTRANSLATE(YYX) \ |
| 1672 | ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) |
| 1673 | |
| 1674 | /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM |
| 1675 | as returned by yylex. */ |
| 1676 | static const yytype_uint8 yytranslate[] = |
| 1677 | { |
| 1678 | 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1679 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1680 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1681 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1682 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1683 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1684 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1685 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1686 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1687 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1688 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1689 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1690 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1691 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1692 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1693 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1694 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1695 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1696 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1697 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1698 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1699 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1700 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1701 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1702 | 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, |
| 1703 | 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, |
| 1704 | 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, |
| 1705 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, |
| 1706 | 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, |
| 1707 | 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, |
| 1708 | 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, |
| 1709 | 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, |
| 1710 | 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, |
| 1711 | 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, |
| 1712 | 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, |
| 1713 | 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, |
| 1714 | 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, |
| 1715 | 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, |
| 1716 | 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, |
| 1717 | 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, |
| 1718 | 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, |
| 1719 | 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, |
| 1720 | 165, 166, 167, 168 |
| 1721 | }; |
| 1722 | |
| 1723 | #if XPATHDEBUG |
| 1724 | /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ |
| 1725 | static const yytype_uint16 yyrline[] = |
| 1726 | { |
| 1727 | 0, 1431, 1431, 1432, 1434, 1435, 1466, 1467, 1483, 1581, |
| 1728 | 1583, 1589, 1591, 1598, 1604, 1610, 1617, 1620, 1624, 1628, |
| 1729 | 1648, 1662, 1666, 1660, 1729, 1733, 1750, 1753, 1755, 1760, |
| 1730 | 1761, 1765, 1766, 1770, 1774, 1778, 1780, 1781, 1783, 1785, |
| 1731 | 1831, 1845, 1850, 1855, 1856, 1858, 1873, 1888, 1898, 1913, |
| 1732 | 1917, 1922, 1936, 1940, 1945, 1959, 1964, 1969, 1974, 1979, |
| 1733 | 1995, 2018, 2026, 2027, 2028, 2030, 2047, 2048, 2050, 2051, |
| 1734 | 2053, 2054, 2056, 2111, 2115, 2121, 2124, 2129, 2143, 2147, |
| 1735 | 2153, 2152, 2261, 2264, 2270, 2291, 2297, 2301, 2303, 2308, |
| 1736 | 2318, 2319, 2324, 2325, 2334, 2404, 2415, 2416, 2420, 2425, |
| 1737 | 2494, 2495, 2499, 2504, 2548, 2549, 2554, 2561, 2567, 2568, |
| 1738 | 2569, 2570, 2571, 2572, 2578, 2583, 2589, 2592, 2597, 2603, |
| 1739 | 2609, 2613, 2638, 2639, 2643, 2647, 2641, 2688, 2691, 2686, |
| 1740 | 2707, 2708, 2709, 2712, 2716, 2724, 2723, 2737, 2736, 2745, |
| 1741 | 2746, 2747, 2749, 2757, 2768, 2771, 2773, 2778, 2785, 2792, |
| 1742 | 2798, 2818, 2823, 2829, 2832, 2834, 2835, 2842, 2848, 2852, |
| 1743 | 2857, 2858, 2861, 2865, 2860, 2875, 2879, 2874, 2887, 2890, |
| 1744 | 2894, 2889, 2904, 2908, 2903, 2916, 2918, 2946, 2945, 2957, |
| 1745 | 2965, 2956, 2976, 2977, 2980, 2984, 2989, 2994, 2993, 3009, |
| 1746 | 3015, 3016, 3022, 3023, 3029, 3030, 3031, 3032, 3034, 3035, |
| 1747 | 3041, 3042, 3048, 3049, 3051, 3052, 3058, 3059, 3060, 3061, |
| 1748 | 3063, 3064, 3074, 3075, 3081, 3082, 3084, 3088, 3093, 3094, |
| 1749 | 3101, 3102, 3108, 3109, 3115, 3116, 3122, 3123, 3129, 3133, |
| 1750 | 3138, 3139, 3140, 3142, 3148, 3149, 3150, 3151, 3152, 3153, |
| 1751 | 3155, 3160, 3161, 3162, 3163, 3164, 3165, 3167, 3172, 3173, |
| 1752 | 3174, 3176, 3190, 3191, 3192, 3194, 3211, 3215, 3220, 3221, |
| 1753 | 3223, 3228, 3229, 3231, 3237, 3241, 3247, 3250, 3251, 3255, |
| 1754 | 3264, 3269, 3273, 3274, 3279, 3278, 3293, 3301, 3300, 3316, |
| 1755 | 3324, 3324, 3333, 3335, 3338, 3343, 3345, 3349, 3415, 3418, |
| 1756 | 3424, 3427, 3436, 3440, 3444, 3449, 3450, 3455, 3456, 3459, |
| 1757 | 3458, 3488, 3490, 3491, 3493, 3537, 3538, 3539, 3540, 3541, |
| 1758 | 3542, 3543, 3544, 3545, 3546, 3547, 3548, 3551, 3550, 3561, |
| 1759 | 3572, 3577, 3579, 3584, 3585, 3590, 3594, 3596, 3600, 3609, |
| 1760 | 3616, 3617, 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, |
| 1761 | 3640, 3641, 3646, 3651, 3657, 3663, 3668, 3673, 3678, 3684, |
| 1762 | 3689, 3694, 3724, 3728, 3735, 3737, 3741, 3746, 3747, 3748, |
| 1763 | 3782, 3791, 3780, 4032, 4036, 4056, 4059, 4065, 4070, 4075, |
| 1764 | 4081, 4084, 4094, 4101, 4105, 4111, 4125, 4131, 4148, 4153, |
| 1765 | 4166, 4167, 4168, 4169, 4170, 4171, 4172, 4174, 4182, 4181, |
| 1766 | 4221, 4224, 4229, 4244, 4249, 4256, 4268, 4272, 4268, 4278, |
| 1767 | 4280, 4284, 4286, 4301, 4305, 4314, 4319, 4323, 4329, 4332, |
| 1768 | 4337, 4342, 4347, 4348, 4349, 4350, 4352, 4353, 4354, 4355, |
| 1769 | 4360, 4396, 4397, 4398, 4399, 4400, 4401, 4402, 4404, 4409, |
| 1770 | 4414, 4420, 4421, 4423, 4428, 4433, 4438, 4443, 4459, 4460, |
| 1771 | 4462, 4467, 4472, 4476, 4488, 4501, 4511, 4516, 4521, 4526, |
| 1772 | 4540, 4554, 4555, 4557, 4567, 4569, 4574, 4581, 4588, 4590, |
| 1773 | 4592, 4593, 4595, 4599, 4604, 4605, 4607, 4613, 4615, 4617, |
| 1774 | 4621, 4626, 4638 |
| 1775 | }; |
| 1776 | #endif |
| 1777 | |
| 1778 | #if XPATHDEBUG || YYERROR_VERBOSE || 1 |
| 1779 | /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. |
| 1780 | First, the terminals, then, starting at YYNTOKENS, nonterminals. */ |
| 1781 | static const char *const yytname[] = |
| 1782 | { |
| 1783 | "\"end of file\"" , "error" , "$undefined" , "\"<string literal>\"" , |
| 1784 | "\"<non-boundary text node>\"" , "\"<string literal(XPath 2.0)>\"" , |
| 1785 | "\"QName\"" , "\"NCName\"" , "\"ClarkName\"" , "T_ANY_LOCAL_NAME" , |
| 1786 | "T_ANY_PREFIX" , "\"<number literal>\"" , |
| 1787 | "\"<number literal(XPath 2.0)>\"" , "\"ancestor\"" , |
| 1788 | "\"ancestor-or-self\"" , "\"and\"" , "\"'\"" , "\"apply-template\"" , |
| 1789 | "\"as\"" , "\"ascending\"" , "\":=\"" , "\"at\"" , "\"@\"" , "\"attribute\"" , |
| 1790 | "T_AVT" , "\"|\"" , "\"base-uri\"" , "\"</\"" , "\"boundary-space\"" , |
| 1791 | "\"by\"" , "\"call-template\"" , "\"case\"" , "\"castable\"" , "\"cast\"" , |
| 1792 | "\"child\"" , "\"collation\"" , "\"::\"" , "\",\"" , "\"comment\"" , |
| 1793 | "\"<!--\"" , "\"construction\"" , "\"copy-namespaces\"" , "\"{\"" , "\"}\"" , |
| 1794 | "\"declare\"" , "\"default\"" , "\"descendant\"" , "\"descendant-or-self\"" , |
| 1795 | "\"descending\"" , "\"div\"" , "\"document\"" , "\"document-node\"" , |
| 1796 | "\"$\"" , "\".\"" , "\"..\"" , "\"element\"" , "\"else\"" , "\"empty\"" , |
| 1797 | "\"empty-sequence\"" , "\"encoding\"" , "\"end_sort\"" , "\"eq\"" , |
| 1798 | "\"unknown keyword\"" , "\"every\"" , "\"except\"" , "\"external\"" , |
| 1799 | "\"following\"" , "\"following-sibling\"" , "\">>\"" , |
| 1800 | "\"for-apply-template\"" , "\"for\"" , "\"function\"" , "\"ge\"" , "\"=\"" , |
| 1801 | "\">=\"" , "\">\"" , "\"<=\"" , "\"<\"" , "\"!=\"" , "\"greatest\"" , "\"gt\"" , |
| 1802 | "\"idiv\"" , "\"if\"" , "\"import\"" , "\"inherit\"" , "\"in\"" , |
| 1803 | "\"instance\"" , "\"intersect\"" , "\"is\"" , "\"item\"" , "\"lax\"" , |
| 1804 | "\"[\"" , "\"least\"" , "\"le\"" , "\"let\"" , "\"(\"" , "\"lt\"" , "\"map\"" , |
| 1805 | "\"matches\"" , "\"-\"" , "\"mode\"" , "\"mod\"" , "\"module\"" , "\"name\"" , |
| 1806 | "\"namespace\"" , "\"ne\"" , "\"node\"" , "\"no-inherit\"" , |
| 1807 | "\"no-preserve\"" , "\"of\"" , "\"option\"" , "\"ordered\"" , "\"ordering\"" , |
| 1808 | "\"order\"" , "\"or\"" , "\"parent\"" , "\"<?\"" , "\"+\"" , "T_POSITION_SET" , |
| 1809 | "\"#)\"" , "\"(#\"" , "\"<<\"" , "\"preceding\"" , "\"preceding-sibling\"" , |
| 1810 | "\"preserve\"" , "\"priority\"" , "\"processing-instruction\"" , "\"?\"" , |
| 1811 | "\"/>\"" , "\"\\\"\"" , "\"]\"" , "\"return\"" , "\")\"" , "\"satisfies\"" , |
| 1812 | "\"schema-attribute\"" , "\"schema-element\"" , "\"schema\"" , "\"self\"" , |
| 1813 | "\";\"" , "\"/\"" , "\"//\"" , "\"some\"" , "\"sort\"" , "\"stable\"" , |
| 1814 | "\"*\"" , "\"strict\"" , "\"strip\"" , "T_SUCCESS" , "T_COMMENT_CONTENT" , |
| 1815 | "T_PI_CONTENT" , "T_PI_TARGET" , "T_XSLT_VERSION" , "\"template\"" , |
| 1816 | "\"text\"" , "\"then\"" , "\"to\"" , "\"treat\"" , "\"tunnel\"" , |
| 1817 | "\"typeswitch\"" , "\"union\"" , "\"unordered\"" , "\"validate\"" , |
| 1818 | "\"variable\"" , "\"version\"" , "\"where\"" , "\"xquery\"" , "\"internal\"" , |
| 1819 | "\"internal-name\"" , "\"current\"" , "$accept" , "Module" , "VersionDecl" , |
| 1820 | "Encoding" , "MainModule" , "LibraryModule" , "ModuleDecl" , "Prolog" , |
| 1821 | "TemplateDecl" , "$@1" , "$@2" , "OptionalPriority" , "OptionalTemplateName" , |
| 1822 | "TemplateName" , "Setter" , "Import" , "Separator" , "NamespaceDecl" , |
| 1823 | "BoundarySpaceDecl" , "BoundarySpacePolicy" , "DefaultNamespaceDecl" , |
| 1824 | "DeclareDefaultElementNamespace" , "DeclareDefaultFunctionNamespace" , |
| 1825 | "OptionDecl" , "OrderingModeDecl" , "OrderingMode" , "EmptyOrderDecl" , |
| 1826 | "OrderingEmptySequence" , "CopyNamespacesDecl" , "PreserveMode" , |
| 1827 | "InheritMode" , "DefaultCollationDecl" , "BaseURIDecl" , "SchemaImport" , |
| 1828 | "SchemaPrefix" , "ModuleImport" , "ModuleNamespaceDecl" , "FileLocations" , |
| 1829 | "FileLocation" , "VarDecl" , "VariableValue" , "OptionalDefaultValue" , |
| 1830 | "ConstructionDecl" , "ConstructionMode" , "FunctionDecl" , "@3" , |
| 1831 | "ParamList" , "Param" , "FunctionBody" , "EnclosedExpr" , "QueryBody" , |
| 1832 | "Pattern" , "PathPattern" , "IdKeyPattern" , "RelativePathPattern" , |
| 1833 | "PatternStep" , "Expr" , "ExpressionSequence" , "ExprSingle" , |
| 1834 | "OptionalModes" , "OptionalMode" , "Modes" , "Mode" , "FLWORExpr" , |
| 1835 | "ForClause" , "@4" , "@5" , "ForTail" , "$@6" , "@7" , "PositionalVar" , |
| 1836 | "LetClause" , "@8" , "LetTail" , "@9" , "WhereClause" , "OrderByClause" , |
| 1837 | "MandatoryOrderByClause" , "OrderSpecList" , "OrderSpec" , |
| 1838 | "DirectionModifier" , "EmptynessModifier" , "CollationModifier" , |
| 1839 | "OrderByInputOrder" , "QuantifiedExpr" , "SomeQuantificationExpr" , "$@10" , |
| 1840 | "@11" , "SomeQuantificationTail" , "@12" , "@13" , "EveryQuantificationExpr" , |
| 1841 | "$@14" , "@15" , "EveryQuantificationTail" , "@16" , "@17" , |
| 1842 | "SatisfiesClause" , "TypeswitchExpr" , "$@18" , "CaseClause" , "$@19" , |
| 1843 | "$@20" , "CaseTail" , "CaseVariable" , "CaseDefault" , "$@21" , "IfExpr" , |
| 1844 | "OrExpr" , "AndExpr" , "ComparisonExpr" , "RangeExpr" , "AdditiveExpr" , |
| 1845 | "AdditiveOperator" , "MultiplicativeExpr" , "MultiplyOperator" , |
| 1846 | "UnionExpr" , "IntersectExceptExpr" , "UnionOperator" , "IntersectOperator" , |
| 1847 | "InstanceOfExpr" , "TreatExpr" , "CastableExpr" , "CastExpr" , "UnaryExpr" , |
| 1848 | "UnaryOperator" , "ValueExpr" , "GeneralComp" , "GeneralComparisonOperator" , |
| 1849 | "ValueComp" , "ValueComparisonOperator" , "NodeComp" , "NodeOperator" , |
| 1850 | "ValidateExpr" , "ValidationMode" , "ExtensionExpr" , |
| 1851 | "EnclosedOptionalExpr" , "Pragmas" , "Pragma" , "PragmaContents" , |
| 1852 | "PathExpr" , "RelativePathExpr" , "StepExpr" , "@22" , "$@23" , |
| 1853 | "TemplateWithParameters" , "$@24" , "TemplateParameters" , |
| 1854 | "OptionalTemplateParameters" , "TemplateParameter" , "IsTunnel" , |
| 1855 | "OptionalAssign" , "MapOrSlash" , "FilteredAxisStep" , "AxisStep" , |
| 1856 | "ForwardStep" , "$@25" , "NodeTestInAxisStep" , "Axis" , "AxisToken" , |
| 1857 | "AbbrevForwardStep" , "$@26" , "ReverseStep" , "AbbrevReverseStep" , |
| 1858 | "NodeTest" , "NameTest" , "WildCard" , "FilterExpr" , "PrimaryExpr" , |
| 1859 | "Literal" , "NumericLiteral" , "VarRef" , "VarName" , "ParenthesizedExpr" , |
| 1860 | "ContextItemExpr" , "OrderingExpr" , "FunctionCallExpr" , |
| 1861 | "FunctionArguments" , "Constructor" , "DirectConstructor" , |
| 1862 | "DirElemConstructor" , "@27" , "@28" , "DirElemConstructorTail" , |
| 1863 | "DirAttributeList" , "Attribute" , "DirAttributeValue" , "AttrValueContent" , |
| 1864 | "DirElemContent" , "DirCommentConstructor" , "DirPIConstructor" , |
| 1865 | "ComputedConstructor" , "CompDocConstructor" , "CompElemConstructor" , |
| 1866 | "$@29" , "IsInternal" , "CompAttrConstructor" , "CompTextConstructor" , |
| 1867 | "CompCommentConstructor" , "CompPIConstructor" , "CompAttributeName" , |
| 1868 | "$@30" , "$@31" , "CompElementName" , "CompNameExpr" , "CompPIName" , |
| 1869 | "CompNamespaceConstructor" , "SingleType" , "TypeDeclaration" , |
| 1870 | "SequenceType" , "OccurrenceIndicator" , "ItemType" , "AtomicType" , |
| 1871 | "KindTest" , "AnyKindTest" , "DocumentTest" , "AnyElementTest" , "TextTest" , |
| 1872 | "CommentTest" , "PITest" , "AnyAttributeTest" , "AttributeTest" , |
| 1873 | "SchemaAttributeTest" , "ElementTest" , "OptionalQuestionMark" , |
| 1874 | "SchemaElementTest" , "EmptyParanteses" , "AttributeName" , "ElementName" , |
| 1875 | "TypeName" , "FunctionName" , "NCName" , "LexicalName" , "PragmaName" , |
| 1876 | "URILiteral" , "StringLiteral" , "QName" , YY_NULLPTR |
| 1877 | }; |
| 1878 | #endif |
| 1879 | |
| 1880 | # ifdef YYPRINT |
| 1881 | /* YYTOKNUM[NUM] -- (External) token number corresponding to the |
| 1882 | (internal) symbol number NUM (which must be that of a token). */ |
| 1883 | static const yytype_uint16 yytoknum[] = |
| 1884 | { |
| 1885 | 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, |
| 1886 | 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, |
| 1887 | 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, |
| 1888 | 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, |
| 1889 | 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, |
| 1890 | 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, |
| 1891 | 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, |
| 1892 | 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, |
| 1893 | 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, |
| 1894 | 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, |
| 1895 | 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, |
| 1896 | 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, |
| 1897 | 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, |
| 1898 | 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, |
| 1899 | 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, |
| 1900 | 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, |
| 1901 | 415, 416, 417, 418, 419, 420, 421, 422, 423 |
| 1902 | }; |
| 1903 | # endif |
| 1904 | |
| 1905 | #define YYPACT_NINF -668 |
| 1906 | |
| 1907 | #define yypact_value_is_default(Yystate) \ |
| 1908 | (!!((Yystate) == (-668))) |
| 1909 | |
| 1910 | #define YYTABLE_NINF -463 |
| 1911 | |
| 1912 | #define yytable_value_is_error(Yytable_value) \ |
| 1913 | 0 |
| 1914 | |
| 1915 | /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing |
| 1916 | STATE-NUM. */ |
| 1917 | static const yytype_int16 yypact[] = |
| 1918 | { |
| 1919 | -63, -28, 185, 86, 337, -668, 117, -668, -668, -668, |
| 1920 | 734, -668, -668, 181, 253, 156, -668, 213, -668, -668, |
| 1921 | -668, -668, -668, -668, -668, 212, -668, -12, 230, 337, |
| 1922 | 342, -668, -38, 189, 298, -668, -668, 188, 272, 353, |
| 1923 | -668, -668, 71, 316, -668, -668, 318, 239, 276, 134, |
| 1924 | 188, 900, -668, 334, 282, -668, -668, 233, -668, 367, |
| 1925 | -668, -668, 133, 290, 295, -668, 1730, 1730, 345, -668, |
| 1926 | -668, -38, 305, -668, -36, 396, 334, -668, -668, -668, |
| 1927 | -668, -668, -668, -668, -668, -668, -668, 334, -668, -668, |
| 1928 | -668, -668, -668, -668, -668, -668, -668, -668, -668, 369, |
| 1929 | 370, -668, -668, -668, -668, -668, -668, -668, -668, 307, |
| 1930 | 389, -668, 601, 173, 24, -22, 32, -668, 338, 267, |
| 1931 | 393, 394, 1398, -668, -668, -668, -668, -668, 334, -668, |
| 1932 | 59, -668, -668, 166, -668, 339, -668, -668, -668, 395, |
| 1933 | -668, -668, -668, -668, -668, -668, 341, -668, -668, -668, |
| 1934 | -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, |
| 1935 | -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, |
| 1936 | -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, |
| 1937 | 340, -668, -668, 347, 337, 291, 360, 493, 373, 349, |
| 1938 | 1885, 64, -668, 334, -668, 226, 392, -668, 358, -668, |
| 1939 | 304, 334, -668, -668, 188, 167, 174, 206, 21, 188, |
| 1940 | 430, 342, -53, 351, 188, 334, 6, -668, -668, -668, |
| 1941 | -668, 79, 287, -668, 353, 353, -668, -668, -668, 1232, |
| 1942 | 336, 18, 403, 344, -668, 324, 1232, 334, -668, 308, |
| 1943 | -668, 337, -668, -668, 23, -668, 416, -668, 342, 342, |
| 1944 | 166, 166, 353, 334, 334, -668, 1232, -668, -668, -668, |
| 1945 | -668, -668, 1232, 1232, 1398, 1398, -668, -668, -668, -668, |
| 1946 | -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, |
| 1947 | -668, 1398, 1398, 1398, -668, -668, 1398, 1398, -668, -668, |
| 1948 | -668, -668, 1398, -668, -668, 1398, -668, -668, 1398, 352, |
| 1949 | 447, 448, 449, -668, -668, 1066, -668, -668, -668, -668, |
| 1950 | -668, 1730, 1564, 1232, 108, -668, 1232, 1232, -668, -668, |
| 1951 | -668, 337, 461, -668, -668, -668, -668, 282, 374, 378, |
| 1952 | 282, -668, -668, -668, 0, 51, -668, -668, 416, 342, |
| 1953 | -668, 226, 343, 226, 1232, -668, -668, 337, -668, -668, |
| 1954 | 291, -668, -668, 291, -668, -668, 437, 337, 372, 376, |
| 1955 | 421, 26, 408, 337, 291, 342, 384, -1, 431, -668, |
| 1956 | 355, -668, -668, 52, 69, -668, -668, -668, 466, 466, |
| 1957 | -668, 356, 482, 337, 435, 484, 337, 353, 485, -668, |
| 1958 | 453, -668, -668, 379, -668, 365, 368, -668, 371, 377, |
| 1959 | 466, -668, -668, 380, -668, -668, 389, -668, -668, -668, |
| 1960 | -668, 168, 24, -22, 32, -668, 456, 456, 342, 342, |
| 1961 | -668, 459, -668, 191, -668, 375, 404, -668, -668, -668, |
| 1962 | 383, 369, 370, 386, 291, -668, 442, 388, -6, 342, |
| 1963 | -668, 342, -668, -668, -668, -668, -668, -668, 465, 391, |
| 1964 | 291, -668, -668, 157, 291, 337, 337, 16, 291, -668, |
| 1965 | 409, -668, 348, 291, -668, -668, 415, -6, 466, 353, |
| 1966 | -668, 342, -668, 342, -668, 416, 456, 440, 495, 239, |
| 1967 | 381, 454, 507, 425, 457, 507, 466, 463, -668, -668, |
| 1968 | -668, -668, -668, -668, 462, -668, 282, 282, -668, 121, |
| 1969 | -668, -668, -668, -668, -668, -668, 412, -668, -668, 512, |
| 1970 | 433, 417, 1232, -668, -668, -668, -668, 337, -668, -668, |
| 1971 | 513, -668, 497, -668, 422, 423, -668, -668, -668, -668, |
| 1972 | -668, -668, 291, -668, 291, 291, -668, -668, -668, 504, |
| 1973 | 515, 188, -668, -668, 83, 416, 466, 432, 432, -668, |
| 1974 | -668, 1232, 508, 476, 450, -668, 492, 1232, -668, 337, |
| 1975 | 291, -668, -668, 291, 547, 566, 1232, 539, -668, -668, |
| 1976 | -668, -668, -668, -668, -668, -668, 543, 1730, 62, 536, |
| 1977 | -668, 419, 353, -668, -668, -668, -668, -668, 353, 84, |
| 1978 | -668, -668, 291, 1804, -668, 291, 46, -668, 445, 446, |
| 1979 | -668, 353, 1232, -668, 33, 524, 550, -668, -668, -668, |
| 1980 | 1232, 515, -668, 537, -668, -668, 528, -668, -668, 421, |
| 1981 | 1232, -668, 466, 466, 504, -668, 1232, -668, 404, 1899, |
| 1982 | 1899, 567, -668, 140, 148, -668, 339, -668, -668, 1232, |
| 1983 | -668, 573, -668, -668, -668, -668, -668, 92, 226, 226, |
| 1984 | -668, 1232, 337, -668, -668, 342, 456, -668, -668, -23, |
| 1985 | -668, 574, -668, -668, 466, 552, 148, 148, 1804, 464, |
| 1986 | 1899, 1899, 1899, 1899, -668, 1232, 291, 11, -668, -668, |
| 1987 | -668, -668, 582, 472, -668, -668, 10, 47, 584, -668, |
| 1988 | 337, 569, -668, 1232, -668, 234, -668, -668, 506, 148, |
| 1989 | 148, -668, -668, -668, -668, 555, 1232, -668, -668, 63, |
| 1990 | 250, -668, -668, 556, 1232, -668, -668, -668, -668, 479, |
| 1991 | -668, 559, -668, -668, -668, 481, -668, 1232, -668, -668, |
| 1992 | 291, -668, 373, 488, 353, -668, 562, -668, -668, -668, |
| 1993 | -668, -668, 342, -668, -668, -668, 353, 191, 1232, 353, |
| 1994 | 1232, -668, -668, 578, -668, 337, 521, 466, 353, 542, |
| 1995 | 466, 487, -668, 466, -668, 373, -668, 466, 534, 466, |
| 1996 | -668, 600, 1232, 538, 125, -668, 416, 1232, 495, 1232, |
| 1997 | -668, 1232, -2, -668, -668, -668, 291, -668, 544, -668, |
| 1998 | -668, 342, 1232, -668, -668, 1232, 10, -668, -668, -668, |
| 1999 | 11, -668, -668, 47, 490, -668, -668, -668, 1232, 63, |
| 2000 | -668, -668 |
| 2001 | }; |
| 2002 | |
| 2003 | /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. |
| 2004 | Performed when YYTABLE does not specify something else to do. Zero |
| 2005 | means the default is an error. */ |
| 2006 | static const yytype_uint16 yydefact[] = |
| 2007 | { |
| 2008 | 4, 0, 0, 11, 0, 1, 0, 3, 2, 11, |
| 2009 | 0, 469, 470, 6, 0, 9, 471, 457, 472, 328, |
| 2010 | 329, 343, 342, 306, 305, 116, 317, 390, 0, 0, |
| 2011 | 0, 308, 390, 0, 0, 310, 309, 390, 0, 0, |
| 2012 | 349, 322, 390, 0, 311, 313, 0, 0, 0, 0, |
| 2013 | 390, 0, 229, 0, 0, 49, 315, 0, 228, 0, |
| 2014 | 312, 314, 0, 0, 0, 316, 265, 0, 0, 327, |
| 2015 | 274, 390, 0, 50, 252, 0, 0, 16, 13, 15, |
| 2016 | 14, 29, 12, 43, 44, 19, 33, 0, 34, 35, |
| 2017 | 30, 31, 36, 37, 17, 32, 18, 8, 89, 105, |
| 2018 | 104, 109, 122, 123, 110, 160, 161, 111, 112, 108, |
| 2019 | 190, 192, 194, 198, 200, 204, 210, 212, 218, 220, |
| 2020 | 222, 224, 0, 226, 196, 195, 197, 230, 0, 232, |
| 2021 | 0, 259, 231, 266, 267, 271, 295, 297, 299, 0, |
| 2022 | 301, 298, 321, 319, 323, 326, 272, 330, 332, 340, |
| 2023 | 333, 334, 335, 337, 336, 338, 355, 357, 358, 359, |
| 2024 | 356, 380, 381, 382, 383, 384, 385, 386, 324, 427, |
| 2025 | 421, 426, 425, 424, 320, 438, 439, 422, 423, 325, |
| 2026 | 0, 460, 341, 458, 0, 0, 0, 0, 0, 0, |
| 2027 | 0, 0, 391, 396, 440, 370, 0, 457, 0, 458, |
| 2028 | 0, 0, 434, 378, 390, 0, 0, 0, 0, 390, |
| 2029 | 0, 0, 0, 26, 390, 0, 0, 429, 345, 344, |
| 2030 | 346, 0, 0, 446, 0, 0, 465, 464, 360, 0, |
| 2031 | 66, 62, 0, 0, 348, 0, 0, 0, 428, 0, |
| 2032 | 466, 261, 467, 403, 0, 404, 0, 435, 0, 0, |
| 2033 | 263, 264, 0, 0, 0, 433, 0, 254, 253, 463, |
| 2034 | 273, 350, 0, 0, 0, 0, 241, 250, 243, 234, |
| 2035 | 236, 237, 238, 239, 235, 244, 248, 245, 246, 242, |
| 2036 | 249, 0, 0, 0, 203, 202, 0, 0, 207, 208, |
| 2037 | 209, 206, 0, 215, 214, 0, 217, 216, 0, 0, |
| 2038 | 0, 0, 0, 227, 251, 0, 255, 258, 294, 293, |
| 2039 | 292, 0, 0, 0, 0, 304, 0, 352, 7, 38, |
| 2040 | 5, 0, 0, 121, 117, 120, 280, 0, 0, 0, |
| 2041 | 0, 318, 455, 454, 0, 0, 456, 402, 0, 0, |
| 2042 | 399, 370, 0, 370, 0, 280, 394, 0, 42, 41, |
| 2043 | 0, 79, 78, 0, 56, 55, 0, 0, 0, 0, |
| 2044 | 0, 0, 0, 0, 0, 0, 0, 285, 0, 387, |
| 2045 | 0, 431, 432, 0, 0, 388, 401, 400, 408, 408, |
| 2046 | 365, 0, 0, 0, 0, 0, 0, 0, 0, 347, |
| 2047 | 0, 405, 379, 0, 262, 0, 0, 395, 0, 0, |
| 2048 | 408, 275, 393, 0, 107, 106, 191, 193, 233, 240, |
| 2049 | 247, 199, 201, 205, 211, 213, 0, 0, 0, 0, |
| 2050 | 256, 0, 270, 0, 268, 0, 0, 300, 302, 303, |
| 2051 | 0, 354, 353, 0, 0, 468, 0, 0, 282, 0, |
| 2052 | 441, 0, 442, 392, 397, 371, 113, 372, 0, 0, |
| 2053 | 0, 40, 77, 0, 0, 0, 0, 0, 0, 462, |
| 2054 | 0, 461, 0, 0, 48, 28, 0, 282, 408, 0, |
| 2055 | 430, 0, 447, 0, 448, 0, 0, 0, 133, 361, |
| 2056 | 0, 0, 68, 0, 0, 68, 408, 0, 88, 260, |
| 2057 | 436, 437, 445, 453, 0, 177, 0, 0, 219, 412, |
| 2058 | 416, 417, 418, 420, 221, 223, 406, 225, 257, 0, |
| 2059 | 0, 0, 0, 296, 331, 351, 10, 0, 339, 289, |
| 2060 | 281, 283, 0, 459, 0, 0, 398, 276, 279, 60, |
| 2061 | 57, 58, 0, 59, 0, 0, 53, 52, 51, 82, |
| 2062 | 469, 390, 47, 21, 0, 0, 408, 451, 451, 389, |
| 2063 | 409, 0, 0, 0, 0, 366, 0, 0, 67, 0, |
| 2064 | 0, 63, 64, 0, 0, 0, 0, 0, 411, 419, |
| 2065 | 413, 415, 414, 410, 407, 159, 0, 0, 150, 146, |
| 2066 | 148, 288, 0, 444, 443, 54, 45, 46, 0, 0, |
| 2067 | 83, 277, 0, 0, 286, 0, 0, 452, 0, 0, |
| 2068 | 169, 0, 0, 365, 0, 0, 69, 70, 65, 61, |
| 2069 | 0, 0, 162, 184, 178, 158, 0, 151, 152, 153, |
| 2070 | 0, 284, 408, 408, 0, 80, 0, 39, 307, 93, |
| 2071 | 0, 22, 90, 96, 92, 100, 103, 99, 20, 0, |
| 2072 | 73, 75, 450, 449, 170, 134, 124, 0, 370, 370, |
| 2073 | 367, 0, 0, 135, 163, 0, 0, 269, 154, 155, |
| 2074 | 147, 290, 85, 84, 408, 0, 94, 95, 0, 0, |
| 2075 | 0, 0, 0, 0, 74, 0, 0, 0, 125, 373, |
| 2076 | 363, 362, 0, 0, 189, 71, 144, 0, 0, 179, |
| 2077 | 0, 0, 149, 0, 287, 0, 278, 91, 114, 97, |
| 2078 | 98, 101, 102, 76, 72, 0, 0, 171, 175, 144, |
| 2079 | 0, 369, 368, 0, 0, 140, 141, 136, 139, 0, |
| 2080 | 145, 0, 164, 168, 185, 0, 156, 0, 291, 86, |
| 2081 | 0, 87, 0, 24, 0, 176, 0, 131, 126, 132, |
| 2082 | 130, 376, 0, 377, 374, 375, 0, 144, 0, 0, |
| 2083 | 0, 157, 81, 115, 118, 0, 285, 408, 0, 0, |
| 2084 | 408, 0, 142, 408, 180, 0, 25, 408, 0, 408, |
| 2085 | 364, 0, 0, 0, 0, 119, 0, 0, 133, 0, |
| 2086 | 143, 0, 0, 182, 181, 183, 0, 172, 0, 137, |
| 2087 | 165, 0, 0, 23, 173, 0, 144, 166, 187, 186, |
| 2088 | 0, 127, 138, 0, 0, 174, 128, 167, 0, 144, |
| 2089 | 188, 129 |
| 2090 | }; |
| 2091 | |
| 2092 | /* YYPGOTO[NTERM-NUM]. */ |
| 2093 | static const yytype_int16 yypgoto[] = |
| 2094 | { |
| 2095 | -668, -668, -668, -668, -668, -668, -668, 613, -668, -668, |
| 2096 | -668, -668, -668, -668, -668, -668, -285, -668, -668, -668, |
| 2097 | -668, -668, -668, -668, -668, 418, -668, 5, -668, -668, |
| 2098 | -668, -668, -668, -668, -668, -668, -668, 142, -668, -668, |
| 2099 | -668, -668, -668, -668, -668, -668, -668, 4, -668, -51, |
| 2100 | -668, -668, -35, -668, -397, -340, -47, 317, -255, -668, |
| 2101 | -668, -668, -641, -668, -619, -668, -668, -174, -668, -668, |
| 2102 | -142, -583, -668, -159, -668, -657, -109, 216, -668, 27, |
| 2103 | -668, -668, -668, -668, -668, -668, -668, -668, -157, -668, |
| 2104 | -668, -668, -668, -668, -152, -668, -668, -667, -668, -668, |
| 2105 | -125, -668, -668, -668, -668, -668, -668, -668, -668, 387, |
| 2106 | 385, 131, 366, -668, 397, -668, 361, 359, -668, -668, |
| 2107 | 362, -668, -668, -668, 535, -668, -668, -668, -668, -668, |
| 2108 | -668, -668, -668, -668, -668, -668, -245, -668, 526, -668, |
| 2109 | -668, 279, -294, -668, -668, 313, -668, 194, -91, 85, |
| 2110 | -668, -668, -668, -87, -668, -668, -668, -668, -668, -668, |
| 2111 | -668, -668, -668, -668, -175, -668, -668, -668, -668, -668, |
| 2112 | -668, -668, -183, -668, -668, -668, -538, -668, -668, -42, |
| 2113 | -668, -668, -668, -668, 67, -668, -668, -327, -668, -668, |
| 2114 | -668, -668, -668, -668, -668, 3, -668, -668, -668, -668, |
| 2115 | -668, -668, -668, -668, 458, -668, -668, 252, -341, -412, |
| 2116 | -668, -668, -55, -394, -668, -668, -668, -668, -668, -668, |
| 2117 | -304, -668, -668, 467, 124, 469, -11, -668, -24, -170, |
| 2118 | 321, -668, 639, -668, -308, 15, -30 |
| 2119 | }; |
| 2120 | |
| 2121 | /* YYDEFGOTO[NTERM-NUM]. */ |
| 2122 | static const yytype_int16 yydefgoto[] = |
| 2123 | { |
| 2124 | -1, 2, 3, 185, 7, 8, 9, 10, 77, 593, |
| 2125 | 669, 756, 366, 367, 78, 79, 320, 80, 81, 350, |
| 2126 | 82, 83, 84, 85, 86, 87, 88, 458, 89, 356, |
| 2127 | 532, 90, 91, 92, 386, 93, 383, 560, 606, 94, |
| 2128 | 641, 676, 95, 353, 96, 664, 589, 590, 730, 341, |
| 2129 | 97, 631, 632, 633, 634, 635, 98, 99, 100, 733, |
| 2130 | 189, 753, 324, 101, 102, 678, 709, 738, 806, 809, |
| 2131 | 553, 103, 686, 717, 796, 718, 719, 720, 579, 580, |
| 2132 | 619, 659, 692, 512, 104, 105, 654, 687, 722, 797, |
| 2133 | 803, 106, 644, 677, 707, 794, 800, 708, 107, 567, |
| 2134 | 614, 725, 774, 784, 656, 785, 804, 108, 109, 110, |
| 2135 | 111, 112, 113, 287, 114, 292, 115, 116, 295, 298, |
| 2136 | 117, 118, 119, 120, 121, 122, 123, 124, 281, 125, |
| 2137 | 282, 126, 283, 127, 128, 129, 306, 130, 131, 393, |
| 2138 | 132, 133, 134, 253, 626, 437, 438, 520, 468, 521, |
| 2139 | 522, 694, 312, 135, 136, 137, 314, 427, 138, 139, |
| 2140 | 140, 190, 141, 142, 143, 144, 145, 146, 147, 148, |
| 2141 | 149, 150, 219, 151, 152, 153, 154, 433, 155, 156, |
| 2142 | 157, 380, 554, 681, 479, 555, 650, 342, 710, 158, |
| 2143 | 159, 160, 161, 162, 475, 193, 163, 164, 165, 166, |
| 2144 | 338, 339, 526, 375, 340, 246, 167, 505, 477, 498, |
| 2145 | 573, 499, 500, 168, 169, 170, 370, 171, 172, 173, |
| 2146 | 174, 175, 176, 177, 598, 178, 194, 335, 179, 524, |
| 2147 | 180, 181, 556, 241, 541, 182, 183 |
| 2148 | }; |
| 2149 | |
| 2150 | /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If |
| 2151 | positive, shift that token. If negative, reduce the rule whose |
| 2152 | number is the opposite. If YYTABLE_NINF, syntax error. */ |
| 2153 | static const yytype_int16 yytable[] = |
| 2154 | { |
| 2155 | 199, 397, 237, 293, 235, 504, 198, 404, 405, 220, |
| 2156 | 429, 245, 690, 434, 445, 331, 447, 422, 424, 13, |
| 2157 | 723, 202, 501, 501, -307, 260, 11, 217, 12, 242, |
| 2158 | 395, 223, 16, 459, 18, 201, 261, 439, 478, 450, |
| 2159 | 215, 378, 379, 238, 196, 222, -288, 713, 705, 648, |
| 2160 | 791, 247, 740, 232, 257, 637, 357, 200, 55, 494, |
| 2161 | 255, 328, 432, 384, 550, 451, 639, 715, 452, 400, |
| 2162 | 16, 332, 18, 288, 254, 482, 358, 304, 485, 464, |
| 2163 | 46, 617, 501, 191, 721, 16, 197, 18, 441, 471, |
| 2164 | 737, 754, 359, 443, 467, 536, 296, -27, 226, 227, |
| 2165 | 736, 305, 1, 716, 50, 289, 473, 73, 537, 258, |
| 2166 | 618, 640, 502, 502, 16, 197, 18, 19, 20, 297, |
| 2167 | 581, 624, 385, 509, 775, 290, 739, 545, 192, 792, |
| 2168 | 637, 426, 440, 46, 360, 4, 723, 294, 333, 428, |
| 2169 | 243, 64, 337, 691, 706, 564, 327, 534, 535, 516, |
| 2170 | 346, 519, 740, 510, 192, 333, 613, 50, 325, 38, |
| 2171 | 199, 336, 649, 328, 369, 529, 221, 679, 291, 533, |
| 2172 | 782, 337, 502, 538, 714, 236, 509, 715, 542, 59, |
| 2173 | 706, 199, 381, 442, 472, 5, 391, 363, 6, 390, |
| 2174 | 737, 199, 199, 75, 220, 220, 333, 374, 377, 318, |
| 2175 | 187, 474, 401, 402, 486, 596, 510, 347, 334, 403, |
| 2176 | 343, 333, 361, 716, 54, 594, 625, 368, 199, 199, |
| 2177 | 680, 14, 220, 373, 398, 399, 739, 714, 244, 11, |
| 2178 | 549, 12, 666, 667, 329, 308, 230, 192, 570, 49, |
| 2179 | 184, 530, 63, 64, 689, 226, 227, 585, 571, 586, |
| 2180 | 587, 607, 69, 11, 741, 12, 394, 578, 421, 396, |
| 2181 | 186, 330, 501, 309, 531, 572, 425, 284, 236, 430, |
| 2182 | 231, 525, 284, 699, 700, 608, 236, 742, 609, 670, |
| 2183 | 671, 661, 662, 616, 199, 285, 546, 672, 673, 33, |
| 2184 | 285, 348, 236, 16, 197, 18, 600, 448, 351, 729, |
| 2185 | 595, 547, 605, 548, 509, 310, 311, 627, -462, 199, |
| 2186 | 638, 612, 188, 349, 354, 444, 202, 223, 247, 255, |
| 2187 | 352, 682, 683, 695, 204, 195, 205, 47, 286, 236, |
| 2188 | 355, 461, 701, 702, 510, 199, 435, 203, 206, 207, |
| 2189 | 11, 465, 12, 208, 685, 250, 251, 646, 16, 197, |
| 2190 | 18, 540, 502, 12, 192, 653, 343, 220, 343, 16, |
| 2191 | 218, 18, 435, 506, 506, 578, 57, 216, 224, 209, |
| 2192 | 225, 229, 454, 16, 240, 18, 236, 200, 463, 16, |
| 2193 | 323, 18, 726, 239, 674, 248, 199, 199, 199, 199, |
| 2194 | 249, 704, 503, 503, 503, 503, 684, 252, 435, 622, |
| 2195 | 256, 435, 210, 259, 265, 623, 262, 263, 211, 199, |
| 2196 | 212, 199, 408, 409, 410, 523, 768, 523, 645, 771, |
| 2197 | 703, 264, 773, 300, 299, 301, 776, 302, 778, 319, |
| 2198 | 313, 315, 316, 321, 344, 317, 333, 362, 728, 220, |
| 2199 | 382, 199, -461, 199, 326, 752, 199, 523, 388, 523, |
| 2200 | 213, 735, 503, 345, 365, 387, 389, 392, 305, 747, |
| 2201 | 214, 416, 16, 197, 18, 417, 418, 419, 436, 221, |
| 2202 | 435, 435, 751, 244, 453, 446, 455, 435, 457, 426, |
| 2203 | 456, 462, 466, 469, 476, 568, 569, 470, 480, 481, |
| 2204 | 483, 484, 487, 762, 327, 764, 488, 490, 489, 191, |
| 2205 | 491, 793, 508, 492, 539, 513, 636, 38, 527, 493, |
| 2206 | 543, 328, 495, 514, 496, 517, 552, 780, 515, 204, |
| 2207 | 518, 205, 787, 528, 789, 551, 790, 558, 559, 561, |
| 2208 | 562, 786, 435, 206, 207, 557, 565, 799, 208, 574, |
| 2209 | 801, 575, 636, 636, 592, 497, 576, 566, 577, 582, |
| 2210 | 581, 757, 220, 810, 583, 584, 588, 591, 220, 597, |
| 2211 | 601, 602, 54, 760, 209, 604, 763, 610, 603, 611, |
| 2212 | 613, 220, 615, 620, 435, 769, 519, 642, 643, 665, |
| 2213 | 651, 636, 329, 636, 636, 636, 636, 652, 657, 655, |
| 2214 | 63, 64, 668, 675, 693, 696, 698, 322, 711, 199, |
| 2215 | 199, 712, 724, 211, 727, 212, 732, 734, 746, 330, |
| 2216 | 748, 749, 750, 755, 758, 765, 467, 770, 772, 777, |
| 2217 | 779, 808, 15, 781, 658, 199, 199, 563, 663, 795, |
| 2218 | 364, 688, 503, 697, 431, 811, 788, 802, 761, 511, |
| 2219 | 199, 199, 199, 199, 731, 213, 807, 660, 805, 783, |
| 2220 | 407, 406, 411, 413, 414, 214, 307, 303, 449, 743, |
| 2221 | 415, 544, 266, 343, 343, 767, 621, 435, 744, 267, |
| 2222 | 647, 507, 599, 268, 269, 270, 271, 272, 273, 274, |
| 2223 | 376, 275, 460, 371, 412, 372, 228, 0, 0, 276, |
| 2224 | 0, 0, 0, 0, 277, 0, 0, 278, 0, 0, |
| 2225 | 0, 0, 325, 0, 220, 435, 279, 0, 0, 0, |
| 2226 | 0, 0, 199, 0, 0, 0, 220, 0, 759, 220, |
| 2227 | 0, 0, 280, 0, 0, 745, 0, 0, 220, 0, |
| 2228 | 0, 0, 0, 0, 0, 325, 0, 11, 0, 12, |
| 2229 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, |
| 2230 | 0, 25, 0, 0, 0, 0, 26, 27, 28, 0, |
| 2231 | 29, 199, 0, 0, 30, 0, 0, 798, 31, 0, |
| 2232 | 766, 0, 32, 33, 0, 0, 0, 0, 34, 0, |
| 2233 | 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, |
| 2234 | 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, |
| 2235 | 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, |
| 2236 | 0, 47, 0, 0, 0, 0, 48, 49, 0, 0, |
| 2237 | 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, |
| 2238 | 0, 0, 0, 52, 0, 0, 0, 0, 53, 0, |
| 2239 | 54, 0, 0, 0, 0, 55, 0, 0, 0, 56, |
| 2240 | 57, 58, 0, 0, 59, 0, 60, 61, 0, 0, |
| 2241 | 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, |
| 2242 | 0, 65, 0, 66, 67, 68, 0, 0, 69, 0, |
| 2243 | 0, 0, 0, 0, 0, 70, 0, 71, 0, 0, |
| 2244 | 0, 0, 72, 0, 73, 74, 0, 0, 0, 0, |
| 2245 | 0, 75, 76, 11, 0, 12, 16, 17, 18, 19, |
| 2246 | 20, 21, 22, 23, 24, 0, 0, 25, 0, 0, |
| 2247 | 0, 0, 26, 27, 28, 0, 29, 0, 0, 0, |
| 2248 | 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, |
| 2249 | 0, 0, 0, 0, 233, 0, 35, 36, 0, 0, |
| 2250 | 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, |
| 2251 | 0, 0, 0, 43, 0, 0, 44, 45, 0, 0, |
| 2252 | 46, 0, 0, 0, 0, 0, 0, 47, 0, 0, |
| 2253 | 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, |
| 2254 | 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, |
| 2255 | 0, 0, 0, 0, 53, 0, 54, 0, 0, 0, |
| 2256 | 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, |
| 2257 | 59, 0, 60, 61, 0, 0, 62, 0, 0, 0, |
| 2258 | 0, 0, 234, 0, 63, 64, 0, 65, 0, 66, |
| 2259 | 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, |
| 2260 | 0, 70, 0, 71, 0, 0, 0, 0, 72, 0, |
| 2261 | 73, 74, 0, 0, 0, 0, 0, 75, 76, 11, |
| 2262 | 0, 12, 16, 17, 18, 19, 20, 21, 22, 23, |
| 2263 | 24, 0, 0, 25, 0, 0, 0, 0, 26, 27, |
| 2264 | 28, 0, 29, 0, 0, 0, 30, 0, 0, 0, |
| 2265 | 31, 0, 0, 0, 32, 33, 0, 0, 0, 420, |
| 2266 | 233, 0, 35, 36, 0, 0, 37, 38, 39, 40, |
| 2267 | 41, 42, 0, 0, 0, 0, 0, 0, 0, 43, |
| 2268 | 0, 0, 44, 45, 0, 0, 46, 0, 0, 0, |
| 2269 | 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, |
| 2270 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2271 | 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, |
| 2272 | 53, 0, 54, 0, 0, 0, 0, 55, 0, 0, |
| 2273 | 0, 56, 57, 58, 0, 0, 59, 0, 60, 61, |
| 2274 | 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, |
| 2275 | 63, 64, 0, 65, 0, 66, 67, 68, 0, 0, |
| 2276 | 69, 0, 0, 0, 0, 0, 0, 70, 0, 71, |
| 2277 | 0, 0, 0, 0, 72, 0, 73, 74, 0, 0, |
| 2278 | 0, 0, 0, 75, 76, 11, 0, 12, 16, 17, |
| 2279 | 18, 19, 20, 21, 22, 23, 24, 0, 0, 25, |
| 2280 | 0, 0, 0, 0, 26, 27, 28, 0, 29, 0, |
| 2281 | 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, |
| 2282 | 32, 33, 0, 0, 0, 0, 233, 0, 35, 36, |
| 2283 | 0, 0, 37, 38, 39, 40, 41, 42, 0, 0, |
| 2284 | 0, 0, 0, 0, 0, 43, 0, 0, 44, 45, |
| 2285 | 0, 0, 46, 0, 0, 0, 0, 0, 0, 47, |
| 2286 | 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, |
| 2287 | 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, |
| 2288 | 0, 52, 0, 0, 0, 0, 53, 0, 54, 0, |
| 2289 | 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, |
| 2290 | 0, 0, 59, 0, 60, 61, 0, 0, 62, 0, |
| 2291 | 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, |
| 2292 | 0, 66, 67, 68, 0, 0, 69, 0, 0, 0, |
| 2293 | 0, 0, 0, 70, 0, 71, 0, 0, 0, 0, |
| 2294 | 72, 0, 73, 74, 0, 0, 0, 0, 0, 75, |
| 2295 | 76, 11, 0, 12, 16, 17, 18, 19, 20, 21, |
| 2296 | 22, 23, 24, 0, 0, 25, 0, 0, 0, 0, |
| 2297 | 26, 27, 0, 0, 29, 0, 0, 0, 30, 0, |
| 2298 | 0, 0, 31, 0, 0, 0, 32, 33, 0, 0, |
| 2299 | 0, 0, 233, 0, 35, 36, 0, 0, 37, 38, |
| 2300 | 39, 40, 41, 42, 0, 0, 0, 0, 0, 0, |
| 2301 | 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, |
| 2302 | 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, |
| 2303 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2304 | 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, |
| 2305 | 0, 0, 53, 0, 54, 0, 0, 0, 0, 55, |
| 2306 | 0, 0, 0, 56, 57, 58, 0, 0, 59, 0, |
| 2307 | 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, |
| 2308 | 0, 0, 63, 64, 0, 65, 0, 66, 67, 0, |
| 2309 | 0, 0, 69, 0, 0, 0, 0, 0, 0, 70, |
| 2310 | 0, 71, 0, 0, 0, 0, 0, 0, 73, 74, |
| 2311 | 0, 0, 0, 0, 0, 75, 76, 11, 0, 12, |
| 2312 | 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, |
| 2313 | 0, 25, 0, 0, 0, 0, 26, 27, 0, 0, |
| 2314 | 29, 0, 0, 0, 30, 0, 0, 0, 31, 0, |
| 2315 | 0, 0, 32, 33, 0, 0, 0, 0, 233, 0, |
| 2316 | 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, |
| 2317 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2318 | 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2319 | 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2320 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, |
| 2321 | 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, |
| 2322 | 54, 0, 0, 0, 0, 55, 0, 0, 0, 56, |
| 2323 | 57, 0, 0, 0, 0, 0, 60, 61, 0, 0, |
| 2324 | 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, |
| 2325 | 0, 65, 0, 0, 0, 0, 423, 0, 69, 0, |
| 2326 | 0, 0, 0, 0, 0, 70, 0, 71, 0, 0, |
| 2327 | 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, |
| 2328 | 0, 75, 76, 11, 0, 12, 16, 17, 18, 19, |
| 2329 | 20, 21, 22, 23, 24, 0, 0, 25, 0, 0, |
| 2330 | 0, 0, 26, 27, 0, 0, 29, 0, 0, 0, |
| 2331 | 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, |
| 2332 | 0, 0, 0, 0, 233, 0, 35, 36, 0, 0, |
| 2333 | 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, |
| 2334 | 0, 0, 0, 0, 0, 0, 44, 45, 0, 0, |
| 2335 | 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, |
| 2336 | 16, 17, 18, 19, 20, 0, 0, 23, 24, 0, |
| 2337 | 0, 0, 0, 0, 0, 51, 26, 628, 0, 0, |
| 2338 | 0, 0, 0, 0, 53, 0, 54, 0, 31, 0, |
| 2339 | 0, 55, 327, 0, 0, 56, 57, 0, 0, 0, |
| 2340 | 35, 36, 60, 61, 0, 38, 62, 0, 41, 328, |
| 2341 | 0, 0, 0, 0, 63, 64, 0, 65, 0, 0, |
| 2342 | 44, 45, 0, 0, 69, 0, 0, 0, 0, 0, |
| 2343 | 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, |
| 2344 | 73, 16, 197, 18, 19, 20, 0, 75, 76, 0, |
| 2345 | 0, 0, 0, 0, 0, 16, 197, 18, 19, 20, |
| 2346 | 54, 0, 23, 24, 0, 0, 0, 0, 0, 56, |
| 2347 | 0, 26, 628, 327, 0, 0, 60, 61, 0, 0, |
| 2348 | 329, 0, 0, 31, 0, 0, 38, 327, 63, 64, |
| 2349 | 328, 65, 0, 629, 630, 35, 36, 0, 69, 0, |
| 2350 | 38, 0, 0, 41, 328, 0, 0, 330, 0, 0, |
| 2351 | 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, |
| 2352 | 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2353 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2354 | 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, |
| 2355 | 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, |
| 2356 | 0, 329, 0, 0, 56, 0, 0, 0, 0, 0, |
| 2357 | 64, 60, 61, 0, 0, 329, 0, 0, 0, 69, |
| 2358 | 0, 0, 0, 63, 64, 0, 65, 0, 330, 0, |
| 2359 | 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, |
| 2360 | 0, 0, 330 |
| 2361 | }; |
| 2362 | |
| 2363 | static const yytype_int16 yycheck[] = |
| 2364 | { |
| 2365 | 30, 246, 53, 25, 51, 417, 30, 262, 263, 39, |
| 2366 | 314, 62, 35, 321, 341, 190, 343, 311, 312, 4, |
| 2367 | 687, 32, 416, 417, 36, 76, 3, 38, 5, 59, |
| 2368 | 7, 42, 6, 7, 8, 32, 87, 37, 379, 347, |
| 2369 | 37, 224, 225, 54, 29, 42, 52, 37, 37, 16, |
| 2370 | 52, 62, 709, 50, 90, 593, 35, 95, 111, 400, |
| 2371 | 71, 55, 317, 45, 476, 350, 20, 686, 353, 252, |
| 2372 | 6, 7, 8, 49, 71, 383, 55, 128, 386, 364, |
| 2373 | 70, 19, 476, 95, 37, 6, 7, 8, 37, 37, |
| 2374 | 709, 732, 71, 338, 95, 79, 64, 98, 6, 7, |
| 2375 | 37, 42, 165, 686, 94, 81, 37, 160, 92, 145, |
| 2376 | 48, 65, 416, 417, 6, 7, 8, 9, 10, 87, |
| 2377 | 37, 37, 104, 113, 765, 101, 709, 468, 166, 131, |
| 2378 | 668, 23, 132, 70, 113, 163, 803, 159, 132, 314, |
| 2379 | 7, 135, 193, 166, 133, 486, 38, 455, 456, 434, |
| 2380 | 201, 157, 809, 143, 166, 132, 31, 94, 188, 51, |
| 2381 | 190, 191, 129, 55, 215, 450, 95, 75, 144, 454, |
| 2382 | 45, 222, 476, 458, 164, 42, 113, 796, 463, 120, |
| 2383 | 133, 211, 229, 132, 132, 0, 237, 211, 102, 236, |
| 2384 | 809, 221, 222, 167, 224, 225, 132, 221, 222, 184, |
| 2385 | 44, 132, 253, 254, 387, 546, 143, 204, 144, 256, |
| 2386 | 195, 132, 209, 796, 106, 132, 132, 214, 248, 249, |
| 2387 | 128, 104, 252, 144, 248, 249, 809, 164, 95, 3, |
| 2388 | 475, 5, 629, 630, 126, 69, 102, 166, 117, 83, |
| 2389 | 59, 84, 134, 135, 656, 6, 7, 532, 127, 534, |
| 2390 | 535, 559, 144, 3, 4, 5, 241, 512, 305, 244, |
| 2391 | 7, 153, 656, 97, 107, 144, 313, 99, 42, 316, |
| 2392 | 136, 441, 99, 670, 671, 560, 42, 27, 563, 139, |
| 2393 | 140, 622, 623, 577, 314, 117, 469, 139, 140, 39, |
| 2394 | 117, 124, 42, 6, 7, 8, 551, 344, 124, 65, |
| 2395 | 545, 471, 557, 473, 113, 139, 140, 592, 95, 339, |
| 2396 | 595, 566, 100, 146, 108, 339, 327, 328, 329, 330, |
| 2397 | 146, 648, 649, 664, 26, 95, 28, 77, 155, 42, |
| 2398 | 124, 361, 672, 673, 143, 365, 321, 148, 40, 41, |
| 2399 | 3, 365, 5, 45, 652, 66, 67, 602, 6, 7, |
| 2400 | 8, 3, 656, 5, 166, 610, 341, 387, 343, 6, |
| 2401 | 7, 8, 347, 418, 419, 620, 116, 95, 52, 71, |
| 2402 | 52, 95, 357, 6, 7, 8, 42, 95, 363, 6, |
| 2403 | 7, 8, 690, 150, 639, 95, 416, 417, 418, 419, |
| 2404 | 95, 676, 416, 417, 418, 419, 651, 52, 383, 582, |
| 2405 | 95, 386, 104, 7, 15, 588, 37, 37, 110, 439, |
| 2406 | 112, 441, 281, 282, 283, 439, 757, 441, 601, 760, |
| 2407 | 675, 114, 763, 156, 86, 32, 767, 33, 769, 138, |
| 2408 | 91, 36, 91, 73, 42, 95, 132, 7, 693, 469, |
| 2409 | 104, 471, 95, 473, 95, 730, 476, 471, 104, 473, |
| 2410 | 152, 706, 476, 95, 103, 52, 132, 149, 42, 714, |
| 2411 | 162, 109, 6, 7, 8, 18, 18, 18, 7, 95, |
| 2412 | 455, 456, 727, 95, 37, 132, 104, 462, 57, 23, |
| 2413 | 104, 73, 98, 52, 18, 496, 497, 132, 132, 7, |
| 2414 | 55, 7, 7, 748, 38, 750, 43, 132, 119, 95, |
| 2415 | 132, 786, 43, 132, 95, 130, 593, 51, 43, 132, |
| 2416 | 95, 55, 132, 130, 58, 73, 21, 772, 132, 26, |
| 2417 | 132, 28, 777, 132, 779, 85, 781, 73, 21, 104, |
| 2418 | 73, 776, 517, 40, 41, 154, 73, 792, 45, 127, |
| 2419 | 795, 29, 629, 630, 541, 89, 113, 85, 131, 52, |
| 2420 | 37, 734, 582, 808, 132, 132, 52, 42, 588, 127, |
| 2421 | 52, 85, 106, 746, 71, 73, 749, 20, 118, 3, |
| 2422 | 31, 601, 29, 37, 559, 758, 157, 132, 132, 626, |
| 2423 | 56, 668, 126, 670, 671, 672, 673, 37, 60, 52, |
| 2424 | 134, 135, 25, 20, 20, 43, 132, 104, 16, 629, |
| 2425 | 630, 129, 18, 110, 35, 112, 100, 52, 52, 153, |
| 2426 | 131, 52, 131, 125, 52, 37, 95, 75, 131, 85, |
| 2427 | 20, 131, 9, 85, 619, 655, 656, 485, 624, 85, |
| 2428 | 212, 655, 656, 668, 317, 809, 778, 796, 747, 423, |
| 2429 | 670, 671, 672, 673, 695, 152, 803, 620, 800, 774, |
| 2430 | 265, 264, 286, 292, 295, 162, 130, 122, 345, 710, |
| 2431 | 298, 467, 61, 648, 649, 756, 581, 652, 710, 68, |
| 2432 | 603, 419, 548, 72, 73, 74, 75, 76, 77, 78, |
| 2433 | 222, 80, 361, 216, 287, 216, 47, -1, -1, 88, |
| 2434 | -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, |
| 2435 | -1, -1, 732, -1, 734, 690, 105, -1, -1, -1, |
| 2436 | -1, -1, 742, -1, -1, -1, 746, -1, 742, 749, |
| 2437 | -1, -1, 121, -1, -1, 710, -1, -1, 758, -1, |
| 2438 | -1, -1, -1, -1, -1, 765, -1, 3, -1, 5, |
| 2439 | 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, |
| 2440 | -1, 17, -1, -1, -1, -1, 22, 23, 24, -1, |
| 2441 | 26, 791, -1, -1, 30, -1, -1, 791, 34, -1, |
| 2442 | 755, -1, 38, 39, -1, -1, -1, -1, 44, -1, |
| 2443 | 46, 47, -1, -1, 50, 51, 52, 53, 54, 55, |
| 2444 | -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, |
| 2445 | 66, 67, -1, -1, 70, -1, -1, -1, -1, -1, |
| 2446 | -1, 77, -1, -1, -1, -1, 82, 83, -1, -1, |
| 2447 | -1, -1, -1, -1, -1, -1, -1, -1, 94, 95, |
| 2448 | -1, -1, -1, 99, -1, -1, -1, -1, 104, -1, |
| 2449 | 106, -1, -1, -1, -1, 111, -1, -1, -1, 115, |
| 2450 | 116, 117, -1, -1, 120, -1, 122, 123, -1, -1, |
| 2451 | 126, -1, -1, -1, -1, -1, -1, -1, 134, 135, |
| 2452 | -1, 137, -1, 139, 140, 141, -1, -1, 144, -1, |
| 2453 | -1, -1, -1, -1, -1, 151, -1, 153, -1, -1, |
| 2454 | -1, -1, 158, -1, 160, 161, -1, -1, -1, -1, |
| 2455 | -1, 167, 168, 3, -1, 5, 6, 7, 8, 9, |
| 2456 | 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, |
| 2457 | -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, |
| 2458 | 30, -1, -1, -1, 34, -1, -1, -1, 38, 39, |
| 2459 | -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, |
| 2460 | 50, 51, 52, 53, 54, 55, -1, -1, -1, -1, |
| 2461 | -1, -1, -1, 63, -1, -1, 66, 67, -1, -1, |
| 2462 | 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, |
| 2463 | -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, |
| 2464 | -1, -1, -1, -1, 94, 95, -1, -1, -1, 99, |
| 2465 | -1, -1, -1, -1, 104, -1, 106, -1, -1, -1, |
| 2466 | -1, 111, -1, -1, -1, 115, 116, 117, -1, -1, |
| 2467 | 120, -1, 122, 123, -1, -1, 126, -1, -1, -1, |
| 2468 | -1, -1, 132, -1, 134, 135, -1, 137, -1, 139, |
| 2469 | 140, 141, -1, -1, 144, -1, -1, -1, -1, -1, |
| 2470 | -1, 151, -1, 153, -1, -1, -1, -1, 158, -1, |
| 2471 | 160, 161, -1, -1, -1, -1, -1, 167, 168, 3, |
| 2472 | -1, 5, 6, 7, 8, 9, 10, 11, 12, 13, |
| 2473 | 14, -1, -1, 17, -1, -1, -1, -1, 22, 23, |
| 2474 | 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, |
| 2475 | 34, -1, -1, -1, 38, 39, -1, -1, -1, 43, |
| 2476 | 44, -1, 46, 47, -1, -1, 50, 51, 52, 53, |
| 2477 | 54, 55, -1, -1, -1, -1, -1, -1, -1, 63, |
| 2478 | -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, |
| 2479 | -1, -1, -1, 77, -1, -1, -1, -1, 82, -1, |
| 2480 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2481 | 94, 95, -1, -1, -1, 99, -1, -1, -1, -1, |
| 2482 | 104, -1, 106, -1, -1, -1, -1, 111, -1, -1, |
| 2483 | -1, 115, 116, 117, -1, -1, 120, -1, 122, 123, |
| 2484 | -1, -1, 126, -1, -1, -1, -1, -1, -1, -1, |
| 2485 | 134, 135, -1, 137, -1, 139, 140, 141, -1, -1, |
| 2486 | 144, -1, -1, -1, -1, -1, -1, 151, -1, 153, |
| 2487 | -1, -1, -1, -1, 158, -1, 160, 161, -1, -1, |
| 2488 | -1, -1, -1, 167, 168, 3, -1, 5, 6, 7, |
| 2489 | 8, 9, 10, 11, 12, 13, 14, -1, -1, 17, |
| 2490 | -1, -1, -1, -1, 22, 23, 24, -1, 26, -1, |
| 2491 | -1, -1, 30, -1, -1, -1, 34, -1, -1, -1, |
| 2492 | 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, |
| 2493 | -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, |
| 2494 | -1, -1, -1, -1, -1, 63, -1, -1, 66, 67, |
| 2495 | -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, |
| 2496 | -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, |
| 2497 | -1, -1, -1, -1, -1, -1, 94, 95, -1, -1, |
| 2498 | -1, 99, -1, -1, -1, -1, 104, -1, 106, -1, |
| 2499 | -1, -1, -1, 111, -1, -1, -1, 115, 116, 117, |
| 2500 | -1, -1, 120, -1, 122, 123, -1, -1, 126, -1, |
| 2501 | -1, -1, -1, -1, -1, -1, 134, 135, -1, 137, |
| 2502 | -1, 139, 140, 141, -1, -1, 144, -1, -1, -1, |
| 2503 | -1, -1, -1, 151, -1, 153, -1, -1, -1, -1, |
| 2504 | 158, -1, 160, 161, -1, -1, -1, -1, -1, 167, |
| 2505 | 168, 3, -1, 5, 6, 7, 8, 9, 10, 11, |
| 2506 | 12, 13, 14, -1, -1, 17, -1, -1, -1, -1, |
| 2507 | 22, 23, -1, -1, 26, -1, -1, -1, 30, -1, |
| 2508 | -1, -1, 34, -1, -1, -1, 38, 39, -1, -1, |
| 2509 | -1, -1, 44, -1, 46, 47, -1, -1, 50, 51, |
| 2510 | 52, 53, 54, 55, -1, -1, -1, -1, -1, -1, |
| 2511 | -1, -1, -1, -1, 66, 67, -1, -1, -1, -1, |
| 2512 | -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, |
| 2513 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2514 | -1, -1, -1, 95, -1, -1, -1, 99, -1, -1, |
| 2515 | -1, -1, 104, -1, 106, -1, -1, -1, -1, 111, |
| 2516 | -1, -1, -1, 115, 116, 117, -1, -1, 120, -1, |
| 2517 | 122, 123, -1, -1, 126, -1, -1, -1, -1, -1, |
| 2518 | -1, -1, 134, 135, -1, 137, -1, 139, 140, -1, |
| 2519 | -1, -1, 144, -1, -1, -1, -1, -1, -1, 151, |
| 2520 | -1, 153, -1, -1, -1, -1, -1, -1, 160, 161, |
| 2521 | -1, -1, -1, -1, -1, 167, 168, 3, -1, 5, |
| 2522 | 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, |
| 2523 | -1, 17, -1, -1, -1, -1, 22, 23, -1, -1, |
| 2524 | 26, -1, -1, -1, 30, -1, -1, -1, 34, -1, |
| 2525 | -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, |
| 2526 | 46, 47, -1, -1, 50, 51, 52, 53, 54, 55, |
| 2527 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2528 | 66, 67, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2529 | -1, 77, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2530 | -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, |
| 2531 | -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, |
| 2532 | 106, -1, -1, -1, -1, 111, -1, -1, -1, 115, |
| 2533 | 116, -1, -1, -1, -1, -1, 122, 123, -1, -1, |
| 2534 | 126, -1, -1, -1, -1, -1, -1, -1, 134, 135, |
| 2535 | -1, 137, -1, -1, -1, -1, 142, -1, 144, -1, |
| 2536 | -1, -1, -1, -1, -1, 151, -1, 153, -1, -1, |
| 2537 | -1, -1, -1, -1, 160, -1, -1, -1, -1, -1, |
| 2538 | -1, 167, 168, 3, -1, 5, 6, 7, 8, 9, |
| 2539 | 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, |
| 2540 | -1, -1, 22, 23, -1, -1, 26, -1, -1, -1, |
| 2541 | 30, -1, -1, -1, 34, -1, -1, -1, 38, 39, |
| 2542 | -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, |
| 2543 | 50, 51, 52, 53, 54, 55, -1, -1, -1, -1, |
| 2544 | -1, -1, -1, -1, -1, -1, 66, 67, -1, -1, |
| 2545 | -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, |
| 2546 | 6, 7, 8, 9, 10, -1, -1, 13, 14, -1, |
| 2547 | -1, -1, -1, -1, -1, 95, 22, 23, -1, -1, |
| 2548 | -1, -1, -1, -1, 104, -1, 106, -1, 34, -1, |
| 2549 | -1, 111, 38, -1, -1, 115, 116, -1, -1, -1, |
| 2550 | 46, 47, 122, 123, -1, 51, 126, -1, 54, 55, |
| 2551 | -1, -1, -1, -1, 134, 135, -1, 137, -1, -1, |
| 2552 | 66, 67, -1, -1, 144, -1, -1, -1, -1, -1, |
| 2553 | -1, 151, -1, 153, -1, -1, -1, -1, -1, -1, |
| 2554 | 160, 6, 7, 8, 9, 10, -1, 167, 168, -1, |
| 2555 | -1, -1, -1, -1, -1, 6, 7, 8, 9, 10, |
| 2556 | 106, -1, 13, 14, -1, -1, -1, -1, -1, 115, |
| 2557 | -1, 22, 23, 38, -1, -1, 122, 123, -1, -1, |
| 2558 | 126, -1, -1, 34, -1, -1, 51, 38, 134, 135, |
| 2559 | 55, 137, -1, 139, 140, 46, 47, -1, 144, -1, |
| 2560 | 51, -1, -1, 54, 55, -1, -1, 153, -1, -1, |
| 2561 | -1, -1, -1, -1, -1, 66, 67, -1, -1, -1, |
| 2562 | -1, 167, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2563 | -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2564 | -1, 106, -1, -1, -1, -1, -1, -1, -1, -1, |
| 2565 | -1, -1, -1, -1, -1, 106, -1, -1, -1, -1, |
| 2566 | -1, 126, -1, -1, 115, -1, -1, -1, -1, -1, |
| 2567 | 135, 122, 123, -1, -1, 126, -1, -1, -1, 144, |
| 2568 | -1, -1, -1, 134, 135, -1, 137, -1, 153, -1, |
| 2569 | -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, |
| 2570 | -1, -1, 153 |
| 2571 | }; |
| 2572 | |
| 2573 | /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing |
| 2574 | symbol of state STATE-NUM. */ |
| 2575 | static const yytype_uint16 yystos[] = |
| 2576 | { |
| 2577 | 0, 165, 170, 171, 163, 0, 102, 173, 174, 175, |
| 2578 | 176, 3, 5, 404, 104, 176, 6, 7, 8, 9, |
| 2579 | 10, 11, 12, 13, 14, 17, 22, 23, 24, 26, |
| 2580 | 30, 34, 38, 39, 44, 46, 47, 50, 51, 52, |
| 2581 | 53, 54, 55, 63, 66, 67, 70, 77, 82, 83, |
| 2582 | 94, 95, 99, 104, 106, 111, 115, 116, 117, 120, |
| 2583 | 122, 123, 126, 134, 135, 137, 139, 140, 141, 144, |
| 2584 | 151, 153, 158, 160, 161, 167, 168, 177, 183, 184, |
| 2585 | 186, 187, 189, 190, 191, 192, 193, 194, 195, 197, |
| 2586 | 200, 201, 202, 204, 208, 211, 213, 219, 225, 226, |
| 2587 | 227, 232, 233, 240, 253, 254, 260, 267, 276, 277, |
| 2588 | 278, 279, 280, 281, 283, 285, 286, 289, 290, 291, |
| 2589 | 292, 293, 294, 295, 296, 298, 300, 302, 303, 304, |
| 2590 | 306, 307, 309, 310, 311, 322, 323, 324, 327, 328, |
| 2591 | 329, 331, 332, 333, 334, 335, 336, 337, 338, 339, |
| 2592 | 340, 342, 343, 344, 345, 347, 348, 349, 358, 359, |
| 2593 | 360, 361, 362, 365, 366, 367, 368, 375, 382, 383, |
| 2594 | 384, 386, 387, 388, 389, 390, 391, 392, 394, 397, |
| 2595 | 399, 400, 404, 405, 59, 172, 7, 44, 100, 229, |
| 2596 | 330, 95, 166, 364, 395, 95, 404, 7, 397, 405, |
| 2597 | 95, 364, 395, 148, 26, 28, 40, 41, 45, 71, |
| 2598 | 104, 110, 112, 152, 162, 364, 95, 395, 7, 341, |
| 2599 | 405, 95, 364, 395, 52, 52, 6, 7, 401, 95, |
| 2600 | 102, 136, 364, 44, 132, 225, 42, 218, 395, 150, |
| 2601 | 7, 402, 405, 7, 95, 218, 374, 395, 95, 95, |
| 2602 | 310, 310, 52, 312, 364, 395, 95, 90, 145, 7, |
| 2603 | 218, 218, 37, 37, 114, 15, 61, 68, 72, 73, |
| 2604 | 74, 75, 76, 77, 78, 80, 88, 93, 96, 105, |
| 2605 | 121, 297, 299, 301, 99, 117, 155, 282, 49, 81, |
| 2606 | 101, 144, 284, 25, 159, 287, 64, 87, 288, 86, |
| 2607 | 156, 32, 33, 293, 218, 42, 305, 307, 69, 97, |
| 2608 | 139, 140, 321, 91, 325, 36, 91, 95, 404, 138, |
| 2609 | 185, 73, 104, 7, 231, 405, 95, 38, 55, 126, |
| 2610 | 153, 333, 7, 132, 144, 396, 405, 218, 369, 370, |
| 2611 | 373, 218, 356, 404, 42, 95, 218, 364, 124, 146, |
| 2612 | 188, 124, 146, 212, 108, 124, 198, 35, 55, 71, |
| 2613 | 113, 364, 7, 397, 194, 103, 181, 182, 364, 218, |
| 2614 | 385, 392, 394, 144, 397, 372, 373, 397, 341, 341, |
| 2615 | 350, 225, 104, 205, 45, 104, 203, 52, 104, 132, |
| 2616 | 225, 218, 149, 308, 404, 7, 404, 305, 397, 397, |
| 2617 | 341, 218, 218, 225, 227, 227, 278, 279, 280, 280, |
| 2618 | 280, 281, 283, 285, 286, 289, 109, 18, 18, 18, |
| 2619 | 43, 225, 311, 142, 311, 225, 23, 326, 333, 389, |
| 2620 | 225, 226, 227, 346, 403, 404, 7, 314, 315, 37, |
| 2621 | 132, 37, 132, 305, 397, 356, 132, 356, 225, 314, |
| 2622 | 403, 185, 185, 37, 404, 104, 104, 57, 196, 7, |
| 2623 | 399, 405, 73, 404, 185, 397, 98, 95, 317, 52, |
| 2624 | 132, 37, 132, 37, 132, 363, 18, 377, 377, 353, |
| 2625 | 132, 7, 403, 55, 7, 403, 341, 7, 43, 119, |
| 2626 | 132, 132, 132, 132, 377, 132, 58, 89, 378, 380, |
| 2627 | 381, 382, 389, 397, 378, 376, 381, 376, 43, 113, |
| 2628 | 143, 246, 252, 130, 130, 132, 185, 73, 132, 157, |
| 2629 | 316, 318, 319, 397, 398, 398, 371, 43, 132, 185, |
| 2630 | 84, 107, 199, 185, 403, 403, 79, 92, 185, 95, |
| 2631 | 3, 403, 185, 95, 316, 377, 341, 398, 398, 305, |
| 2632 | 378, 85, 21, 239, 351, 354, 401, 154, 73, 21, |
| 2633 | 206, 104, 73, 206, 377, 73, 85, 268, 395, 395, |
| 2634 | 117, 127, 144, 379, 127, 29, 113, 131, 227, 247, |
| 2635 | 248, 37, 52, 132, 132, 185, 185, 185, 52, 215, |
| 2636 | 216, 42, 364, 178, 132, 305, 377, 127, 393, 393, |
| 2637 | 227, 52, 85, 118, 73, 227, 207, 403, 185, 185, |
| 2638 | 20, 3, 227, 31, 269, 29, 311, 19, 48, 249, |
| 2639 | 37, 318, 341, 341, 37, 132, 313, 185, 23, 139, |
| 2640 | 140, 220, 221, 222, 223, 224, 322, 345, 185, 20, |
| 2641 | 65, 209, 132, 132, 261, 341, 227, 353, 16, 129, |
| 2642 | 355, 56, 37, 227, 255, 52, 273, 60, 196, 250, |
| 2643 | 248, 377, 377, 216, 214, 225, 223, 223, 25, 179, |
| 2644 | 139, 140, 139, 140, 227, 20, 210, 262, 234, 75, |
| 2645 | 128, 352, 356, 356, 227, 403, 241, 256, 397, 378, |
| 2646 | 35, 166, 251, 20, 320, 377, 43, 221, 132, 223, |
| 2647 | 223, 224, 224, 227, 185, 37, 133, 263, 266, 235, |
| 2648 | 357, 16, 129, 37, 164, 233, 240, 242, 244, 245, |
| 2649 | 246, 37, 257, 266, 18, 270, 403, 35, 227, 65, |
| 2650 | 217, 218, 100, 228, 52, 227, 37, 233, 236, 240, |
| 2651 | 244, 4, 27, 218, 348, 404, 52, 227, 131, 52, |
| 2652 | 131, 227, 185, 230, 231, 125, 180, 341, 52, 397, |
| 2653 | 341, 245, 227, 341, 227, 37, 404, 317, 377, 341, |
| 2654 | 75, 377, 131, 377, 271, 231, 377, 85, 377, 20, |
| 2655 | 227, 85, 45, 269, 272, 274, 305, 227, 239, 227, |
| 2656 | 227, 52, 131, 185, 264, 85, 243, 258, 397, 227, |
| 2657 | 265, 227, 242, 259, 275, 263, 237, 257, 131, 238, |
| 2658 | 227, 236 |
| 2659 | }; |
| 2660 | |
| 2661 | /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ |
| 2662 | static const yytype_uint16 yyr1[] = |
| 2663 | { |
| 2664 | 0, 169, 170, 170, 171, 171, 172, 172, 173, 174, |
| 2665 | 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, |
| 2666 | 177, 178, 179, 177, 180, 180, 181, 181, 182, 183, |
| 2667 | 183, 183, 183, 183, 183, 183, 184, 184, 185, 186, |
| 2668 | 187, 188, 188, 189, 189, 190, 191, 192, 193, 194, |
| 2669 | 194, 195, 196, 196, 197, 198, 198, 199, 199, 200, |
| 2670 | 201, 202, 203, 203, 203, 204, 205, 205, 206, 206, |
| 2671 | 207, 207, 208, 209, 209, 210, 210, 211, 212, 212, |
| 2672 | 214, 213, 215, 215, 215, 216, 217, 217, 218, 219, |
| 2673 | 220, 220, 221, 221, 221, 221, 221, 221, 221, 222, |
| 2674 | 223, 223, 223, 224, 225, 225, 226, 226, 227, 227, |
| 2675 | 227, 227, 227, 227, 228, 228, 229, 229, 230, 230, |
| 2676 | 231, 231, 232, 232, 234, 235, 233, 237, 238, 236, |
| 2677 | 236, 236, 236, 239, 239, 241, 240, 243, 242, 242, |
| 2678 | 242, 242, 244, 244, 245, 245, 246, 247, 247, 248, |
| 2679 | 249, 249, 249, 250, 250, 251, 251, 251, 252, 252, |
| 2680 | 253, 253, 255, 256, 254, 258, 259, 257, 257, 261, |
| 2681 | 262, 260, 264, 265, 263, 263, 266, 268, 267, 270, |
| 2682 | 271, 269, 272, 272, 273, 273, 274, 275, 274, 276, |
| 2683 | 277, 277, 278, 278, 279, 279, 279, 279, 280, 280, |
| 2684 | 281, 281, 282, 282, 283, 283, 284, 284, 284, 284, |
| 2685 | 285, 285, 286, 286, 287, 287, 288, 288, 289, 289, |
| 2686 | 290, 290, 291, 291, 292, 292, 293, 293, 294, 294, |
| 2687 | 295, 295, 295, 296, 297, 297, 297, 297, 297, 297, |
| 2688 | 298, 299, 299, 299, 299, 299, 299, 300, 301, 301, |
| 2689 | 301, 302, 303, 303, 303, 304, 305, 305, 306, 306, |
| 2690 | 307, 308, 308, 309, 309, 309, 309, 310, 310, 310, |
| 2691 | 310, 311, 311, 311, 312, 311, 311, 313, 311, 311, |
| 2692 | 315, 314, 316, 316, 316, 317, 317, 318, 319, 319, |
| 2693 | 320, 320, 321, 321, 321, 322, 322, 323, 323, 325, |
| 2694 | 324, 324, 326, 326, 327, 328, 328, 328, 328, 328, |
| 2695 | 328, 328, 328, 328, 328, 328, 328, 330, 329, 329, |
| 2696 | 329, 331, 332, 333, 333, 334, 334, 335, 335, 335, |
| 2697 | 336, 336, 337, 337, 337, 337, 337, 337, 337, 337, |
| 2698 | 338, 338, 339, 339, 340, 341, 341, 342, 342, 343, |
| 2699 | 344, 345, 346, 346, 346, 347, 347, 348, 348, 348, |
| 2700 | 350, 351, 349, 352, 352, 353, 353, 354, 355, 355, |
| 2701 | 356, 356, 356, 357, 357, 357, 357, 357, 358, 359, |
| 2702 | 360, 360, 360, 360, 360, 360, 360, 361, 363, 362, |
| 2703 | 364, 364, 365, 366, 367, 368, 370, 371, 369, 369, |
| 2704 | 372, 372, 373, 374, 374, 375, 376, 376, 377, 377, |
| 2705 | 378, 378, 379, 379, 379, 379, 380, 380, 380, 380, |
| 2706 | 381, 382, 382, 382, 382, 382, 382, 382, 383, 384, |
| 2707 | 384, 385, 385, 386, 387, 388, 388, 388, 389, 389, |
| 2708 | 390, 390, 390, 390, 390, 391, 392, 392, 392, 392, |
| 2709 | 392, 393, 393, 394, 395, 396, 396, 397, 397, 398, |
| 2710 | 399, 399, 400, 400, 401, 401, 402, 402, 403, 404, |
| 2711 | 404, 405, 405 |
| 2712 | }; |
| 2713 | |
| 2714 | /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ |
| 2715 | static const yytype_uint8 yyr2[] = |
| 2716 | { |
| 2717 | 0, 2, 2, 2, 0, 5, 0, 2, 2, 2, |
| 2718 | 6, 0, 2, 2, 2, 2, 2, 2, 2, 2, |
| 2719 | 7, 0, 0, 15, 0, 2, 0, 1, 2, 1, |
| 2720 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, |
| 2721 | 4, 1, 1, 1, 1, 6, 6, 5, 4, 1, |
| 2722 | 1, 5, 2, 2, 6, 1, 1, 1, 1, 5, |
| 2723 | 5, 6, 0, 3, 3, 6, 0, 3, 0, 2, |
| 2724 | 1, 3, 9, 1, 2, 0, 2, 4, 1, 1, |
| 2725 | 0, 11, 0, 1, 3, 3, 1, 1, 3, 1, |
| 2726 | 1, 3, 1, 1, 2, 2, 1, 3, 3, 1, |
| 2727 | 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, |
| 2728 | 1, 1, 1, 4, 0, 2, 0, 2, 1, 3, |
| 2729 | 1, 1, 1, 1, 0, 0, 10, 0, 0, 10, |
| 2730 | 1, 1, 1, 0, 3, 0, 9, 0, 8, 1, |
| 2731 | 1, 1, 3, 5, 0, 1, 2, 3, 1, 4, |
| 2732 | 0, 1, 1, 0, 1, 0, 2, 3, 3, 2, |
| 2733 | 1, 1, 0, 0, 9, 0, 0, 9, 1, 0, |
| 2734 | 0, 9, 0, 0, 9, 1, 2, 0, 6, 0, |
| 2735 | 0, 8, 1, 1, 0, 3, 3, 0, 6, 8, |
| 2736 | 1, 3, 1, 3, 1, 1, 1, 1, 1, 3, |
| 2737 | 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, |
| 2738 | 1, 3, 1, 3, 1, 1, 1, 1, 1, 4, |
| 2739 | 1, 4, 1, 4, 1, 4, 1, 2, 1, 1, |
| 2740 | 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, |
| 2741 | 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, |
| 2742 | 1, 2, 1, 2, 2, 2, 2, 3, 2, 1, |
| 2743 | 4, 0, 1, 2, 2, 1, 1, 1, 3, 7, |
| 2744 | 3, 1, 1, 2, 0, 3, 5, 0, 9, 5, |
| 2745 | 0, 2, 0, 1, 3, 0, 3, 5, 0, 1, |
| 2746 | 0, 2, 1, 1, 1, 1, 4, 1, 1, 0, |
| 2747 | 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, |
| 2748 | 1, 1, 1, 1, 1, 1, 1, 0, 3, 1, |
| 2749 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
| 2750 | 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, |
| 2751 | 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, |
| 2752 | 2, 4, 0, 1, 1, 1, 1, 1, 1, 1, |
| 2753 | 0, 0, 8, 1, 5, 0, 2, 3, 3, 3, |
| 2754 | 0, 2, 2, 0, 2, 2, 2, 2, 2, 3, |
| 2755 | 1, 1, 1, 1, 1, 1, 1, 3, 0, 5, |
| 2756 | 0, 1, 4, 3, 3, 3, 0, 0, 3, 1, |
| 2757 | 1, 1, 1, 1, 1, 3, 1, 2, 0, 2, |
| 2758 | 2, 2, 0, 1, 1, 1, 1, 1, 1, 2, |
| 2759 | 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, |
| 2760 | 4, 1, 1, 2, 2, 2, 4, 4, 1, 1, |
| 2761 | 2, 4, 4, 6, 6, 4, 2, 4, 4, 7, |
| 2762 | 7, 0, 1, 4, 2, 1, 1, 1, 1, 1, |
| 2763 | 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, |
| 2764 | 1, 1, 1 |
| 2765 | }; |
| 2766 | |
| 2767 | |
| 2768 | #define yyerrok (yyerrstatus = 0) |
| 2769 | #define yyclearin (yychar = YYEMPTY) |
| 2770 | #define YYEMPTY (-2) |
| 2771 | #define YYEOF 0 |
| 2772 | |
| 2773 | #define YYACCEPT goto yyacceptlab |
| 2774 | #define YYABORT goto yyabortlab |
| 2775 | #define YYERROR goto yyerrorlab |
| 2776 | |
| 2777 | |
| 2778 | #define YYRECOVERING() (!!yyerrstatus) |
| 2779 | |
| 2780 | #define YYBACKUP(Token, Value) \ |
| 2781 | do \ |
| 2782 | if (yychar == YYEMPTY) \ |
| 2783 | { \ |
| 2784 | yychar = (Token); \ |
| 2785 | yylval = (Value); \ |
| 2786 | YYPOPSTACK (yylen); \ |
| 2787 | yystate = *yyssp; \ |
| 2788 | goto yybackup; \ |
| 2789 | } \ |
| 2790 | else \ |
| 2791 | { \ |
| 2792 | yyerror (&yylloc, parseInfo, YY_("syntax error: cannot back up")); \ |
| 2793 | YYERROR; \ |
| 2794 | } \ |
| 2795 | while (0) |
| 2796 | |
| 2797 | /* Error token number */ |
| 2798 | #define YYTERROR 1 |
| 2799 | #define YYERRCODE 256 |
| 2800 | |
| 2801 | |
| 2802 | /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. |
| 2803 | If N is 0, then set CURRENT to the empty location which ends |
| 2804 | the previous symbol: RHS[0] (always defined). */ |
| 2805 | |
| 2806 | #ifndef YYLLOC_DEFAULT |
| 2807 | # define YYLLOC_DEFAULT(Current, Rhs, N) \ |
| 2808 | do \ |
| 2809 | if (N) \ |
| 2810 | { \ |
| 2811 | (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ |
| 2812 | (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ |
| 2813 | (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ |
| 2814 | (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ |
| 2815 | } \ |
| 2816 | else \ |
| 2817 | { \ |
| 2818 | (Current).first_line = (Current).last_line = \ |
| 2819 | YYRHSLOC (Rhs, 0).last_line; \ |
| 2820 | (Current).first_column = (Current).last_column = \ |
| 2821 | YYRHSLOC (Rhs, 0).last_column; \ |
| 2822 | } \ |
| 2823 | while (0) |
| 2824 | #endif |
| 2825 | |
| 2826 | #define YYRHSLOC(Rhs, K) ((Rhs)[K]) |
| 2827 | |
| 2828 | |
| 2829 | /* Enable debugging if requested. */ |
| 2830 | #if XPATHDEBUG |
| 2831 | |
| 2832 | # ifndef YYFPRINTF |
| 2833 | # include <stdio.h> /* INFRINGES ON USER NAME SPACE */ |
| 2834 | # define YYFPRINTF fprintf |
| 2835 | # endif |
| 2836 | |
| 2837 | # define YYDPRINTF(Args) \ |
| 2838 | do { \ |
| 2839 | if (yydebug) \ |
| 2840 | YYFPRINTF Args; \ |
| 2841 | } while (0) |
| 2842 | |
| 2843 | |
| 2844 | /* YY_LOCATION_PRINT -- Print the location on the stream. |
| 2845 | This macro was not mandated originally: define only if we know |
| 2846 | we won't break user code: when these are the locations we know. */ |
| 2847 | |
| 2848 | #ifndef YY_LOCATION_PRINT |
| 2849 | # if defined XPATHLTYPE_IS_TRIVIAL && XPATHLTYPE_IS_TRIVIAL |
| 2850 | |
| 2851 | /* Print *YYLOCP on YYO. Private, do not rely on its existence. */ |
| 2852 | |
| 2853 | YY_ATTRIBUTE_UNUSED |
| 2854 | static int |
| 2855 | yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp) |
| 2856 | { |
| 2857 | int res = 0; |
| 2858 | int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0; |
| 2859 | if (0 <= yylocp->first_line) |
| 2860 | { |
| 2861 | res += YYFPRINTF (yyo, "%d" , yylocp->first_line); |
| 2862 | if (0 <= yylocp->first_column) |
| 2863 | res += YYFPRINTF (yyo, ".%d" , yylocp->first_column); |
| 2864 | } |
| 2865 | if (0 <= yylocp->last_line) |
| 2866 | { |
| 2867 | if (yylocp->first_line < yylocp->last_line) |
| 2868 | { |
| 2869 | res += YYFPRINTF (yyo, "-%d" , yylocp->last_line); |
| 2870 | if (0 <= end_col) |
| 2871 | res += YYFPRINTF (yyo, ".%d" , end_col); |
| 2872 | } |
| 2873 | else if (0 <= end_col && yylocp->first_column < end_col) |
| 2874 | res += YYFPRINTF (yyo, "-%d" , end_col); |
| 2875 | } |
| 2876 | return res; |
| 2877 | } |
| 2878 | |
| 2879 | # define YY_LOCATION_PRINT(File, Loc) \ |
| 2880 | yy_location_print_ (File, &(Loc)) |
| 2881 | |
| 2882 | # else |
| 2883 | # define YY_LOCATION_PRINT(File, Loc) ((void) 0) |
| 2884 | # endif |
| 2885 | #endif |
| 2886 | |
| 2887 | |
| 2888 | # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ |
| 2889 | do { \ |
| 2890 | if (yydebug) \ |
| 2891 | { \ |
| 2892 | YYFPRINTF (stderr, "%s ", Title); \ |
| 2893 | yy_symbol_print (stderr, \ |
| 2894 | Type, Value, Location, parseInfo); \ |
| 2895 | YYFPRINTF (stderr, "\n"); \ |
| 2896 | } \ |
| 2897 | } while (0) |
| 2898 | |
| 2899 | |
| 2900 | /*-----------------------------------. |
| 2901 | | Print this symbol's value on YYO. | |
| 2902 | `-----------------------------------*/ |
| 2903 | |
| 2904 | static void |
| 2905 | yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo) |
| 2906 | { |
| 2907 | FILE *yyoutput = yyo; |
| 2908 | YYUSE (yyoutput); |
| 2909 | YYUSE (yylocationp); |
| 2910 | YYUSE (parseInfo); |
| 2911 | if (!yyvaluep) |
| 2912 | return; |
| 2913 | # ifdef YYPRINT |
| 2914 | if (yytype < YYNTOKENS) |
| 2915 | YYPRINT (yyo, yytoknum[yytype], *yyvaluep); |
| 2916 | # endif |
| 2917 | YYUSE (yytype); |
| 2918 | } |
| 2919 | |
| 2920 | |
| 2921 | /*---------------------------. |
| 2922 | | Print this symbol on YYO. | |
| 2923 | `---------------------------*/ |
| 2924 | |
| 2925 | static void |
| 2926 | yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo) |
| 2927 | { |
| 2928 | YYFPRINTF (yyo, "%s %s (" , |
| 2929 | yytype < YYNTOKENS ? "token" : "nterm" , yytname[yytype]); |
| 2930 | |
| 2931 | YY_LOCATION_PRINT (yyo, *yylocationp); |
| 2932 | YYFPRINTF (yyo, ": " ); |
| 2933 | yy_symbol_value_print (yyo, yytype, yyvaluep, yylocationp, parseInfo); |
| 2934 | YYFPRINTF (yyo, ")" ); |
| 2935 | } |
| 2936 | |
| 2937 | /*------------------------------------------------------------------. |
| 2938 | | yy_stack_print -- Print the state stack from its BOTTOM up to its | |
| 2939 | | TOP (included). | |
| 2940 | `------------------------------------------------------------------*/ |
| 2941 | |
| 2942 | static void |
| 2943 | yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) |
| 2944 | { |
| 2945 | YYFPRINTF (stderr, "Stack now" ); |
| 2946 | for (; yybottom <= yytop; yybottom++) |
| 2947 | { |
| 2948 | int yybot = *yybottom; |
| 2949 | YYFPRINTF (stderr, " %d" , yybot); |
| 2950 | } |
| 2951 | YYFPRINTF (stderr, "\n" ); |
| 2952 | } |
| 2953 | |
| 2954 | # define YY_STACK_PRINT(Bottom, Top) \ |
| 2955 | do { \ |
| 2956 | if (yydebug) \ |
| 2957 | yy_stack_print ((Bottom), (Top)); \ |
| 2958 | } while (0) |
| 2959 | |
| 2960 | |
| 2961 | /*------------------------------------------------. |
| 2962 | | Report that the YYRULE is going to be reduced. | |
| 2963 | `------------------------------------------------*/ |
| 2964 | |
| 2965 | static void |
| 2966 | yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo) |
| 2967 | { |
| 2968 | unsigned long yylno = yyrline[yyrule]; |
| 2969 | int yynrhs = yyr2[yyrule]; |
| 2970 | int yyi; |
| 2971 | YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n" , |
| 2972 | yyrule - 1, yylno); |
| 2973 | /* The symbols being reduced. */ |
| 2974 | for (yyi = 0; yyi < yynrhs; yyi++) |
| 2975 | { |
| 2976 | YYFPRINTF (stderr, " $%d = " , yyi + 1); |
| 2977 | yy_symbol_print (stderr, |
| 2978 | yystos[yyssp[yyi + 1 - yynrhs]], |
| 2979 | &yyvsp[(yyi + 1) - (yynrhs)] |
| 2980 | , &(yylsp[(yyi + 1) - (yynrhs)]) , parseInfo); |
| 2981 | YYFPRINTF (stderr, "\n" ); |
| 2982 | } |
| 2983 | } |
| 2984 | |
| 2985 | # define YY_REDUCE_PRINT(Rule) \ |
| 2986 | do { \ |
| 2987 | if (yydebug) \ |
| 2988 | yy_reduce_print (yyssp, yyvsp, yylsp, Rule, parseInfo); \ |
| 2989 | } while (0) |
| 2990 | |
| 2991 | /* Nonzero means print parse trace. It is left uninitialized so that |
| 2992 | multiple parsers can coexist. */ |
| 2993 | int yydebug; |
| 2994 | #else /* !XPATHDEBUG */ |
| 2995 | # define YYDPRINTF(Args) |
| 2996 | # define YY_SYMBOL_PRINT(Title, Type, Value, Location) |
| 2997 | # define YY_STACK_PRINT(Bottom, Top) |
| 2998 | # define YY_REDUCE_PRINT(Rule) |
| 2999 | #endif /* !XPATHDEBUG */ |
| 3000 | |
| 3001 | |
| 3002 | /* YYINITDEPTH -- initial size of the parser's stacks. */ |
| 3003 | #ifndef YYINITDEPTH |
| 3004 | # define YYINITDEPTH 200 |
| 3005 | #endif |
| 3006 | |
| 3007 | /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only |
| 3008 | if the built-in stack extension method is used). |
| 3009 | |
| 3010 | Do not make this value too large; the results are undefined if |
| 3011 | YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) |
| 3012 | evaluated with infinite-precision integer arithmetic. */ |
| 3013 | |
| 3014 | #ifndef YYMAXDEPTH |
| 3015 | # define YYMAXDEPTH 10000 |
| 3016 | #endif |
| 3017 | |
| 3018 | |
| 3019 | #if YYERROR_VERBOSE |
| 3020 | |
| 3021 | # ifndef yystrlen |
| 3022 | # if defined __GLIBC__ && defined _STRING_H |
| 3023 | # define yystrlen strlen |
| 3024 | # else |
| 3025 | /* Return the length of YYSTR. */ |
| 3026 | static YYSIZE_T |
| 3027 | yystrlen (const char *yystr) |
| 3028 | { |
| 3029 | YYSIZE_T yylen; |
| 3030 | for (yylen = 0; yystr[yylen]; yylen++) |
| 3031 | continue; |
| 3032 | return yylen; |
| 3033 | } |
| 3034 | # endif |
| 3035 | # endif |
| 3036 | |
| 3037 | # ifndef yystpcpy |
| 3038 | # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE |
| 3039 | # define yystpcpy stpcpy |
| 3040 | # else |
| 3041 | /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in |
| 3042 | YYDEST. */ |
| 3043 | static char * |
| 3044 | yystpcpy (char *yydest, const char *yysrc) |
| 3045 | { |
| 3046 | char *yyd = yydest; |
| 3047 | const char *yys = yysrc; |
| 3048 | |
| 3049 | while ((*yyd++ = *yys++) != '\0') |
| 3050 | continue; |
| 3051 | |
| 3052 | return yyd - 1; |
| 3053 | } |
| 3054 | # endif |
| 3055 | # endif |
| 3056 | |
| 3057 | # ifndef yytnamerr |
| 3058 | /* Copy to YYRES the contents of YYSTR after stripping away unnecessary |
| 3059 | quotes and backslashes, so that it's suitable for yyerror. The |
| 3060 | heuristic is that double-quoting is unnecessary unless the string |
| 3061 | contains an apostrophe, a comma, or backslash (other than |
| 3062 | backslash-backslash). YYSTR is taken from yytname. If YYRES is |
| 3063 | null, do not copy; instead, return the length of what the result |
| 3064 | would have been. */ |
| 3065 | static YYSIZE_T |
| 3066 | yytnamerr (char *yyres, const char *yystr) |
| 3067 | { |
| 3068 | if (*yystr == '"') |
| 3069 | { |
| 3070 | YYSIZE_T yyn = 0; |
| 3071 | char const *yyp = yystr; |
| 3072 | |
| 3073 | for (;;) |
| 3074 | switch (*++yyp) |
| 3075 | { |
| 3076 | case '\'': |
| 3077 | case ',': |
| 3078 | goto do_not_strip_quotes; |
| 3079 | |
| 3080 | case '\\': |
| 3081 | if (*++yyp != '\\') |
| 3082 | goto do_not_strip_quotes; |
| 3083 | else |
| 3084 | goto append; |
| 3085 | |
| 3086 | append: |
| 3087 | default: |
| 3088 | if (yyres) |
| 3089 | yyres[yyn] = *yyp; |
| 3090 | yyn++; |
| 3091 | break; |
| 3092 | |
| 3093 | case '"': |
| 3094 | if (yyres) |
| 3095 | yyres[yyn] = '\0'; |
| 3096 | return yyn; |
| 3097 | } |
| 3098 | do_not_strip_quotes: ; |
| 3099 | } |
| 3100 | |
| 3101 | if (! yyres) |
| 3102 | return yystrlen (s: yystr); |
| 3103 | |
| 3104 | return (YYSIZE_T) (yystpcpy (dest: yyres, src: yystr) - yyres); |
| 3105 | } |
| 3106 | # endif |
| 3107 | |
| 3108 | /* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message |
| 3109 | about the unexpected token YYTOKEN for the state stack whose top is |
| 3110 | YYSSP. |
| 3111 | |
| 3112 | Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is |
| 3113 | not large enough to hold the message. In that case, also set |
| 3114 | *YYMSG_ALLOC to the required number of bytes. Return 2 if the |
| 3115 | required number of bytes is too large to store. */ |
| 3116 | static int |
| 3117 | yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, |
| 3118 | yytype_int16 *yyssp, int yytoken) |
| 3119 | { |
| 3120 | YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yystr: yytname[yytoken]); |
| 3121 | YYSIZE_T yysize = yysize0; |
| 3122 | enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; |
| 3123 | /* Internationalized format string. */ |
| 3124 | const char *yyformat = YY_NULLPTR; |
| 3125 | /* Arguments of yyformat. */ |
| 3126 | char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; |
| 3127 | /* Number of reported tokens (one for the "unexpected", one per |
| 3128 | "expected"). */ |
| 3129 | int yycount = 0; |
| 3130 | |
| 3131 | /* There are many possibilities here to consider: |
| 3132 | - If this state is a consistent state with a default action, then |
| 3133 | the only way this function was invoked is if the default action |
| 3134 | is an error action. In that case, don't check for expected |
| 3135 | tokens because there are none. |
| 3136 | - The only way there can be no lookahead present (in yychar) is if |
| 3137 | this state is a consistent state with a default action. Thus, |
| 3138 | detecting the absence of a lookahead is sufficient to determine |
| 3139 | that there is no unexpected or expected token to report. In that |
| 3140 | case, just report a simple "syntax error". |
| 3141 | - Don't assume there isn't a lookahead just because this state is a |
| 3142 | consistent state with a default action. There might have been a |
| 3143 | previous inconsistent state, consistent state with a non-default |
| 3144 | action, or user semantic action that manipulated yychar. |
| 3145 | - Of course, the expected token list depends on states to have |
| 3146 | correct lookahead information, and it depends on the parser not |
| 3147 | to perform extra reductions after fetching a lookahead from the |
| 3148 | scanner and before detecting a syntax error. Thus, state merging |
| 3149 | (from LALR or IELR) and default reductions corrupt the expected |
| 3150 | token list. However, the list is correct for canonical LR with |
| 3151 | one exception: it will still contain any token that will not be |
| 3152 | accepted due to an error action in a later state. |
| 3153 | */ |
| 3154 | if (yytoken != YYEMPTY) |
| 3155 | { |
| 3156 | int yyn = yypact[*yyssp]; |
| 3157 | yyarg[yycount++] = yytname[yytoken]; |
| 3158 | if (!yypact_value_is_default (yyn)) |
| 3159 | { |
| 3160 | /* Start YYX at -YYN if negative to avoid negative indexes in |
| 3161 | YYCHECK. In other words, skip the first -YYN actions for |
| 3162 | this state because they are default actions. */ |
| 3163 | int yyxbegin = yyn < 0 ? -yyn : 0; |
| 3164 | /* Stay within bounds of both yycheck and yytname. */ |
| 3165 | int yychecklim = YYLAST - yyn + 1; |
| 3166 | int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; |
| 3167 | int yyx; |
| 3168 | |
| 3169 | for (yyx = yyxbegin; yyx < yyxend; ++yyx) |
| 3170 | if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR |
| 3171 | && !yytable_value_is_error (yytable[yyx + yyn])) |
| 3172 | { |
| 3173 | if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) |
| 3174 | { |
| 3175 | yycount = 1; |
| 3176 | yysize = yysize0; |
| 3177 | break; |
| 3178 | } |
| 3179 | yyarg[yycount++] = yytname[yyx]; |
| 3180 | { |
| 3181 | YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yystr: yytname[yyx]); |
| 3182 | if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) |
| 3183 | yysize = yysize1; |
| 3184 | else |
| 3185 | return 2; |
| 3186 | } |
| 3187 | } |
| 3188 | } |
| 3189 | } |
| 3190 | |
| 3191 | switch (yycount) |
| 3192 | { |
| 3193 | # define YYCASE_(N, S) \ |
| 3194 | case N: \ |
| 3195 | yyformat = S; \ |
| 3196 | break |
| 3197 | default: /* Avoid compiler warnings. */ |
| 3198 | YYCASE_(0, YY_("syntax error" )); |
| 3199 | YYCASE_(1, YY_("syntax error, unexpected %s" )); |
| 3200 | YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s" )); |
| 3201 | YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s" )); |
| 3202 | YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s" )); |
| 3203 | YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s" )); |
| 3204 | # undef YYCASE_ |
| 3205 | } |
| 3206 | |
| 3207 | { |
| 3208 | YYSIZE_T yysize1 = yysize + yystrlen (s: yyformat); |
| 3209 | if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM) |
| 3210 | yysize = yysize1; |
| 3211 | else |
| 3212 | return 2; |
| 3213 | } |
| 3214 | |
| 3215 | if (*yymsg_alloc < yysize) |
| 3216 | { |
| 3217 | *yymsg_alloc = 2 * yysize; |
| 3218 | if (! (yysize <= *yymsg_alloc |
| 3219 | && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) |
| 3220 | *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; |
| 3221 | return 1; |
| 3222 | } |
| 3223 | |
| 3224 | /* Avoid sprintf, as that infringes on the user's name space. |
| 3225 | Don't have undefined behavior even if the translation |
| 3226 | produced a string with the wrong number of "%s"s. */ |
| 3227 | { |
| 3228 | char *yyp = *yymsg; |
| 3229 | int yyi = 0; |
| 3230 | while ((*yyp = *yyformat) != '\0') |
| 3231 | if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) |
| 3232 | { |
| 3233 | yyp += yytnamerr (yyres: yyp, yystr: yyarg[yyi++]); |
| 3234 | yyformat += 2; |
| 3235 | } |
| 3236 | else |
| 3237 | { |
| 3238 | yyp++; |
| 3239 | yyformat++; |
| 3240 | } |
| 3241 | } |
| 3242 | return 0; |
| 3243 | } |
| 3244 | #endif /* YYERROR_VERBOSE */ |
| 3245 | |
| 3246 | /*-----------------------------------------------. |
| 3247 | | Release the memory associated to this symbol. | |
| 3248 | `-----------------------------------------------*/ |
| 3249 | |
| 3250 | static void |
| 3251 | yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo) |
| 3252 | { |
| 3253 | YYUSE (yyvaluep); |
| 3254 | YYUSE (yylocationp); |
| 3255 | YYUSE (parseInfo); |
| 3256 | if (!yymsg) |
| 3257 | yymsg = "Deleting" ; |
| 3258 | YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); |
| 3259 | |
| 3260 | YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN |
| 3261 | YYUSE (yytype); |
| 3262 | YY_IGNORE_MAYBE_UNINITIALIZED_END |
| 3263 | } |
| 3264 | |
| 3265 | |
| 3266 | |
| 3267 | |
| 3268 | /*----------. |
| 3269 | | yyparse. | |
| 3270 | `----------*/ |
| 3271 | |
| 3272 | int |
| 3273 | yyparse (QT_PREPEND_NAMESPACE(QPatternist)::ParserContext *const parseInfo) |
| 3274 | { |
| 3275 | /* The lookahead symbol. */ |
| 3276 | int yychar; |
| 3277 | |
| 3278 | |
| 3279 | /* The semantic value of the lookahead symbol. */ |
| 3280 | /* Default value used for initialization, for pacifying older GCCs |
| 3281 | or non-GCC compilers. */ |
| 3282 | YY_INITIAL_VALUE (static YYSTYPE yyval_default;) |
| 3283 | YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default); |
| 3284 | |
| 3285 | /* Location data for the lookahead symbol. */ |
| 3286 | static YYLTYPE yyloc_default |
| 3287 | # if defined XPATHLTYPE_IS_TRIVIAL && XPATHLTYPE_IS_TRIVIAL |
| 3288 | = { 1, 1, 1, 1 } |
| 3289 | # endif |
| 3290 | ; |
| 3291 | YYLTYPE yylloc = yyloc_default; |
| 3292 | |
| 3293 | /* Number of syntax errors so far. */ |
| 3294 | int yynerrs; |
| 3295 | |
| 3296 | int yystate; |
| 3297 | /* Number of tokens to shift before error messages enabled. */ |
| 3298 | int yyerrstatus; |
| 3299 | |
| 3300 | /* The stacks and their tools: |
| 3301 | 'yyss': related to states. |
| 3302 | 'yyvs': related to semantic values. |
| 3303 | 'yyls': related to locations. |
| 3304 | |
| 3305 | Refer to the stacks through separate pointers, to allow yyoverflow |
| 3306 | to reallocate them elsewhere. */ |
| 3307 | |
| 3308 | /* The state stack. */ |
| 3309 | yytype_int16 yyssa[YYINITDEPTH]; |
| 3310 | yytype_int16 *yyss; |
| 3311 | yytype_int16 *yyssp; |
| 3312 | |
| 3313 | /* The semantic value stack. */ |
| 3314 | YYSTYPE yyvsa[YYINITDEPTH]; |
| 3315 | YYSTYPE *yyvs; |
| 3316 | YYSTYPE *yyvsp; |
| 3317 | |
| 3318 | /* The location stack. */ |
| 3319 | YYLTYPE yylsa[YYINITDEPTH]; |
| 3320 | YYLTYPE *yyls; |
| 3321 | YYLTYPE *yylsp; |
| 3322 | |
| 3323 | /* The locations where the error started and ended. */ |
| 3324 | YYLTYPE yyerror_range[3]; |
| 3325 | |
| 3326 | YYSIZE_T yystacksize; |
| 3327 | |
| 3328 | int yyn; |
| 3329 | int yyresult; |
| 3330 | /* Lookahead token as an internal (translated) token number. */ |
| 3331 | int yytoken = 0; |
| 3332 | /* The variables used to return semantic value and location from the |
| 3333 | action routines. */ |
| 3334 | YYSTYPE yyval; |
| 3335 | YYLTYPE yyloc; |
| 3336 | |
| 3337 | #if YYERROR_VERBOSE |
| 3338 | /* Buffer for error messages, and its allocated size. */ |
| 3339 | char yymsgbuf[128]; |
| 3340 | char *yymsg = yymsgbuf; |
| 3341 | YYSIZE_T yymsg_alloc = sizeof yymsgbuf; |
| 3342 | #endif |
| 3343 | |
| 3344 | #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) |
| 3345 | |
| 3346 | /* The number of symbols on the RHS of the reduced rule. |
| 3347 | Keep to zero when no symbol should be popped. */ |
| 3348 | int yylen = 0; |
| 3349 | |
| 3350 | yyssp = yyss = yyssa; |
| 3351 | yyvsp = yyvs = yyvsa; |
| 3352 | yylsp = yyls = yylsa; |
| 3353 | yystacksize = YYINITDEPTH; |
| 3354 | |
| 3355 | YYDPRINTF ((stderr, "Starting parse\n" )); |
| 3356 | |
| 3357 | yystate = 0; |
| 3358 | yyerrstatus = 0; |
| 3359 | yynerrs = 0; |
| 3360 | yychar = YYEMPTY; /* Cause a token to be read. */ |
| 3361 | yylsp[0] = yylloc; |
| 3362 | goto yysetstate; |
| 3363 | |
| 3364 | |
| 3365 | /*------------------------------------------------------------. |
| 3366 | | yynewstate -- push a new state, which is found in yystate. | |
| 3367 | `------------------------------------------------------------*/ |
| 3368 | yynewstate: |
| 3369 | /* In all cases, when you get here, the value and location stacks |
| 3370 | have just been pushed. So pushing a state here evens the stacks. */ |
| 3371 | yyssp++; |
| 3372 | |
| 3373 | |
| 3374 | /*--------------------------------------------------------------------. |
| 3375 | | yynewstate -- set current state (the top of the stack) to yystate. | |
| 3376 | `--------------------------------------------------------------------*/ |
| 3377 | yysetstate: |
| 3378 | *yyssp = (yytype_int16) yystate; |
| 3379 | |
| 3380 | if (yyss + yystacksize - 1 <= yyssp) |
| 3381 | #if !defined yyoverflow && !defined YYSTACK_RELOCATE |
| 3382 | goto yyexhaustedlab; |
| 3383 | #else |
| 3384 | { |
| 3385 | /* Get the current used size of the three stacks, in elements. */ |
| 3386 | YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1); |
| 3387 | |
| 3388 | # if defined yyoverflow |
| 3389 | { |
| 3390 | /* Give user a chance to reallocate the stack. Use copies of |
| 3391 | these so that the &'s don't force the real ones into |
| 3392 | memory. */ |
| 3393 | YYSTYPE *yyvs1 = yyvs; |
| 3394 | yytype_int16 *yyss1 = yyss; |
| 3395 | YYLTYPE *yyls1 = yyls; |
| 3396 | |
| 3397 | /* Each stack pointer address is followed by the size of the |
| 3398 | data in use in that stack, in bytes. This used to be a |
| 3399 | conditional around just the two extra args, but that might |
| 3400 | be undefined if yyoverflow is a macro. */ |
| 3401 | yyoverflow (YY_("memory exhausted" ), |
| 3402 | yyss: &yyss1, yysize * sizeof (*yyssp), |
| 3403 | yyvs: &yyvs1, yysize * sizeof (*yyvsp), |
| 3404 | yyls: &yyls1, yysize * sizeof (*yylsp), |
| 3405 | yystacksize: &yystacksize); |
| 3406 | yyss = yyss1; |
| 3407 | yyvs = yyvs1; |
| 3408 | yyls = yyls1; |
| 3409 | } |
| 3410 | # else /* defined YYSTACK_RELOCATE */ |
| 3411 | /* Extend the stack our own way. */ |
| 3412 | if (YYMAXDEPTH <= yystacksize) |
| 3413 | goto yyexhaustedlab; |
| 3414 | yystacksize *= 2; |
| 3415 | if (YYMAXDEPTH < yystacksize) |
| 3416 | yystacksize = YYMAXDEPTH; |
| 3417 | |
| 3418 | { |
| 3419 | yytype_int16 *yyss1 = yyss; |
| 3420 | union yyalloc *yyptr = |
| 3421 | (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); |
| 3422 | if (! yyptr) |
| 3423 | goto yyexhaustedlab; |
| 3424 | YYSTACK_RELOCATE (yyss_alloc, yyss); |
| 3425 | YYSTACK_RELOCATE (yyvs_alloc, yyvs); |
| 3426 | YYSTACK_RELOCATE (yyls_alloc, yyls); |
| 3427 | # undef YYSTACK_RELOCATE |
| 3428 | if (yyss1 != yyssa) |
| 3429 | YYSTACK_FREE (yyss1); |
| 3430 | } |
| 3431 | # endif |
| 3432 | |
| 3433 | yyssp = yyss + yysize - 1; |
| 3434 | yyvsp = yyvs + yysize - 1; |
| 3435 | yylsp = yyls + yysize - 1; |
| 3436 | |
| 3437 | YYDPRINTF ((stderr, "Stack size increased to %lu\n" , |
| 3438 | (unsigned long) yystacksize)); |
| 3439 | |
| 3440 | if (yyss + yystacksize - 1 <= yyssp) |
| 3441 | YYABORT; |
| 3442 | } |
| 3443 | #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */ |
| 3444 | |
| 3445 | YYDPRINTF ((stderr, "Entering state %d\n" , yystate)); |
| 3446 | |
| 3447 | if (yystate == YYFINAL) |
| 3448 | YYACCEPT; |
| 3449 | |
| 3450 | goto yybackup; |
| 3451 | |
| 3452 | |
| 3453 | /*-----------. |
| 3454 | | yybackup. | |
| 3455 | `-----------*/ |
| 3456 | yybackup: |
| 3457 | /* Do appropriate processing given the current state. Read a |
| 3458 | lookahead token if we need one and don't already have one. */ |
| 3459 | |
| 3460 | /* First try to decide what to do without reference to lookahead token. */ |
| 3461 | yyn = yypact[yystate]; |
| 3462 | if (yypact_value_is_default (yyn)) |
| 3463 | goto yydefault; |
| 3464 | |
| 3465 | /* Not known => get a lookahead token if don't already have one. */ |
| 3466 | |
| 3467 | /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ |
| 3468 | if (yychar == YYEMPTY) |
| 3469 | { |
| 3470 | YYDPRINTF ((stderr, "Reading a token: " )); |
| 3471 | yychar = yylex (lexVal: &yylval, sourceLocator: &yylloc, parseInfo); |
| 3472 | } |
| 3473 | |
| 3474 | if (yychar <= YYEOF) |
| 3475 | { |
| 3476 | yychar = yytoken = YYEOF; |
| 3477 | YYDPRINTF ((stderr, "Now at end of input.\n" )); |
| 3478 | } |
| 3479 | else |
| 3480 | { |
| 3481 | yytoken = YYTRANSLATE (yychar); |
| 3482 | YY_SYMBOL_PRINT ("Next token is" , yytoken, &yylval, &yylloc); |
| 3483 | } |
| 3484 | |
| 3485 | /* If the proper action on seeing token YYTOKEN is to reduce or to |
| 3486 | detect an error, take that action. */ |
| 3487 | yyn += yytoken; |
| 3488 | if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) |
| 3489 | goto yydefault; |
| 3490 | yyn = yytable[yyn]; |
| 3491 | if (yyn <= 0) |
| 3492 | { |
| 3493 | if (yytable_value_is_error (yyn)) |
| 3494 | goto yyerrlab; |
| 3495 | yyn = -yyn; |
| 3496 | goto yyreduce; |
| 3497 | } |
| 3498 | |
| 3499 | /* Count tokens shifted since error; after three, turn off error |
| 3500 | status. */ |
| 3501 | if (yyerrstatus) |
| 3502 | yyerrstatus--; |
| 3503 | |
| 3504 | /* Shift the lookahead token. */ |
| 3505 | YY_SYMBOL_PRINT ("Shifting" , yytoken, &yylval, &yylloc); |
| 3506 | |
| 3507 | /* Discard the shifted token. */ |
| 3508 | yychar = YYEMPTY; |
| 3509 | |
| 3510 | yystate = yyn; |
| 3511 | YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN |
| 3512 | *++yyvsp = yylval; |
| 3513 | YY_IGNORE_MAYBE_UNINITIALIZED_END |
| 3514 | *++yylsp = yylloc; |
| 3515 | goto yynewstate; |
| 3516 | |
| 3517 | |
| 3518 | /*-----------------------------------------------------------. |
| 3519 | | yydefault -- do the default action for the current state. | |
| 3520 | `-----------------------------------------------------------*/ |
| 3521 | yydefault: |
| 3522 | yyn = yydefact[yystate]; |
| 3523 | if (yyn == 0) |
| 3524 | goto yyerrlab; |
| 3525 | goto yyreduce; |
| 3526 | |
| 3527 | |
| 3528 | /*-----------------------------. |
| 3529 | | yyreduce -- do a reduction. | |
| 3530 | `-----------------------------*/ |
| 3531 | yyreduce: |
| 3532 | /* yyn is the number of a rule to reduce with. */ |
| 3533 | yylen = yyr2[yyn]; |
| 3534 | |
| 3535 | /* If YYLEN is nonzero, implement the default value of the action: |
| 3536 | '$$ = $1'. |
| 3537 | |
| 3538 | Otherwise, the following line sets YYVAL to garbage. |
| 3539 | This behavior is undocumented and Bison |
| 3540 | users should not rely upon it. Assigning to YYVAL |
| 3541 | unconditionally makes the parser a bit smaller, and it avoids a |
| 3542 | GCC warning that YYVAL may be used uninitialized. */ |
| 3543 | yyval = yyvsp[1-yylen]; |
| 3544 | |
| 3545 | /* Default location. */ |
| 3546 | YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); |
| 3547 | yyerror_range[1] = yyloc; |
| 3548 | YY_REDUCE_PRINT (yyn); |
| 3549 | switch (yyn) |
| 3550 | { |
| 3551 | case 5: |
| 3552 | #line 1436 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3553 | { |
| 3554 | |
| 3555 | /* Suppress more compiler warnings about unused defines. */ |
| 3556 | #if defined(YYNNTS) \ |
| 3557 | || defined(yyerrok) \ |
| 3558 | || defined(YYNSTATES) \ |
| 3559 | || defined(YYRHSLOC) \ |
| 3560 | || defined(YYRECOVERING) \ |
| 3561 | || defined(YYFAIL) \ |
| 3562 | || defined(YYERROR) \ |
| 3563 | || defined(YYNRULES) \ |
| 3564 | || defined(YYBACKUP) \ |
| 3565 | || defined(YYMAXDEPTH) \ |
| 3566 | || defined(yyclearin) \ |
| 3567 | || defined(YYERRCODE) \ |
| 3568 | || defined(YY_LOCATION_PRINT) \ |
| 3569 | || defined(YYLLOC_DEFAULT) |
| 3570 | #endif |
| 3571 | |
| 3572 | if((yyvsp[-2].sval) != QLatin1String("1.0" )) |
| 3573 | { |
| 3574 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 3575 | |
| 3576 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Version %1 is not supported. The supported " |
| 3577 | "XQuery version is 1.0." ) |
| 3578 | .arg(a: formatData(data: (yyvsp[-2].sval))), |
| 3579 | errorCode: ReportContext::XQST0031, reflection: &ryy); |
| 3580 | } |
| 3581 | } |
| 3582 | #line 3534 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3583 | break; |
| 3584 | |
| 3585 | case 7: |
| 3586 | #line 1468 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3587 | { |
| 3588 | const QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*" )); |
| 3589 | |
| 3590 | if(!encNameRegExp.exactMatch(str: (yyvsp[0].sval))) |
| 3591 | { |
| 3592 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The encoding %1 is invalid. " |
| 3593 | "It must contain Latin characters only, " |
| 3594 | "must not contain whitespace, and must match " |
| 3595 | "the regular expression %2." ) |
| 3596 | .arg(args: formatKeyword(keyword: (yyvsp[(2) - (2)].sval)), |
| 3597 | args: formatExpression(expr: encNameRegExp.pattern())), |
| 3598 | errorCode: ReportContext::XQST0087, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3599 | } |
| 3600 | } |
| 3601 | #line 3553 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3602 | break; |
| 3603 | |
| 3604 | case 8: |
| 3605 | #line 1484 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3606 | { |
| 3607 | /* In XSL-T, we can have dangling variable references, so resolve them |
| 3608 | * before we proceed with other steps, such as checking circularity. */ |
| 3609 | if(parseInfo->isXSLT()) |
| 3610 | { |
| 3611 | typedef QHash<QXmlName, Expression::Ptr> Hash; |
| 3612 | const Hash::const_iterator end(parseInfo->unresolvedVariableReferences.constEnd()); |
| 3613 | |
| 3614 | for(Hash::const_iterator it(parseInfo->unresolvedVariableReferences.constBegin()); it != end; ++it) |
| 3615 | { |
| 3616 | const Expression::Ptr body(resolveVariable(name: it.key(), sourceLocator: (yyloc), parseInfo, raiseErrorOnUnavailability: true)); // TODO source locations vaise |
| 3617 | Q_ASSERT(body); |
| 3618 | it.value()->as<UnresolvedVariableReference>()->bindTo(body); |
| 3619 | } |
| 3620 | } |
| 3621 | |
| 3622 | /* The UserFunction callsites aren't bound yet, so bind them(if possible!). */ |
| 3623 | { |
| 3624 | const UserFunctionCallsite::List::const_iterator cend(parseInfo->userFunctionCallsites.constEnd()); |
| 3625 | UserFunctionCallsite::List::const_iterator cit(parseInfo->userFunctionCallsites.constBegin()); |
| 3626 | for(; cit != cend; ++cit) /* For each callsite. */ |
| 3627 | { |
| 3628 | const UserFunctionCallsite::Ptr callsite(*cit); |
| 3629 | Q_ASSERT(callsite); |
| 3630 | const UserFunction::List::const_iterator end(parseInfo->userFunctions.constEnd()); |
| 3631 | UserFunction::List::const_iterator it(parseInfo->userFunctions.constBegin()); |
| 3632 | |
| 3633 | for(; it != end; ++it) /* For each UserFunction. */ |
| 3634 | { |
| 3635 | const FunctionSignature::Ptr sign((*it)->signature()); |
| 3636 | Q_ASSERT(sign); |
| 3637 | |
| 3638 | if(callsite->isSignatureValid(sign)) |
| 3639 | { |
| 3640 | callsite->setSource(userFunction: (*it), |
| 3641 | cacheSlotOffset: parseInfo->allocateCacheSlots(count: (*it)->argumentDeclarations().count())); |
| 3642 | break; |
| 3643 | } |
| 3644 | } |
| 3645 | if(it == end) |
| 3646 | { |
| 3647 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "No function with signature %1 is available" ) |
| 3648 | .arg(a: formatFunction(func: callsite)), |
| 3649 | errorCode: ReportContext::XPST0017, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3650 | } |
| 3651 | } |
| 3652 | } |
| 3653 | |
| 3654 | /* Mark callsites in UserFunction bodies as recursive, if they are. */ |
| 3655 | { |
| 3656 | const UserFunction::List::const_iterator fend(parseInfo->userFunctions.constEnd()); |
| 3657 | UserFunction::List::const_iterator fit(parseInfo->userFunctions.constBegin()); |
| 3658 | for(; fit != fend; ++fit) |
| 3659 | { |
| 3660 | CallTargetDescription::List signList; |
| 3661 | signList.append(t: (*fit)->signature()); |
| 3662 | CallTargetDescription::checkCallsiteCircularity(signList, expr: (*fit)->body()); |
| 3663 | } |
| 3664 | } |
| 3665 | |
| 3666 | /* Now, check all global variables for circularity. This is done |
| 3667 | * backwards because global variables are only in scope below them, |
| 3668 | * in XQuery. */ |
| 3669 | { |
| 3670 | const VariableDeclaration::List::const_iterator start(parseInfo->declaredVariables.constBegin()); |
| 3671 | VariableDeclaration::List::const_iterator it(parseInfo->declaredVariables.constEnd()); |
| 3672 | |
| 3673 | while(it != start) |
| 3674 | { |
| 3675 | --it; |
| 3676 | if((*it)->type != VariableDeclaration::ExpressionVariable && (*it)->type != VariableDeclaration::GlobalVariable) |
| 3677 | continue; /* We want to ignore 'external' variables. */ |
| 3678 | |
| 3679 | FunctionSignature::List signList; |
| 3680 | checkVariableCircularity(var: *it, checkee: (*it)->expression(), type: (*it)->type, signList, parseInfo); |
| 3681 | ExpressionFactory::registerLastPath(operand: (*it)->expression()); |
| 3682 | parseInfo->finalizePushedVariable(amount: 1, shouldPop: false); /* Warn if it's unused. */ |
| 3683 | } |
| 3684 | } |
| 3685 | |
| 3686 | /* Generate code for doing initial template name calling. One problem |
| 3687 | * is that we compilation in the initial template name, since we throw away the |
| 3688 | * code if we don't have the requested template. */ |
| 3689 | if(parseInfo->languageAccent == QXmlQuery::XSLT20 |
| 3690 | && !parseInfo->initialTemplateName.isNull() |
| 3691 | && parseInfo->namedTemplates.contains(akey: parseInfo->initialTemplateName)) |
| 3692 | { |
| 3693 | parseInfo->queryBody = create(expr: new CallTemplate(parseInfo->initialTemplateName, |
| 3694 | WithParam::Hash()), |
| 3695 | sourceLocator: (yyloc), parseInfo); |
| 3696 | parseInfo->templateCalls.append(t: parseInfo->queryBody); |
| 3697 | /* We just discard the template body that XSLTTokenizer generated. */ |
| 3698 | } |
| 3699 | else |
| 3700 | parseInfo->queryBody = (yyvsp[0].expr); |
| 3701 | } |
| 3702 | #line 3654 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3703 | break; |
| 3704 | |
| 3705 | case 10: |
| 3706 | #line 1584 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3707 | { |
| 3708 | // TODO add to namespace context |
| 3709 | parseInfo->moduleNamespace = parseInfo->staticContext->namePool()->allocateNamespace(uri: (yyvsp[-3].sval)); |
| 3710 | } |
| 3711 | #line 3663 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3712 | break; |
| 3713 | |
| 3714 | case 12: |
| 3715 | #line 1592 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3716 | { |
| 3717 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3718 | if(parseInfo->hasSecondPrologPart) |
| 3719 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A default namespace declaration must occur before function, " |
| 3720 | "variable, and option declarations." ), errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3721 | } |
| 3722 | #line 3674 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3723 | break; |
| 3724 | |
| 3725 | case 13: |
| 3726 | #line 1599 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3727 | { |
| 3728 | if(parseInfo->hasSecondPrologPart) |
| 3729 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A default namespace declaration must occur before function, " |
| 3730 | "variable, and option declarations." ), errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3731 | } |
| 3732 | #line 3684 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3733 | break; |
| 3734 | |
| 3735 | case 14: |
| 3736 | #line 1605 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3737 | { |
| 3738 | if(parseInfo->hasSecondPrologPart) |
| 3739 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Namespace declarations must occur before function, " |
| 3740 | "variable, and option declarations." ), errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3741 | } |
| 3742 | #line 3694 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3743 | break; |
| 3744 | |
| 3745 | case 15: |
| 3746 | #line 1611 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3747 | { |
| 3748 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3749 | if(parseInfo->hasSecondPrologPart) |
| 3750 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Module imports must occur before function, " |
| 3751 | "variable, and option declarations." ), errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3752 | } |
| 3753 | #line 3705 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3754 | break; |
| 3755 | |
| 3756 | case 17: |
| 3757 | #line 1621 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3758 | { |
| 3759 | parseInfo->hasSecondPrologPart = true; |
| 3760 | } |
| 3761 | #line 3713 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3762 | break; |
| 3763 | |
| 3764 | case 18: |
| 3765 | #line 1625 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3766 | { |
| 3767 | parseInfo->hasSecondPrologPart = true; |
| 3768 | } |
| 3769 | #line 3721 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3770 | break; |
| 3771 | |
| 3772 | case 19: |
| 3773 | #line 1629 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3774 | { |
| 3775 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3776 | parseInfo->hasSecondPrologPart = true; |
| 3777 | } |
| 3778 | #line 3730 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3779 | break; |
| 3780 | |
| 3781 | case 20: |
| 3782 | #line 1652 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3783 | { |
| 3784 | Template::Ptr temp(create(expr: new Template(parseInfo->currentImportPrecedence, (yyvsp[-2].sequenceType)), sourceLocator: (yyloc), parseInfo)); |
| 3785 | |
| 3786 | registerNamedTemplate(name: (yyvsp[-4].qName), body: typeCheckTemplateBody(body: (yyvsp[-1].expr), reqType: (yyvsp[-2].sequenceType), parseInfo), |
| 3787 | parseInfo, sourceLocator: (yylsp[-6]), temp); |
| 3788 | temp->templateParameters = parseInfo->templateParameters; |
| 3789 | parseInfo->templateParametersHandled(); |
| 3790 | } |
| 3791 | #line 3743 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3792 | break; |
| 3793 | |
| 3794 | case 21: |
| 3795 | #line 1662 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3796 | { |
| 3797 | parseInfo->isParsingPattern = true; |
| 3798 | } |
| 3799 | #line 3751 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3800 | break; |
| 3801 | |
| 3802 | case 22: |
| 3803 | #line 1666 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3804 | { |
| 3805 | parseInfo->isParsingPattern = false; |
| 3806 | } |
| 3807 | #line 3759 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3808 | break; |
| 3809 | |
| 3810 | case 23: |
| 3811 | #line 1675 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3812 | { |
| 3813 | /* In this grammar branch, we're guaranteed to be a template rule, but |
| 3814 | * may also be a named template. */ |
| 3815 | |
| 3816 | const ImportPrecedence ip = parseInfo->isFirstTemplate() ? 0 : parseInfo->currentImportPrecedence; |
| 3817 | Expression::Ptr pattern((yyvsp[-8].expr)); |
| 3818 | const TemplatePattern::ID templateID = parseInfo->allocateTemplateID(); |
| 3819 | |
| 3820 | Template::Ptr templ(create(expr: new Template(ip, (yyvsp[-2].sequenceType)), sourceLocator: (yyloc), parseInfo)); |
| 3821 | templ->body = typeCheckTemplateBody(body: (yyvsp[-1].expr), reqType: (yyvsp[-2].sequenceType), parseInfo); |
| 3822 | templ->templateParameters = parseInfo->templateParameters; |
| 3823 | parseInfo->templateParametersHandled(); |
| 3824 | |
| 3825 | TemplatePattern::Vector ourPatterns; |
| 3826 | /* We do it as per 6.4 Conflict Resolution for Template Rules: |
| 3827 | * |
| 3828 | * "If the pattern contains multiple alternatives separated by |, then |
| 3829 | * the template rule is treated equivalently to a set of template |
| 3830 | * rules, one for each alternative. However, it is not an error if a |
| 3831 | * node matches more than one of the alternatives." */ |
| 3832 | while(pattern->is(i: Expression::IDCombineNodes)) |
| 3833 | { |
| 3834 | const Expression::List operands(pattern->operands()); |
| 3835 | pattern = operands.first(); |
| 3836 | |
| 3837 | loadPattern(matchPattern: operands.at(i: 1), ourPatterns, id: templateID, priority: (yyvsp[-4].enums.Double), temp: templ); |
| 3838 | } |
| 3839 | |
| 3840 | loadPattern(matchPattern: pattern, ourPatterns, id: templateID, priority: (yyvsp[-4].enums.Double), temp: templ); |
| 3841 | |
| 3842 | if(!(yyvsp[-12].qName).isNull()) |
| 3843 | registerNamedTemplate(name: (yyvsp[-12].qName), body: (yyvsp[-1].expr), parseInfo, sourceLocator: (yylsp[-14]), temp: templ); |
| 3844 | |
| 3845 | /* Now, let's add it to all the relevant templates. */ |
| 3846 | for(int i = 0; i < (yyvsp[-5].qNameVector).count(); ++i) /* For each mode. */ |
| 3847 | { |
| 3848 | const QXmlName &modeName = (yyvsp[-5].qNameVector).at(i); |
| 3849 | |
| 3850 | if(modeName == QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::all) && (yyvsp[-5].qNameVector).count() > 1) |
| 3851 | { |
| 3852 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The keyword %1 cannot occur with any other mode name." ) |
| 3853 | .arg(a: formatKeyword(keyword: QLatin1String("#all" ))), |
| 3854 | errorCode: ReportContext::XTSE0530, |
| 3855 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3856 | } |
| 3857 | |
| 3858 | /* For each pattern the template use. */ |
| 3859 | const TemplateMode::Ptr mode(parseInfo->modeFor(modeName)); |
| 3860 | for(int t = 0; t < ourPatterns.count(); ++t) |
| 3861 | mode->templatePatterns.append(t: ourPatterns.at(i: t)); |
| 3862 | } |
| 3863 | } |
| 3864 | #line 3816 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3865 | break; |
| 3866 | |
| 3867 | case 24: |
| 3868 | #line 1729 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3869 | { |
| 3870 | (yyval.enums.Double) = std::numeric_limits<xsDouble>::quiet_NaN(); |
| 3871 | } |
| 3872 | #line 3824 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3873 | break; |
| 3874 | |
| 3875 | case 25: |
| 3876 | #line 1734 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3877 | { |
| 3878 | const AtomicValue::Ptr val(Decimal::fromLexical(strNumeric: (yyvsp[0].sval))); |
| 3879 | if(val->hasError()) |
| 3880 | { |
| 3881 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The value of attribute %1 must be of type %2, which %3 isn't." ) |
| 3882 | .arg(args: formatKeyword(keyword: QLatin1String("priority" )), |
| 3883 | args: formatType(np: parseInfo->staticContext->namePool(), type: BuiltinTypes::xsDecimal), |
| 3884 | args: formatData(data: (yyvsp[0].sval))), |
| 3885 | errorCode: ReportContext::XTSE0530, |
| 3886 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3887 | } |
| 3888 | else |
| 3889 | (yyval.enums.Double) = val->as<Numeric>()->toDouble(); |
| 3890 | } |
| 3891 | #line 3843 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3892 | break; |
| 3893 | |
| 3894 | case 26: |
| 3895 | #line 1750 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3896 | { |
| 3897 | (yyval.qName) = QXmlName(); |
| 3898 | } |
| 3899 | #line 3851 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3900 | break; |
| 3901 | |
| 3902 | case 28: |
| 3903 | #line 1756 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3904 | { |
| 3905 | (yyval.qName) = (yyvsp[0].qName); |
| 3906 | } |
| 3907 | #line 3859 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3908 | break; |
| 3909 | |
| 3910 | case 30: |
| 3911 | #line 1762 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3912 | { |
| 3913 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3914 | } |
| 3915 | #line 3867 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3916 | break; |
| 3917 | |
| 3918 | case 32: |
| 3919 | #line 1767 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3920 | { |
| 3921 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3922 | } |
| 3923 | #line 3875 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3924 | break; |
| 3925 | |
| 3926 | case 33: |
| 3927 | #line 1771 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3928 | { |
| 3929 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3930 | } |
| 3931 | #line 3883 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3932 | break; |
| 3933 | |
| 3934 | case 34: |
| 3935 | #line 1775 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3936 | { |
| 3937 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3938 | } |
| 3939 | #line 3891 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3940 | break; |
| 3941 | |
| 3942 | case 39: |
| 3943 | #line 1786 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3944 | { |
| 3945 | if(!(yyvsp[-1].enums.Bool)) |
| 3946 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 3947 | |
| 3948 | if((yyvsp[-4].sval) == QLatin1String("xmlns" )) |
| 3949 | { |
| 3950 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "It is not possible to redeclare prefix %1." ) |
| 3951 | .arg(a: formatKeyword(keyword: QLatin1String("xmlns" ))), |
| 3952 | errorCode: ReportContext::XQST0070, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3953 | } |
| 3954 | else if ((yyvsp[-2].sval) == CommonNamespaces::XML || (yyvsp[-4].sval) == QLatin1String("xml" )) |
| 3955 | { |
| 3956 | parseInfo->staticContext->error(message: QtXmlPatterns::tr( |
| 3957 | sourceText: "The prefix %1 can not be bound. By default, it is already bound " |
| 3958 | "to the namespace %2." ) |
| 3959 | .arg(a: formatKeyword(keyword: "xml" )) |
| 3960 | .arg(a: formatURI(uri: CommonNamespaces::XML)), |
| 3961 | errorCode: ReportContext::XQST0070, |
| 3962 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3963 | } |
| 3964 | else if(parseInfo->declaredPrefixes.contains(str: (yyvsp[-4].sval))) |
| 3965 | { |
| 3966 | /* This includes the case where the user has bound a default prefix(such |
| 3967 | * as 'local') and now tries to do it again. */ |
| 3968 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Prefix %1 is already declared in the prolog." ) |
| 3969 | .arg(a: formatKeyword(keyword: (yyvsp[-4].sval))), |
| 3970 | errorCode: ReportContext::XQST0033, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3971 | } |
| 3972 | else |
| 3973 | { |
| 3974 | parseInfo->declaredPrefixes.append(t: (yyvsp[-4].sval)); |
| 3975 | |
| 3976 | if((yyvsp[-2].sval).isEmpty()) |
| 3977 | { |
| 3978 | parseInfo->staticContext->namespaceBindings()->addBinding(nb: QXmlName(StandardNamespaces::UndeclarePrefix, |
| 3979 | StandardLocalNames::empty, |
| 3980 | parseInfo->staticContext->namePool()->allocatePrefix(prefix: (yyvsp[-4].sval)))); |
| 3981 | } |
| 3982 | else |
| 3983 | { |
| 3984 | parseInfo->staticContext->namespaceBindings()->addBinding(nb: parseInfo->staticContext->namePool()->allocateBinding(prefix: (yyvsp[-4].sval), uri: (yyvsp[-2].sval))); |
| 3985 | } |
| 3986 | } |
| 3987 | } |
| 3988 | #line 3940 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 3989 | break; |
| 3990 | |
| 3991 | case 40: |
| 3992 | #line 1832 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 3993 | { |
| 3994 | if(parseInfo->hasDeclaration(decl: ParserContext::BoundarySpaceDecl)) |
| 3995 | { |
| 3996 | parseInfo->staticContext->error(message: prologMessage(msg: "declare boundary-space" ), |
| 3997 | errorCode: ReportContext::XQST0068, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 3998 | } |
| 3999 | else |
| 4000 | { |
| 4001 | parseInfo->staticContext->setBoundarySpacePolicy((yyvsp[-1].enums.boundarySpacePolicy)); |
| 4002 | parseInfo->registerDeclaration(decl: ParserContext::BoundarySpaceDecl); |
| 4003 | } |
| 4004 | } |
| 4005 | #line 3957 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4006 | break; |
| 4007 | |
| 4008 | case 41: |
| 4009 | #line 1846 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4010 | { |
| 4011 | (yyval.enums.boundarySpacePolicy) = StaticContext::BSPStrip; |
| 4012 | } |
| 4013 | #line 3965 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4014 | break; |
| 4015 | |
| 4016 | case 42: |
| 4017 | #line 1851 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4018 | { |
| 4019 | (yyval.enums.boundarySpacePolicy) = StaticContext::BSPPreserve; |
| 4020 | } |
| 4021 | #line 3973 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4022 | break; |
| 4023 | |
| 4024 | case 45: |
| 4025 | #line 1860 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4026 | { |
| 4027 | if(parseInfo->hasDeclaration(decl: ParserContext::DeclareDefaultElementNamespace)) |
| 4028 | { |
| 4029 | parseInfo->staticContext->error(message: prologMessage(msg: "declare default element namespace" ), |
| 4030 | errorCode: ReportContext::XQST0066, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4031 | } |
| 4032 | else |
| 4033 | { |
| 4034 | parseInfo->staticContext->namespaceBindings()->addBinding(nb: QXmlName(parseInfo->staticContext->namePool()->allocateNamespace(uri: (yyvsp[-1].sval)), StandardLocalNames::empty)); |
| 4035 | parseInfo->registerDeclaration(decl: ParserContext::DeclareDefaultElementNamespace); |
| 4036 | } |
| 4037 | } |
| 4038 | #line 3990 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4039 | break; |
| 4040 | |
| 4041 | case 46: |
| 4042 | #line 1875 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4043 | { |
| 4044 | if(parseInfo->hasDeclaration(decl: ParserContext::DeclareDefaultFunctionNamespace)) |
| 4045 | { |
| 4046 | parseInfo->staticContext->error(message: prologMessage(msg: "declare default function namespace" ), |
| 4047 | errorCode: ReportContext::XQST0066, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4048 | } |
| 4049 | else |
| 4050 | { |
| 4051 | parseInfo->staticContext->setDefaultFunctionNamespace((yyvsp[-1].sval)); |
| 4052 | parseInfo->registerDeclaration(decl: ParserContext::DeclareDefaultFunctionNamespace); |
| 4053 | } |
| 4054 | } |
| 4055 | #line 4007 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4056 | break; |
| 4057 | |
| 4058 | case 47: |
| 4059 | #line 1889 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4060 | { |
| 4061 | if((yyvsp[-2].qName).prefix() == StandardPrefixes::empty) |
| 4062 | { |
| 4063 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The name of an option must have a prefix. " |
| 4064 | "There is no default namespace for options." ), |
| 4065 | errorCode: ReportContext::XPST0081, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4066 | } |
| 4067 | } |
| 4068 | #line 4020 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4069 | break; |
| 4070 | |
| 4071 | case 48: |
| 4072 | #line 1899 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4073 | { |
| 4074 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 4075 | if(parseInfo->hasDeclaration(decl: ParserContext::OrderingModeDecl)) |
| 4076 | { |
| 4077 | parseInfo->staticContext->error(message: prologMessage(msg: "declare ordering" ), |
| 4078 | errorCode: ReportContext::XQST0065, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4079 | } |
| 4080 | else |
| 4081 | { |
| 4082 | parseInfo->registerDeclaration(decl: ParserContext::OrderingModeDecl); |
| 4083 | parseInfo->staticContext->setOrderingMode((yyvsp[-1].enums.orderingMode)); |
| 4084 | } |
| 4085 | } |
| 4086 | #line 4038 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4087 | break; |
| 4088 | |
| 4089 | case 49: |
| 4090 | #line 1914 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4091 | { |
| 4092 | (yyval.enums.orderingMode) = StaticContext::Ordered; |
| 4093 | } |
| 4094 | #line 4046 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4095 | break; |
| 4096 | |
| 4097 | case 50: |
| 4098 | #line 1918 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4099 | { |
| 4100 | (yyval.enums.orderingMode) = StaticContext::Unordered; |
| 4101 | } |
| 4102 | #line 4054 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4103 | break; |
| 4104 | |
| 4105 | case 51: |
| 4106 | #line 1923 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4107 | { |
| 4108 | if(parseInfo->hasDeclaration(decl: ParserContext::EmptyOrderDecl)) |
| 4109 | { |
| 4110 | parseInfo->staticContext->error(message: prologMessage(msg: "declare default order" ), |
| 4111 | errorCode: ReportContext::XQST0069, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4112 | } |
| 4113 | else |
| 4114 | { |
| 4115 | parseInfo->registerDeclaration(decl: ParserContext::EmptyOrderDecl); |
| 4116 | parseInfo->staticContext->setOrderingEmptySequence((yyvsp[-1].enums.orderingEmptySequence)); |
| 4117 | } |
| 4118 | } |
| 4119 | #line 4071 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4120 | break; |
| 4121 | |
| 4122 | case 52: |
| 4123 | #line 1937 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4124 | { |
| 4125 | (yyval.enums.orderingEmptySequence) = StaticContext::Least; |
| 4126 | } |
| 4127 | #line 4079 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4128 | break; |
| 4129 | |
| 4130 | case 53: |
| 4131 | #line 1941 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4132 | { |
| 4133 | (yyval.enums.orderingEmptySequence) = StaticContext::Greatest; |
| 4134 | } |
| 4135 | #line 4087 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4136 | break; |
| 4137 | |
| 4138 | case 54: |
| 4139 | #line 1947 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4140 | { |
| 4141 | if(parseInfo->hasDeclaration(decl: ParserContext::CopyNamespacesDecl)) |
| 4142 | { |
| 4143 | parseInfo->staticContext->error(message: prologMessage(msg: "declare copy-namespaces" ), |
| 4144 | errorCode: ReportContext::XQST0055, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4145 | } |
| 4146 | else |
| 4147 | { |
| 4148 | parseInfo->registerDeclaration(decl: ParserContext::CopyNamespacesDecl); |
| 4149 | } |
| 4150 | } |
| 4151 | #line 4103 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4152 | break; |
| 4153 | |
| 4154 | case 55: |
| 4155 | #line 1960 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4156 | { |
| 4157 | parseInfo->preserveNamespacesMode = true; |
| 4158 | } |
| 4159 | #line 4111 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4160 | break; |
| 4161 | |
| 4162 | case 56: |
| 4163 | #line 1965 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4164 | { |
| 4165 | parseInfo->preserveNamespacesMode = false; |
| 4166 | } |
| 4167 | #line 4119 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4168 | break; |
| 4169 | |
| 4170 | case 57: |
| 4171 | #line 1970 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4172 | { |
| 4173 | parseInfo->inheritNamespacesMode = true; |
| 4174 | } |
| 4175 | #line 4127 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4176 | break; |
| 4177 | |
| 4178 | case 58: |
| 4179 | #line 1975 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4180 | { |
| 4181 | parseInfo->inheritNamespacesMode = false; |
| 4182 | } |
| 4183 | #line 4135 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4184 | break; |
| 4185 | |
| 4186 | case 59: |
| 4187 | #line 1980 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4188 | { |
| 4189 | if(parseInfo->hasDeclaration(decl: ParserContext::DefaultCollationDecl)) |
| 4190 | { |
| 4191 | parseInfo->staticContext->error(message: prologMessage(msg: "declare default collation" ), |
| 4192 | errorCode: ReportContext::XQST0038, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4193 | } |
| 4194 | else |
| 4195 | { |
| 4196 | const QUrl coll(resolveAndCheckCollation<ReportContext::XQST0038>(collation: (yyvsp[-1].sval), parseInfo, sl: (yyloc))); |
| 4197 | |
| 4198 | parseInfo->registerDeclaration(decl: ParserContext::DefaultCollationDecl); |
| 4199 | parseInfo->staticContext->setDefaultCollation(coll); |
| 4200 | } |
| 4201 | } |
| 4202 | #line 4154 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4203 | break; |
| 4204 | |
| 4205 | case 60: |
| 4206 | #line 1996 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4207 | { |
| 4208 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20), parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-2].enums.Bool)); |
| 4209 | if(parseInfo->hasDeclaration(decl: ParserContext::BaseURIDecl)) |
| 4210 | { |
| 4211 | parseInfo->staticContext->error(message: prologMessage(msg: "declare base-uri" ), |
| 4212 | errorCode: ReportContext::XQST0032, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4213 | } |
| 4214 | else |
| 4215 | { |
| 4216 | parseInfo->registerDeclaration(decl: ParserContext::BaseURIDecl); |
| 4217 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 4218 | |
| 4219 | QUrl toBeBase(AnyURI::toQUrl<ReportContext::XQST0046>(value: (yyvsp[-1].sval), context: parseInfo->staticContext, r: &ryy)); |
| 4220 | /* Now we're guaranteed that base is a valid lexical representation, but it can still be relative. */ |
| 4221 | |
| 4222 | if(toBeBase.isRelative()) |
| 4223 | toBeBase = parseInfo->staticContext->baseURI().resolved(relative: toBeBase); |
| 4224 | |
| 4225 | parseInfo->staticContext->setBaseURI(toBeBase); |
| 4226 | } |
| 4227 | } |
| 4228 | #line 4180 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4229 | break; |
| 4230 | |
| 4231 | case 61: |
| 4232 | #line 2019 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4233 | { |
| 4234 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The Schema Import feature is not supported, " |
| 4235 | "and therefore %1 declarations cannot occur." ) |
| 4236 | .arg(a: formatKeyword(keyword: "import schema" )), |
| 4237 | errorCode: ReportContext::XQST0009, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4238 | } |
| 4239 | #line 4191 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4240 | break; |
| 4241 | |
| 4242 | case 65: |
| 4243 | #line 2031 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4244 | { |
| 4245 | if((yyvsp[-2].sval).isEmpty()) |
| 4246 | { |
| 4247 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The target namespace of a %1 cannot be empty." ) |
| 4248 | .arg(a: formatKeyword(keyword: "module import" )), |
| 4249 | errorCode: ReportContext::XQST0088, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4250 | |
| 4251 | } |
| 4252 | else |
| 4253 | { |
| 4254 | /* This is temporary until we have implemented it. */ |
| 4255 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The module import feature is not supported" ), |
| 4256 | errorCode: ReportContext::XQST0016, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4257 | } |
| 4258 | } |
| 4259 | #line 4211 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4260 | break; |
| 4261 | |
| 4262 | case 72: |
| 4263 | #line 2058 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4264 | { |
| 4265 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-6].enums.Bool)); |
| 4266 | if(variableByName(name: (yyvsp[-4].qName), parseInfo)) |
| 4267 | { |
| 4268 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A variable with name %1 has already " |
| 4269 | "been declared." ) |
| 4270 | .arg(a: formatKeyword(keyword: parseInfo->staticContext->namePool()->toLexical(qName: (yyvsp[-4].qName)))), |
| 4271 | errorCode: parseInfo->isXSLT() ? ReportContext::XTSE0630 : ReportContext::XQST0049, |
| 4272 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4273 | } |
| 4274 | else |
| 4275 | { |
| 4276 | if((yyvsp[-2].expr)) /* We got a value assigned. */ |
| 4277 | { |
| 4278 | const Expression::Ptr checked |
| 4279 | (TypeChecker::applyFunctionConversion(operand: (yyvsp[-2].expr), reqType: (yyvsp[-3].sequenceType), context: parseInfo->staticContext, |
| 4280 | code: (yyvsp[-6].enums.Bool) ? ReportContext::XTTE0570 : ReportContext::XPTY0004, |
| 4281 | (yyvsp[-6].enums.Bool) ? TypeChecker::Options(TypeChecker::CheckFocus | TypeChecker::AutomaticallyConvert) : TypeChecker::CheckFocus)); |
| 4282 | |
| 4283 | pushVariable(name: (yyvsp[-4].qName), seqType: (yyvsp[-3].sequenceType), expr: checked, type: VariableDeclaration::GlobalVariable, sourceLocator: (yyloc), parseInfo); |
| 4284 | parseInfo->declaredVariables.append(t: parseInfo->variables.last()); |
| 4285 | } |
| 4286 | else /* We got an 'external' declaration. */ |
| 4287 | { |
| 4288 | const SequenceType::Ptr varType(parseInfo->staticContext-> |
| 4289 | externalVariableLoader()->announceExternalVariable(name: (yyvsp[-4].qName), declaredType: (yyvsp[-3].sequenceType))); |
| 4290 | |
| 4291 | if(varType) |
| 4292 | { |
| 4293 | /* We push the declaration such that we can see name clashes and so on, but we don't use it for tying |
| 4294 | * any references to it. */ |
| 4295 | pushVariable(name: (yyvsp[-4].qName), seqType: varType, expr: Expression::Ptr(), type: VariableDeclaration::ExternalVariable, sourceLocator: (yyloc), parseInfo); |
| 4296 | } |
| 4297 | else if((yyvsp[-1].expr)) |
| 4298 | { |
| 4299 | /* Ok, the xsl:param got a default value, we make it |
| 4300 | * available as a regular variable declaration. */ |
| 4301 | // TODO turn into checked |
| 4302 | pushVariable(name: (yyvsp[-4].qName), seqType: (yyvsp[-3].sequenceType), expr: (yyvsp[-1].expr), type: VariableDeclaration::GlobalVariable, sourceLocator: (yyloc), parseInfo); |
| 4303 | // TODO ensure that duplicates are trapped. |
| 4304 | } |
| 4305 | else |
| 4306 | { |
| 4307 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "No value is available for the external " |
| 4308 | "variable with name %1." ) |
| 4309 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-4].qName))), |
| 4310 | errorCode: parseInfo->isXSLT() ? ReportContext::XTDE0050 : ReportContext::XPDY0002, |
| 4311 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4312 | } |
| 4313 | } |
| 4314 | } |
| 4315 | } |
| 4316 | #line 4268 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4317 | break; |
| 4318 | |
| 4319 | case 73: |
| 4320 | #line 2112 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4321 | { |
| 4322 | (yyval.expr).reset(); |
| 4323 | } |
| 4324 | #line 4276 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4325 | break; |
| 4326 | |
| 4327 | case 74: |
| 4328 | #line 2116 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4329 | { |
| 4330 | (yyval.expr) = (yyvsp[0].expr); |
| 4331 | } |
| 4332 | #line 4284 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4333 | break; |
| 4334 | |
| 4335 | case 75: |
| 4336 | #line 2121 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4337 | { |
| 4338 | (yyval.expr).reset(); |
| 4339 | } |
| 4340 | #line 4292 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4341 | break; |
| 4342 | |
| 4343 | case 76: |
| 4344 | #line 2125 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4345 | { |
| 4346 | (yyval.expr) = (yyvsp[0].expr); |
| 4347 | } |
| 4348 | #line 4300 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4349 | break; |
| 4350 | |
| 4351 | case 77: |
| 4352 | #line 2130 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4353 | { |
| 4354 | if(parseInfo->hasDeclaration(decl: ParserContext::ConstructionDecl)) |
| 4355 | { |
| 4356 | parseInfo->staticContext->error(message: prologMessage(msg: "declare ordering" ), |
| 4357 | errorCode: ReportContext::XQST0067, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4358 | } |
| 4359 | else |
| 4360 | { |
| 4361 | parseInfo->registerDeclaration(decl: ParserContext::ConstructionDecl); |
| 4362 | parseInfo->staticContext->setConstructionMode((yyvsp[-1].enums.constructionMode)); |
| 4363 | } |
| 4364 | } |
| 4365 | #line 4317 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4366 | break; |
| 4367 | |
| 4368 | case 78: |
| 4369 | #line 2144 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4370 | { |
| 4371 | (yyval.enums.constructionMode) = StaticContext::CMStrip; |
| 4372 | } |
| 4373 | #line 4325 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4374 | break; |
| 4375 | |
| 4376 | case 79: |
| 4377 | #line 2148 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4378 | { |
| 4379 | (yyval.enums.constructionMode) = StaticContext::CMPreserve; |
| 4380 | } |
| 4381 | #line 4333 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4382 | break; |
| 4383 | |
| 4384 | case 80: |
| 4385 | #line 2153 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4386 | { |
| 4387 | (yyval.enums.slot) = parseInfo->currentExpressionSlot() - (yyvsp[-1].functionArguments).count(); |
| 4388 | } |
| 4389 | #line 4341 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4390 | break; |
| 4391 | |
| 4392 | case 81: |
| 4393 | #line 2157 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4394 | { |
| 4395 | if(!(yyvsp[-8].enums.Bool)) |
| 4396 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-8].enums.Bool)); |
| 4397 | |
| 4398 | /* If FunctionBody is null, it is 'external', otherwise the value is the body. */ |
| 4399 | const QXmlName::NamespaceCode ns((yyvsp[-7].qName).namespaceURI()); |
| 4400 | |
| 4401 | if(parseInfo->isXSLT() && !(yyvsp[-7].qName).hasPrefix()) |
| 4402 | { |
| 4403 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A stylesheet function must have a prefixed name." ), |
| 4404 | errorCode: ReportContext::XTSE0740, |
| 4405 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4406 | } |
| 4407 | |
| 4408 | if((yyvsp[-1].expr)) /* We got a function body. */ |
| 4409 | { |
| 4410 | if(ns == StandardNamespaces::empty) |
| 4411 | { |
| 4412 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The namespace for a user defined function " |
| 4413 | "cannot be empty (try the predefined " |
| 4414 | "prefix %1 which exists for cases " |
| 4415 | "like this)" ) |
| 4416 | .arg(a: formatKeyword(keyword: "local" )), |
| 4417 | errorCode: ReportContext::XQST0060, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4418 | } |
| 4419 | else if(XPathHelper::isReservedNamespace(ns)) |
| 4420 | { |
| 4421 | parseInfo->staticContext->error(message: QtXmlPatterns::tr( |
| 4422 | sourceText: "The namespace %1 is reserved; therefore " |
| 4423 | "user defined functions may not use it. " |
| 4424 | "Try the predefined prefix %2, which " |
| 4425 | "exists for these cases." ) |
| 4426 | .arg(args: formatURI(np: parseInfo->staticContext->namePool(), uri: ns), args: formatKeyword(keyword: "local" )), |
| 4427 | errorCode: parseInfo->isXSLT() ? ReportContext::XTSE0080 : ReportContext::XQST0045, |
| 4428 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4429 | } |
| 4430 | else if(parseInfo->moduleNamespace != StandardNamespaces::empty && |
| 4431 | ns != parseInfo->moduleNamespace) |
| 4432 | { |
| 4433 | parseInfo->staticContext->error(message: QtXmlPatterns::tr( |
| 4434 | sourceText: "The namespace of a user defined " |
| 4435 | "function in a library module must be " |
| 4436 | "equivalent to the module namespace. " |
| 4437 | "In other words, it should be %1 instead " |
| 4438 | "of %2" ) |
| 4439 | .arg(args: formatURI(np: parseInfo->staticContext->namePool(), uri: parseInfo->moduleNamespace), |
| 4440 | args: formatURI(np: parseInfo->staticContext->namePool(), uri: ns)), |
| 4441 | errorCode: ReportContext::XQST0048, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4442 | } |
| 4443 | else |
| 4444 | { |
| 4445 | /* Apply function conversion such that the body matches the declared |
| 4446 | * return type. */ |
| 4447 | const Expression::Ptr checked(TypeChecker::applyFunctionConversion(operand: (yyvsp[-1].expr), reqType: (yyvsp[-2].sequenceType), |
| 4448 | context: parseInfo->staticContext, |
| 4449 | code: ReportContext::XPTY0004, |
| 4450 | TypeChecker::Options(TypeChecker::AutomaticallyConvert | |
| 4451 | TypeChecker::CheckFocus | |
| 4452 | TypeChecker::GeneratePromotion))); |
| 4453 | |
| 4454 | const int argCount = (yyvsp[-5].functionArguments).count(); |
| 4455 | const FunctionSignature::Ptr sign(new FunctionSignature((yyvsp[-7].qName) /* name */, |
| 4456 | argCount /* minArgs */, |
| 4457 | argCount /* maxArgs */, |
| 4458 | (yyvsp[-2].sequenceType) /* returnType */)); |
| 4459 | sign->setArguments((yyvsp[-5].functionArguments)); |
| 4460 | const UserFunction::List::const_iterator end(parseInfo->userFunctions.constEnd()); |
| 4461 | UserFunction::List::const_iterator it(parseInfo->userFunctions.constBegin()); |
| 4462 | |
| 4463 | for(; it != end; ++it) |
| 4464 | { |
| 4465 | if(*(*it)->signature() == *sign) |
| 4466 | { |
| 4467 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A function already exists with " |
| 4468 | "the signature %1." ) |
| 4469 | .arg(a: formatFunction(np: parseInfo->staticContext->namePool(), func: sign)), |
| 4470 | errorCode: parseInfo->isXSLT() ? ReportContext::XTSE0770 : ReportContext::XQST0034, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4471 | } |
| 4472 | } |
| 4473 | |
| 4474 | VariableDeclaration::List argDecls; |
| 4475 | |
| 4476 | for(int i = 0; i < argCount; ++i) |
| 4477 | argDecls.append(t: parseInfo->variables.at(i)); |
| 4478 | |
| 4479 | if((yyvsp[-3].enums.slot) > -1) |
| 4480 | { |
| 4481 | /* We have allocated slots, so now push them out of scope. */ |
| 4482 | parseInfo->finalizePushedVariable(amount: argCount); |
| 4483 | } |
| 4484 | |
| 4485 | parseInfo->userFunctions.append(t: UserFunction::Ptr(new UserFunction(sign, checked, (yyvsp[-3].enums.slot), argDecls))); |
| 4486 | } |
| 4487 | } |
| 4488 | else /* We got an 'external' declaration. */ |
| 4489 | { |
| 4490 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "No external functions are supported. " |
| 4491 | "All supported functions can be used directly, " |
| 4492 | "without first declaring them as external" ), |
| 4493 | errorCode: ReportContext::XPST0017, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4494 | } |
| 4495 | } |
| 4496 | #line 4448 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4497 | break; |
| 4498 | |
| 4499 | case 82: |
| 4500 | #line 2261 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4501 | { |
| 4502 | (yyval.functionArguments) = FunctionArgument::List(); |
| 4503 | } |
| 4504 | #line 4456 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4505 | break; |
| 4506 | |
| 4507 | case 83: |
| 4508 | #line 2265 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4509 | { |
| 4510 | FunctionArgument::List l; |
| 4511 | l.append(t: (yyvsp[0].functionArgument)); |
| 4512 | (yyval.functionArguments) = l; |
| 4513 | } |
| 4514 | #line 4466 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4515 | break; |
| 4516 | |
| 4517 | case 84: |
| 4518 | #line 2271 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4519 | { |
| 4520 | FunctionArgument::List::const_iterator it((yyvsp[-2].functionArguments).constBegin()); |
| 4521 | const FunctionArgument::List::const_iterator end((yyvsp[-2].functionArguments).constEnd()); |
| 4522 | |
| 4523 | for(; it != end; ++it) |
| 4524 | { |
| 4525 | if((*it)->name() == (yyvsp[0].functionArgument)->name()) |
| 4526 | { |
| 4527 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "An argument with name %1 has already " |
| 4528 | "been declared. Every argument name " |
| 4529 | "must be unique." ) |
| 4530 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[0].functionArgument)->name())), |
| 4531 | errorCode: ReportContext::XQST0039, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4532 | } |
| 4533 | } |
| 4534 | |
| 4535 | (yyvsp[-2].functionArguments).append(t: (yyvsp[0].functionArgument)); |
| 4536 | (yyval.functionArguments) = (yyvsp[-2].functionArguments); |
| 4537 | } |
| 4538 | #line 4490 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4539 | break; |
| 4540 | |
| 4541 | case 85: |
| 4542 | #line 2292 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4543 | { |
| 4544 | pushVariable(name: (yyvsp[-1].qName), seqType: (yyvsp[0].sequenceType), expr: Expression::Ptr(), type: VariableDeclaration::FunctionArgument, sourceLocator: (yyloc), parseInfo); |
| 4545 | (yyval.functionArgument) = FunctionArgument::Ptr(new FunctionArgument((yyvsp[-1].qName), (yyvsp[0].sequenceType))); |
| 4546 | } |
| 4547 | #line 4499 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4548 | break; |
| 4549 | |
| 4550 | case 86: |
| 4551 | #line 2298 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4552 | { |
| 4553 | (yyval.expr).reset(); |
| 4554 | } |
| 4555 | #line 4507 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4556 | break; |
| 4557 | |
| 4558 | case 88: |
| 4559 | #line 2304 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4560 | { |
| 4561 | (yyval.expr) = (yyvsp[-1].expr); |
| 4562 | } |
| 4563 | #line 4515 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4564 | break; |
| 4565 | |
| 4566 | case 91: |
| 4567 | #line 2320 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4568 | { |
| 4569 | (yyval.expr) = create(expr: new CombineNodes((yyvsp[-2].expr), CombineNodes::Union, (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 4570 | } |
| 4571 | #line 4523 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4572 | break; |
| 4573 | |
| 4574 | case 93: |
| 4575 | #line 2326 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4576 | { |
| 4577 | /* We write this into a node test. The spec says, 5.5.3 The Meaning of a Pattern: |
| 4578 | * "Similarly, / matches a document node, and only a document node, |
| 4579 | * because the result of the expression root(.)//(/) returns the root |
| 4580 | * node of the tree containing the context node if and only if it is a |
| 4581 | * document node." */ |
| 4582 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisSelf, BuiltinTypes::document), sourceLocator: (yyloc), parseInfo); |
| 4583 | } |
| 4584 | #line 4536 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4585 | break; |
| 4586 | |
| 4587 | case 94: |
| 4588 | #line 2335 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4589 | { |
| 4590 | /* /axis::node-test |
| 4591 | * => |
| 4592 | * axis::node-test[parent::document-node()] |
| 4593 | * |
| 4594 | * In practice it looks like this. $2 is: |
| 4595 | * |
| 4596 | * TruthPredicate |
| 4597 | * AxisStep self::element(c) |
| 4598 | * TruthPredicate |
| 4599 | * AxisStep parent::element(b) |
| 4600 | * AxisStep parent::element(a) |
| 4601 | * |
| 4602 | * and we want this: |
| 4603 | * |
| 4604 | * TruthPredicate |
| 4605 | * AxisStep self::element(c) |
| 4606 | * TruthPredicate |
| 4607 | * AxisStep self::element(b) |
| 4608 | * TruthPredicate |
| 4609 | * AxisStep parent::element(a) |
| 4610 | * AxisStep parent::document() |
| 4611 | * |
| 4612 | * So we want to rewrite the predicate deepest down into a |
| 4613 | * another TruthPredicate containing the AxisStep. |
| 4614 | * |
| 4615 | * The simplest case where $2 is only an axis step is special. When $2 is: |
| 4616 | * |
| 4617 | * AxisStep self::element(a) |
| 4618 | * |
| 4619 | * we want: |
| 4620 | * |
| 4621 | * TruthPredicate |
| 4622 | * AxisStep self::element(a) |
| 4623 | * AxisStep parent::document() |
| 4624 | */ |
| 4625 | |
| 4626 | /* First, find the target. */ |
| 4627 | Expression::Ptr target((yyvsp[0].expr)); |
| 4628 | |
| 4629 | while(isPredicate(id: target->id())) |
| 4630 | { |
| 4631 | const Expression::Ptr candidate(target->operands().at(i: 1)); |
| 4632 | |
| 4633 | if(isPredicate(id: candidate->id())) |
| 4634 | target = candidate; |
| 4635 | else |
| 4636 | break; /* target is now the last predicate. */ |
| 4637 | } |
| 4638 | |
| 4639 | if(target->is(i: Expression::IDAxisStep)) |
| 4640 | { |
| 4641 | (yyval.expr) = create(expr: GenericPredicate::create(sourceExpression: (yyvsp[0].expr), predicateExpression: create(expr: new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::document), sourceLocator: (yyloc), parseInfo), |
| 4642 | context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: (yylsp[-1]), parseInfo)), sourceLocator: (yylsp[-1]), parseInfo); |
| 4643 | } |
| 4644 | else |
| 4645 | { |
| 4646 | const Expression::List targetOperands(target->operands()); |
| 4647 | Expression::List newOps; |
| 4648 | newOps.append(t: targetOperands.at(i: 0)); |
| 4649 | |
| 4650 | newOps.append(t: create(expr: GenericPredicate::create(sourceExpression: targetOperands.at(i: 1), |
| 4651 | predicateExpression: create(expr: new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::document), sourceLocator: (yyloc), parseInfo), |
| 4652 | context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: (yylsp[-1]), parseInfo)), sourceLocator: (yylsp[-1]), parseInfo)); |
| 4653 | |
| 4654 | target->setOperands(newOps); |
| 4655 | (yyval.expr) = (yyvsp[0].expr); |
| 4656 | } |
| 4657 | } |
| 4658 | #line 4610 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4659 | break; |
| 4660 | |
| 4661 | case 95: |
| 4662 | #line 2405 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4663 | { |
| 4664 | /* //axis::node-test |
| 4665 | * => |
| 4666 | * axis::node-test[parent::node()] |
| 4667 | * |
| 4668 | * Spec says: "//para matches any para element that has a parent node." |
| 4669 | */ |
| 4670 | (yyval.expr) = create(expr: GenericPredicate::create(sourceExpression: (yyvsp[0].expr), predicateExpression: create(expr: new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::node), sourceLocator: (yyloc), parseInfo), |
| 4671 | context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: (yylsp[-1]), parseInfo)), sourceLocator: (yylsp[-1]), parseInfo); |
| 4672 | } |
| 4673 | #line 4625 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4674 | break; |
| 4675 | |
| 4676 | case 97: |
| 4677 | #line 2417 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4678 | { |
| 4679 | createIdPatternPath(operand1: (yyvsp[-2].expr), operand2: (yyvsp[0].expr), axis: QXmlNodeModelIndex::AxisParent, sl: (yylsp[-1]), parseInfo); |
| 4680 | } |
| 4681 | #line 4633 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4682 | break; |
| 4683 | |
| 4684 | case 98: |
| 4685 | #line 2421 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4686 | { |
| 4687 | createIdPatternPath(operand1: (yyvsp[-2].expr), operand2: (yyvsp[0].expr), axis: QXmlNodeModelIndex::AxisAncestor, sl: (yylsp[-1]), parseInfo); |
| 4688 | } |
| 4689 | #line 4641 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4690 | break; |
| 4691 | |
| 4692 | case 99: |
| 4693 | #line 2426 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4694 | { |
| 4695 | const Expression::List ands((yyvsp[0].expr)->operands()); |
| 4696 | const FunctionSignature::Ptr signature((yyvsp[0].expr)->as<FunctionCall>()->signature()); |
| 4697 | const QXmlName name(signature->name()); |
| 4698 | const QXmlName key(StandardNamespaces::fn, StandardLocalNames::key); |
| 4699 | const QXmlName id(StandardNamespaces::fn, StandardLocalNames::id); |
| 4700 | |
| 4701 | if(name == id) |
| 4702 | { |
| 4703 | const Expression::ID id = ands.first()->id(); |
| 4704 | if(!isVariableReference(id) && id != Expression::IDStringValue) |
| 4705 | { |
| 4706 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "When function %1 is used for matching inside a pattern, " |
| 4707 | "the argument must be a variable reference or a string literal." ) |
| 4708 | .arg(a: formatFunction(np: parseInfo->staticContext->namePool(), func: signature)), |
| 4709 | errorCode: ReportContext::XPST0003, |
| 4710 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4711 | } |
| 4712 | } |
| 4713 | else if(name == key) |
| 4714 | { |
| 4715 | if(ands.first()->id() != Expression::IDStringValue) |
| 4716 | { |
| 4717 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "In an XSL-T pattern, the first argument to function %1 " |
| 4718 | "must be a string literal, when used for matching." ) |
| 4719 | .arg(a: formatFunction(np: parseInfo->staticContext->namePool(), func: signature)), |
| 4720 | errorCode: ReportContext::XPST0003, |
| 4721 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4722 | } |
| 4723 | |
| 4724 | const Expression::ID id2 = ands.at(i: 1)->id(); |
| 4725 | if(!isVariableReference(id: id2) && |
| 4726 | id2 != Expression::IDStringValue && |
| 4727 | id2 != Expression::IDIntegerValue && |
| 4728 | id2 != Expression::IDBooleanValue && |
| 4729 | id2 != Expression::IDFloat) |
| 4730 | { |
| 4731 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "In an XSL-T pattern, the first argument to function %1 " |
| 4732 | "must be a literal or a variable reference, when used for matching." ) |
| 4733 | .arg(a: formatFunction(np: parseInfo->staticContext->namePool(), func: signature)), |
| 4734 | errorCode: ReportContext::XPST0003, |
| 4735 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4736 | } |
| 4737 | |
| 4738 | if(ands.count() == 3) |
| 4739 | { |
| 4740 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "In an XSL-T pattern, function %1 cannot have a third argument." ) |
| 4741 | .arg(a: formatFunction(np: parseInfo->staticContext->namePool(), func: signature)), |
| 4742 | errorCode: ReportContext::XPST0003, |
| 4743 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4744 | } |
| 4745 | |
| 4746 | } |
| 4747 | else |
| 4748 | { |
| 4749 | const FunctionSignature::Hash signs(parseInfo->staticContext->functionSignatures()->functionSignatures()); |
| 4750 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "In an XSL-T pattern, only function %1 " |
| 4751 | "and %2, not %3, can be used for matching." ) |
| 4752 | .arg(args: formatFunction(np: parseInfo->staticContext->namePool(), func: signs.value(akey: id)), |
| 4753 | args: formatFunction(np: parseInfo->staticContext->namePool(), func: signs.value(akey: key)), |
| 4754 | args: formatFunction(np: parseInfo->staticContext->namePool(), func: signature)), |
| 4755 | errorCode: ReportContext::XPST0003, |
| 4756 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4757 | } |
| 4758 | |
| 4759 | (yyval.expr) = (yyvsp[0].expr); |
| 4760 | } |
| 4761 | #line 4713 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4762 | break; |
| 4763 | |
| 4764 | case 101: |
| 4765 | #line 2496 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4766 | { |
| 4767 | (yyval.expr) = createPatternPath(operand1: (yyvsp[-2].expr), operand2: (yyvsp[0].expr), axis: QXmlNodeModelIndex::AxisParent, sl: (yylsp[-1]), parseInfo); |
| 4768 | } |
| 4769 | #line 4721 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4770 | break; |
| 4771 | |
| 4772 | case 102: |
| 4773 | #line 2500 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4774 | { |
| 4775 | (yyval.expr) = createPatternPath(operand1: (yyvsp[-2].expr), operand2: (yyvsp[0].expr), axis: QXmlNodeModelIndex::AxisAncestor, sl: (yylsp[-1]), parseInfo); |
| 4776 | } |
| 4777 | #line 4729 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4778 | break; |
| 4779 | |
| 4780 | case 103: |
| 4781 | #line 2505 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4782 | { |
| 4783 | const Expression::Ptr expr(findAxisStep(expr: (yyvsp[0].expr))); |
| 4784 | |
| 4785 | const QXmlNodeModelIndex::Axis axis = expr->as<AxisStep>()->axis(); |
| 4786 | AxisStep *const axisStep = expr->as<AxisStep>(); |
| 4787 | |
| 4788 | /* Here we constrain the possible axes, and we rewrite the axes as according |
| 4789 | * to 5.5.3 The Meaning of a Pattern. |
| 4790 | * |
| 4791 | * However, we also rewrite axis child and attribute to axis self. The |
| 4792 | * reason for this is that if we don't, we will match the children of |
| 4793 | * the context node, instead of the context node itself. The formal |
| 4794 | * definition of a pattern, root(.)//EE is insensitive to context, |
| 4795 | * while the way we implement pattern, "the other way of seeing it", |
| 4796 | * e.g from right to left, are very much. */ |
| 4797 | |
| 4798 | if(axisStep->nodeTest() == BuiltinTypes::document |
| 4799 | || axis == QXmlNodeModelIndex::AxisChild) |
| 4800 | axisStep->setAxis(QXmlNodeModelIndex::AxisSelf); |
| 4801 | else if(axis == QXmlNodeModelIndex::AxisAttribute) |
| 4802 | { |
| 4803 | axisStep->setAxis(QXmlNodeModelIndex::AxisSelf); |
| 4804 | /* Consider that the user write attribute::node(). This is |
| 4805 | * semantically equivalent to attribute::attribute(), but since we have changed |
| 4806 | * the axis to axis self, we also need to change the node test, such that we |
| 4807 | * have self::attribute(). */ |
| 4808 | if(*axisStep->nodeTest() == *BuiltinTypes::node) |
| 4809 | axisStep->setNodeTest(BuiltinTypes::attribute); |
| 4810 | } |
| 4811 | else |
| 4812 | { |
| 4813 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "In an XSL-T pattern, axis %1 cannot be used, " |
| 4814 | "only axis %2 or %3 can." ) |
| 4815 | .arg(args: formatKeyword(keyword: AxisStep::axisName(axis)), |
| 4816 | args: formatKeyword(keyword: AxisStep::axisName(axis: QXmlNodeModelIndex::AxisChild)), |
| 4817 | args: formatKeyword(keyword: AxisStep::axisName(axis: QXmlNodeModelIndex::AxisAttribute))), |
| 4818 | errorCode: ReportContext::XPST0003, |
| 4819 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4820 | } |
| 4821 | |
| 4822 | (yyval.expr) = (yyvsp[0].expr); |
| 4823 | } |
| 4824 | #line 4776 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4825 | break; |
| 4826 | |
| 4827 | case 105: |
| 4828 | #line 2550 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4829 | { |
| 4830 | (yyval.expr) = create(expr: new ExpressionSequence((yyvsp[0].expressionList)), sourceLocator: (yyloc), parseInfo); |
| 4831 | } |
| 4832 | #line 4784 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4833 | break; |
| 4834 | |
| 4835 | case 106: |
| 4836 | #line 2555 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4837 | { |
| 4838 | Expression::List l; |
| 4839 | l.append(t: (yyvsp[-2].expr)); |
| 4840 | l.append(t: (yyvsp[0].expr)); |
| 4841 | (yyval.expressionList) = l; |
| 4842 | } |
| 4843 | #line 4795 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4844 | break; |
| 4845 | |
| 4846 | case 107: |
| 4847 | #line 2562 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4848 | { |
| 4849 | (yyvsp[-2].expressionList).append(t: (yyvsp[0].expr)); |
| 4850 | (yyval.expressionList) = (yyvsp[-2].expressionList); |
| 4851 | } |
| 4852 | #line 4804 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4853 | break; |
| 4854 | |
| 4855 | case 113: |
| 4856 | #line 2573 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4857 | { |
| 4858 | (yyval.expr) = createDirAttributeValue(content: (yyvsp[-1].expressionList), parseInfo, sourceLocator: (yyloc)); |
| 4859 | } |
| 4860 | #line 4812 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4861 | break; |
| 4862 | |
| 4863 | case 114: |
| 4864 | #line 2578 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4865 | { |
| 4866 | QVector<QXmlName> result; |
| 4867 | result.append(t: QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default)); |
| 4868 | (yyval.qNameVector) = result; |
| 4869 | } |
| 4870 | #line 4822 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4871 | break; |
| 4872 | |
| 4873 | case 115: |
| 4874 | #line 2584 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4875 | { |
| 4876 | (yyval.qNameVector) = (yyvsp[0].qNameVector); |
| 4877 | } |
| 4878 | #line 4830 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4879 | break; |
| 4880 | |
| 4881 | case 116: |
| 4882 | #line 2589 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4883 | { |
| 4884 | (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default); |
| 4885 | } |
| 4886 | #line 4838 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4887 | break; |
| 4888 | |
| 4889 | case 117: |
| 4890 | #line 2593 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4891 | { |
| 4892 | (yyval.qName) = (yyvsp[0].qName); |
| 4893 | } |
| 4894 | #line 4846 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4895 | break; |
| 4896 | |
| 4897 | case 118: |
| 4898 | #line 2598 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4899 | { |
| 4900 | QVector<QXmlName> result; |
| 4901 | result.append(t: (yyvsp[0].qName)); |
| 4902 | (yyval.qNameVector) = result; |
| 4903 | } |
| 4904 | #line 4856 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4905 | break; |
| 4906 | |
| 4907 | case 119: |
| 4908 | #line 2604 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4909 | { |
| 4910 | (yyvsp[-2].qNameVector).append(t: (yyvsp[0].qName)); |
| 4911 | (yyval.qNameVector) = (yyvsp[-2].qNameVector); |
| 4912 | } |
| 4913 | #line 4865 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4914 | break; |
| 4915 | |
| 4916 | case 120: |
| 4917 | #line 2610 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4918 | { |
| 4919 | (yyval.qName) = (yyvsp[0].qName); |
| 4920 | } |
| 4921 | #line 4873 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4922 | break; |
| 4923 | |
| 4924 | case 121: |
| 4925 | #line 2614 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4926 | { |
| 4927 | if((yyvsp[0].sval) == QLatin1String("#current" )) |
| 4928 | (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::current); |
| 4929 | else if((yyvsp[0].sval) == QLatin1String("#default" )) |
| 4930 | (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default); |
| 4931 | else if((yyvsp[0].sval) == QLatin1String("#all" )) |
| 4932 | (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::all); |
| 4933 | else |
| 4934 | { |
| 4935 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 4936 | |
| 4937 | if(!QXmlUtils::isNCName(ncName: (yyvsp[0].sval))) |
| 4938 | { |
| 4939 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is an invalid template mode name." ) |
| 4940 | .arg(a: formatKeyword(keyword: (yyvsp[0].sval))), |
| 4941 | errorCode: ReportContext::XTSE0550, |
| 4942 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4943 | } |
| 4944 | |
| 4945 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: StandardNamespaces::empty, ln: (yyvsp[0].sval)); |
| 4946 | } |
| 4947 | } |
| 4948 | #line 4900 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4949 | break; |
| 4950 | |
| 4951 | case 124: |
| 4952 | #line 2643 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4953 | { |
| 4954 | /* We're pushing the range variable here, not the positional. */ |
| 4955 | (yyval.expr) = pushVariable(name: (yyvsp[-4].qName), seqType: quantificationType(type: (yyvsp[-3].sequenceType)), expr: (yyvsp[0].expr), type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 4956 | } |
| 4957 | #line 4909 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4958 | break; |
| 4959 | |
| 4960 | case 125: |
| 4961 | #line 2647 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4962 | { |
| 4963 | /* It is ok this appears after PositionalVar, because currentRangeSlot() |
| 4964 | * uses a different "channel" than currentPositionSlot(), so they can't trash |
| 4965 | * each other. */ |
| 4966 | (yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot(); |
| 4967 | } |
| 4968 | #line 4920 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 4969 | break; |
| 4970 | |
| 4971 | case 126: |
| 4972 | #line 2654 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 4973 | { |
| 4974 | Q_ASSERT((yyvsp[-3].expr)); |
| 4975 | Q_ASSERT((yyvsp[0].expr)); |
| 4976 | |
| 4977 | /* We want the next last pushed variable, since we push the range variable after the |
| 4978 | * positional variable. */ |
| 4979 | if((yyvsp[-5].enums.slot) != -1 && parseInfo->variables.at(i: parseInfo->variables.count() -2)->name == (yyvsp[-7].qName)) |
| 4980 | { |
| 4981 | /* Ok, a positional variable is used since its slot is not -1, and its name is equal |
| 4982 | * to our range variable. This is an error. */ |
| 4983 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The name of a variable bound in a for-expression must be different " |
| 4984 | "from the positional variable. Hence, the two variables named %1 collide." ) |
| 4985 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-7].qName))), |
| 4986 | errorCode: ReportContext::XQST0089, |
| 4987 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 4988 | |
| 4989 | } |
| 4990 | |
| 4991 | const Expression::Ptr retBody(create(expr: new ForClause((yyvsp[-1].enums.slot), (yyvsp[-2].expr), (yyvsp[0].expr), (yyvsp[-5].enums.slot)), sourceLocator: (yyloc), parseInfo)); |
| 4992 | ReturnOrderBy *const rob = locateReturnClause(expr: (yyvsp[0].expr)); |
| 4993 | |
| 4994 | if(rob) |
| 4995 | (yyval.expr) = create(expr: new OrderBy(rob->stability(), rob->orderSpecs(), retBody, rob), sourceLocator: (yyloc), parseInfo); |
| 4996 | else |
| 4997 | (yyval.expr) = retBody; |
| 4998 | |
| 4999 | parseInfo->finalizePushedVariable(); |
| 5000 | |
| 5001 | if((yyvsp[-5].enums.slot) != -1) /* We also have a positional variable to remove from the scope. */ |
| 5002 | parseInfo->finalizePushedVariable(); |
| 5003 | } |
| 5004 | #line 4956 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5005 | break; |
| 5006 | |
| 5007 | case 127: |
| 5008 | #line 2688 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5009 | { |
| 5010 | pushVariable(name: (yyvsp[-4].qName), seqType: quantificationType(type: (yyvsp[-3].sequenceType)), expr: (yyvsp[0].expr), type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 5011 | } |
| 5012 | #line 4964 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5013 | break; |
| 5014 | |
| 5015 | case 128: |
| 5016 | #line 2691 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5017 | { |
| 5018 | /* It is ok this appears after PositionalVar, because currentRangeSlot() |
| 5019 | * uses a different "channel" than currentPositionSlot(), so they can't trash |
| 5020 | * each other. */ |
| 5021 | (yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot(); |
| 5022 | } |
| 5023 | #line 4975 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5024 | break; |
| 5025 | |
| 5026 | case 129: |
| 5027 | #line 2698 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5028 | { |
| 5029 | (yyval.expr) = create(expr: new ForClause((yyvsp[-1].enums.slot), (yyvsp[-3].expr), (yyvsp[0].expr), (yyvsp[-5].enums.slot)), sourceLocator: (yyloc), parseInfo); |
| 5030 | |
| 5031 | parseInfo->finalizePushedVariable(); |
| 5032 | |
| 5033 | if((yyvsp[-5].enums.slot) != -1) /* We also have a positional variable to remove from the scope. */ |
| 5034 | parseInfo->finalizePushedVariable(); |
| 5035 | } |
| 5036 | #line 4988 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5037 | break; |
| 5038 | |
| 5039 | case 133: |
| 5040 | #line 2712 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5041 | { |
| 5042 | (yyval.enums.slot) = -1; |
| 5043 | } |
| 5044 | #line 4996 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5045 | break; |
| 5046 | |
| 5047 | case 134: |
| 5048 | #line 2717 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5049 | { |
| 5050 | pushVariable(name: (yyvsp[0].qName), seqType: CommonSequenceTypes::ExactlyOneInteger, expr: Expression::Ptr(), |
| 5051 | type: VariableDeclaration::PositionalVariable, sourceLocator: (yyloc), parseInfo); |
| 5052 | (yyval.enums.slot) = parseInfo->currentPositionSlot(); |
| 5053 | } |
| 5054 | #line 5006 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5055 | break; |
| 5056 | |
| 5057 | case 135: |
| 5058 | #line 2724 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5059 | { |
| 5060 | (yyval.expr) = pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), type: VariableDeclaration::ExpressionVariable, sourceLocator: (yyloc), parseInfo); |
| 5061 | } |
| 5062 | #line 5014 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5063 | break; |
| 5064 | |
| 5065 | case 136: |
| 5066 | #line 2728 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5067 | { |
| 5068 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-7].enums.Bool)); |
| 5069 | |
| 5070 | Q_ASSERT(parseInfo->variables.top()->name == (yyvsp[-5].qName)); |
| 5071 | (yyval.expr) = create(expr: new LetClause((yyvsp[-1].expr), (yyvsp[0].expr), parseInfo->variables.top()), sourceLocator: (yyloc), parseInfo); |
| 5072 | parseInfo->finalizePushedVariable(); |
| 5073 | } |
| 5074 | #line 5026 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5075 | break; |
| 5076 | |
| 5077 | case 137: |
| 5078 | #line 2737 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5079 | { (yyval.expr) = pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), type: VariableDeclaration::ExpressionVariable, sourceLocator: (yyloc), parseInfo);} |
| 5080 | #line 5032 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5081 | break; |
| 5082 | |
| 5083 | case 138: |
| 5084 | #line 2739 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5085 | { |
| 5086 | Q_ASSERT(parseInfo->variables.top()->name == (yyvsp[-5].qName)); |
| 5087 | (yyval.expr) = create(expr: new LetClause((yyvsp[-1].expr), (yyvsp[0].expr), parseInfo->variables.top()), sourceLocator: (yyloc), parseInfo); |
| 5088 | parseInfo->finalizePushedVariable(); |
| 5089 | } |
| 5090 | #line 5042 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5091 | break; |
| 5092 | |
| 5093 | case 142: |
| 5094 | #line 2750 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5095 | { |
| 5096 | if((yyvsp[-2].orderSpecs).isEmpty()) |
| 5097 | (yyval.expr) = (yyvsp[0].expr); |
| 5098 | else |
| 5099 | (yyval.expr) = createReturnOrderBy(orderSpecTransfer: (yyvsp[-2].orderSpecs), returnExpr: (yyvsp[0].expr), stability: parseInfo->orderStability.pop(), sourceLocator: (yyloc), parseInfo); |
| 5100 | } |
| 5101 | #line 5053 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5102 | break; |
| 5103 | |
| 5104 | case 143: |
| 5105 | #line 2758 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5106 | { |
| 5107 | if((yyvsp[-2].orderSpecs).isEmpty()) |
| 5108 | (yyval.expr) = create(expr: new IfThenClause((yyvsp[-3].expr), (yyvsp[0].expr), create(expr: new EmptySequence, sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 5109 | else |
| 5110 | (yyval.expr) = create(expr: new IfThenClause((yyvsp[-3].expr), createReturnOrderBy(orderSpecTransfer: (yyvsp[-2].orderSpecs), returnExpr: (yyvsp[0].expr), stability: parseInfo->orderStability.pop(), sourceLocator: (yyloc), parseInfo), |
| 5111 | create(expr: new EmptySequence, sourceLocator: (yyloc), parseInfo)), |
| 5112 | sourceLocator: (yyloc), parseInfo); |
| 5113 | } |
| 5114 | #line 5066 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5115 | break; |
| 5116 | |
| 5117 | case 144: |
| 5118 | #line 2768 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5119 | { |
| 5120 | (yyval.orderSpecs) = OrderSpecTransfer::List(); |
| 5121 | } |
| 5122 | #line 5074 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5123 | break; |
| 5124 | |
| 5125 | case 146: |
| 5126 | #line 2774 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5127 | { |
| 5128 | (yyval.orderSpecs) = (yyvsp[0].orderSpecs); |
| 5129 | } |
| 5130 | #line 5082 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5131 | break; |
| 5132 | |
| 5133 | case 147: |
| 5134 | #line 2779 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5135 | { |
| 5136 | OrderSpecTransfer::List list; |
| 5137 | list += (yyvsp[-2].orderSpecs); |
| 5138 | list.append(t: (yyvsp[0].orderSpec)); |
| 5139 | (yyval.orderSpecs) = list; |
| 5140 | } |
| 5141 | #line 5093 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5142 | break; |
| 5143 | |
| 5144 | case 148: |
| 5145 | #line 2786 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5146 | { |
| 5147 | OrderSpecTransfer::List list; |
| 5148 | list.append(t: (yyvsp[0].orderSpec)); |
| 5149 | (yyval.orderSpecs) = list; |
| 5150 | } |
| 5151 | #line 5103 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5152 | break; |
| 5153 | |
| 5154 | case 149: |
| 5155 | #line 2793 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5156 | { |
| 5157 | (yyval.orderSpec) = OrderSpecTransfer((yyvsp[-3].expr), OrderBy::OrderSpec((yyvsp[-2].enums.sortDirection), (yyvsp[-1].enums.orderingEmptySequence))); |
| 5158 | } |
| 5159 | #line 5111 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5160 | break; |
| 5161 | |
| 5162 | case 150: |
| 5163 | #line 2798 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5164 | { |
| 5165 | /* Where does the specification state the default value is ascending? |
| 5166 | * |
| 5167 | * It is implicit, in the first enumerated list in 3.8.3 Order By and Return Clauses: |
| 5168 | * |
| 5169 | * "If T1 and T2 are two tuples in the tuple stream, and V1 and V2 are the first pair |
| 5170 | * of values encountered when evaluating their orderspecs from left to right for |
| 5171 | * which one value is greater-than the other (as defined above), then: |
| 5172 | * |
| 5173 | * 1. If V1 is greater-than V2: If the orderspec specifies descending, |
| 5174 | * then T1 precedes T2 in the tuple stream; otherwise, T2 precedes T1 in the tuple stream. |
| 5175 | * 2. If V2 is greater-than V1: If the orderspec specifies descending, |
| 5176 | * then T2 precedes T1 in the tuple stream; otherwise, T1 precedes T2 in the tuple stream." |
| 5177 | * |
| 5178 | * which means that if you don't specify anything, or you |
| 5179 | * specify ascending, you get the same result. |
| 5180 | */ |
| 5181 | (yyval.enums.sortDirection) = OrderBy::OrderSpec::Ascending; |
| 5182 | } |
| 5183 | #line 5135 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5184 | break; |
| 5185 | |
| 5186 | case 151: |
| 5187 | #line 2819 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5188 | { |
| 5189 | (yyval.enums.sortDirection) = OrderBy::OrderSpec::Ascending; |
| 5190 | } |
| 5191 | #line 5143 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5192 | break; |
| 5193 | |
| 5194 | case 152: |
| 5195 | #line 2824 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5196 | { |
| 5197 | (yyval.enums.sortDirection) = OrderBy::OrderSpec::Descending; |
| 5198 | } |
| 5199 | #line 5151 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5200 | break; |
| 5201 | |
| 5202 | case 153: |
| 5203 | #line 2829 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5204 | { |
| 5205 | (yyval.enums.orderingEmptySequence) = parseInfo->staticContext->orderingEmptySequence(); |
| 5206 | } |
| 5207 | #line 5159 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5208 | break; |
| 5209 | |
| 5210 | case 156: |
| 5211 | #line 2836 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5212 | { |
| 5213 | if(parseInfo->isXSLT()) |
| 5214 | resolveAndCheckCollation<ReportContext::XTDE1035>(collation: (yyvsp[0].sval), parseInfo, sl: (yyloc)); |
| 5215 | else |
| 5216 | resolveAndCheckCollation<ReportContext::XQST0076>(collation: (yyvsp[0].sval), parseInfo, sl: (yyloc)); |
| 5217 | } |
| 5218 | #line 5170 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5219 | break; |
| 5220 | |
| 5221 | case 157: |
| 5222 | #line 2843 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5223 | { |
| 5224 | /* We do nothing. We don't use collations, and we have this non-terminal |
| 5225 | * in order to accept expressions. */ |
| 5226 | } |
| 5227 | #line 5179 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5228 | break; |
| 5229 | |
| 5230 | case 158: |
| 5231 | #line 2849 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5232 | { |
| 5233 | parseInfo->orderStability.push(t: OrderBy::StableOrder); |
| 5234 | } |
| 5235 | #line 5187 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5236 | break; |
| 5237 | |
| 5238 | case 159: |
| 5239 | #line 2853 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5240 | { |
| 5241 | parseInfo->orderStability.push(t: OrderBy::UnstableOrder); |
| 5242 | } |
| 5243 | #line 5195 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5244 | break; |
| 5245 | |
| 5246 | case 162: |
| 5247 | #line 2861 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5248 | { |
| 5249 | pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), |
| 5250 | type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 5251 | } |
| 5252 | #line 5204 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5253 | break; |
| 5254 | |
| 5255 | case 163: |
| 5256 | #line 2865 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5257 | {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} |
| 5258 | #line 5210 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5259 | break; |
| 5260 | |
| 5261 | case 164: |
| 5262 | #line 2867 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5263 | { |
| 5264 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5265 | (yyval.expr) = create(expr: new QuantifiedExpression((yyvsp[-1].enums.slot), |
| 5266 | QuantifiedExpression::Some, (yyvsp[-3].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5267 | parseInfo->finalizePushedVariable(); |
| 5268 | } |
| 5269 | #line 5221 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5270 | break; |
| 5271 | |
| 5272 | case 165: |
| 5273 | #line 2875 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5274 | { |
| 5275 | (yyval.expr) = pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), |
| 5276 | type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 5277 | } |
| 5278 | #line 5230 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5279 | break; |
| 5280 | |
| 5281 | case 166: |
| 5282 | #line 2879 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5283 | {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} |
| 5284 | #line 5236 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5285 | break; |
| 5286 | |
| 5287 | case 167: |
| 5288 | #line 2881 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5289 | { |
| 5290 | (yyval.expr) = create(expr: new QuantifiedExpression((yyvsp[-1].enums.slot), |
| 5291 | QuantifiedExpression::Some, (yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5292 | parseInfo->finalizePushedVariable(); |
| 5293 | } |
| 5294 | #line 5246 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5295 | break; |
| 5296 | |
| 5297 | case 169: |
| 5298 | #line 2890 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5299 | { |
| 5300 | pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), |
| 5301 | type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 5302 | } |
| 5303 | #line 5255 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5304 | break; |
| 5305 | |
| 5306 | case 170: |
| 5307 | #line 2894 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5308 | {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} |
| 5309 | #line 5261 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5310 | break; |
| 5311 | |
| 5312 | case 171: |
| 5313 | #line 2896 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5314 | { |
| 5315 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5316 | (yyval.expr) = create(expr: new QuantifiedExpression((yyvsp[-1].enums.slot), |
| 5317 | QuantifiedExpression::Every, (yyvsp[-3].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5318 | parseInfo->finalizePushedVariable(); |
| 5319 | } |
| 5320 | #line 5272 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5321 | break; |
| 5322 | |
| 5323 | case 172: |
| 5324 | #line 2904 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5325 | { |
| 5326 | (yyval.expr) = pushVariable(name: (yyvsp[-3].qName), seqType: quantificationType(type: (yyvsp[-2].sequenceType)), expr: (yyvsp[0].expr), |
| 5327 | type: VariableDeclaration::RangeVariable, sourceLocator: (yyloc), parseInfo); |
| 5328 | } |
| 5329 | #line 5281 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5330 | break; |
| 5331 | |
| 5332 | case 173: |
| 5333 | #line 2908 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5334 | {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} |
| 5335 | #line 5287 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5336 | break; |
| 5337 | |
| 5338 | case 174: |
| 5339 | #line 2910 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5340 | { |
| 5341 | (yyval.expr) = create(expr: new QuantifiedExpression((yyvsp[-1].enums.slot), |
| 5342 | QuantifiedExpression::Every, (yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5343 | parseInfo->finalizePushedVariable(); |
| 5344 | } |
| 5345 | #line 5297 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5346 | break; |
| 5347 | |
| 5348 | case 176: |
| 5349 | #line 2919 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5350 | { |
| 5351 | (yyval.expr) = (yyvsp[0].expr); |
| 5352 | } |
| 5353 | #line 5305 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5354 | break; |
| 5355 | |
| 5356 | case 177: |
| 5357 | #line 2946 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5358 | { |
| 5359 | parseInfo->typeswitchSource.push(t: (yyvsp[-1].expr)); |
| 5360 | } |
| 5361 | #line 5313 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5362 | break; |
| 5363 | |
| 5364 | case 178: |
| 5365 | #line 2950 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5366 | { |
| 5367 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 5368 | parseInfo->typeswitchSource.pop(); |
| 5369 | (yyval.expr) = (yyvsp[0].expr); |
| 5370 | } |
| 5371 | #line 5323 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5372 | break; |
| 5373 | |
| 5374 | case 179: |
| 5375 | #line 2957 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5376 | { |
| 5377 | if(!(yyvsp[-1].qName).isNull()) |
| 5378 | { |
| 5379 | pushVariable(name: (yyvsp[-1].qName), seqType: (yyvsp[0].sequenceType), expr: parseInfo->typeswitchSource.top(), |
| 5380 | type: VariableDeclaration::ExpressionVariable, sourceLocator: (yyloc), parseInfo, checkSource: false); |
| 5381 | } |
| 5382 | } |
| 5383 | #line 5335 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5384 | break; |
| 5385 | |
| 5386 | case 180: |
| 5387 | #line 2965 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5388 | { |
| 5389 | /* The variable shouldn't be in-scope for other case branches. */ |
| 5390 | if(!(yyvsp[-4].qName).isNull()) |
| 5391 | parseInfo->finalizePushedVariable(); |
| 5392 | } |
| 5393 | #line 5345 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5394 | break; |
| 5395 | |
| 5396 | case 181: |
| 5397 | #line 2971 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5398 | { |
| 5399 | const Expression::Ptr instanceOf(create(expr: new InstanceOf(parseInfo->typeswitchSource.top(), (yyvsp[-5].sequenceType)), sourceLocator: (yyloc), parseInfo)); |
| 5400 | (yyval.expr) = create(expr: new IfThenClause(instanceOf, (yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5401 | } |
| 5402 | #line 5354 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5403 | break; |
| 5404 | |
| 5405 | case 184: |
| 5406 | #line 2980 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5407 | { |
| 5408 | (yyval.qName) = QXmlName(); |
| 5409 | } |
| 5410 | #line 5362 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5411 | break; |
| 5412 | |
| 5413 | case 185: |
| 5414 | #line 2985 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5415 | { |
| 5416 | (yyval.qName) = (yyvsp[-1].qName); |
| 5417 | } |
| 5418 | #line 5370 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5419 | break; |
| 5420 | |
| 5421 | case 186: |
| 5422 | #line 2990 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5423 | { |
| 5424 | (yyval.expr) = (yyvsp[0].expr); |
| 5425 | } |
| 5426 | #line 5378 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5427 | break; |
| 5428 | |
| 5429 | case 187: |
| 5430 | #line 2994 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5431 | { |
| 5432 | if(!(yyvsp[0].qName).isNull()) |
| 5433 | { |
| 5434 | pushVariable(name: (yyvsp[0].qName), seqType: parseInfo->typeswitchSource.top()->staticType(), |
| 5435 | expr: parseInfo->typeswitchSource.top(), |
| 5436 | type: VariableDeclaration::ExpressionVariable, sourceLocator: (yyloc), parseInfo, checkSource: false); |
| 5437 | } |
| 5438 | } |
| 5439 | #line 5391 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5440 | break; |
| 5441 | |
| 5442 | case 188: |
| 5443 | #line 3003 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5444 | { |
| 5445 | if(!(yyvsp[-3].qName).isNull()) |
| 5446 | parseInfo->finalizePushedVariable(); |
| 5447 | (yyval.expr) = (yyvsp[0].expr); |
| 5448 | } |
| 5449 | #line 5401 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5450 | break; |
| 5451 | |
| 5452 | case 189: |
| 5453 | #line 3010 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5454 | { |
| 5455 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5456 | (yyval.expr) = create(expr: new IfThenClause((yyvsp[-5].expr), (yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5457 | } |
| 5458 | #line 5410 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5459 | break; |
| 5460 | |
| 5461 | case 191: |
| 5462 | #line 3017 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5463 | { |
| 5464 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5465 | (yyval.expr) = create(expr: new OrExpression((yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5466 | } |
| 5467 | #line 5419 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5468 | break; |
| 5469 | |
| 5470 | case 193: |
| 5471 | #line 3024 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5472 | { |
| 5473 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5474 | (yyval.expr) = create(expr: new AndExpression((yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5475 | } |
| 5476 | #line 5428 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5477 | break; |
| 5478 | |
| 5479 | case 199: |
| 5480 | #line 3036 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5481 | { |
| 5482 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5483 | (yyval.expr) = create(expr: new RangeExpression((yyvsp[-2].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5484 | } |
| 5485 | #line 5437 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5486 | break; |
| 5487 | |
| 5488 | case 201: |
| 5489 | #line 3043 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5490 | { |
| 5491 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5492 | (yyval.expr) = create(expr: new ArithmeticExpression((yyvsp[-2].expr), (yyvsp[-1].enums.mathOperator), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5493 | } |
| 5494 | #line 5446 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5495 | break; |
| 5496 | |
| 5497 | case 202: |
| 5498 | #line 3048 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5499 | {(yyval.enums.mathOperator) = AtomicMathematician::Add;} |
| 5500 | #line 5452 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5501 | break; |
| 5502 | |
| 5503 | case 203: |
| 5504 | #line 3049 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5505 | {(yyval.enums.mathOperator) = AtomicMathematician::Substract;} |
| 5506 | #line 5458 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5507 | break; |
| 5508 | |
| 5509 | case 205: |
| 5510 | #line 3053 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5511 | { |
| 5512 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5513 | (yyval.expr) = create(expr: new ArithmeticExpression((yyvsp[-2].expr), (yyvsp[-1].enums.mathOperator), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5514 | } |
| 5515 | #line 5467 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5516 | break; |
| 5517 | |
| 5518 | case 206: |
| 5519 | #line 3058 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5520 | {(yyval.enums.mathOperator) = AtomicMathematician::Multiply;} |
| 5521 | #line 5473 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5522 | break; |
| 5523 | |
| 5524 | case 207: |
| 5525 | #line 3059 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5526 | {(yyval.enums.mathOperator) = AtomicMathematician::Div;} |
| 5527 | #line 5479 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5528 | break; |
| 5529 | |
| 5530 | case 208: |
| 5531 | #line 3060 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5532 | {(yyval.enums.mathOperator) = AtomicMathematician::IDiv;} |
| 5533 | #line 5485 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5534 | break; |
| 5535 | |
| 5536 | case 209: |
| 5537 | #line 3061 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5538 | {(yyval.enums.mathOperator) = AtomicMathematician::Mod;} |
| 5539 | #line 5491 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5540 | break; |
| 5541 | |
| 5542 | case 211: |
| 5543 | #line 3065 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5544 | { |
| 5545 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 |
| 5546 | | QXmlQuery::XPath20 |
| 5547 | | QXmlQuery::XmlSchema11IdentityConstraintField |
| 5548 | | QXmlQuery::XmlSchema11IdentityConstraintSelector), |
| 5549 | parseInfo, sourceLocator: (yyloc)); |
| 5550 | (yyval.expr) = create(expr: new CombineNodes((yyvsp[-2].expr), CombineNodes::Union, (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5551 | } |
| 5552 | #line 5504 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5553 | break; |
| 5554 | |
| 5555 | case 213: |
| 5556 | #line 3076 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5557 | { |
| 5558 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5559 | (yyval.expr) = create(expr: new CombineNodes((yyvsp[-2].expr), (yyvsp[-1].enums.combinedNodeOp), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5560 | } |
| 5561 | #line 5513 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5562 | break; |
| 5563 | |
| 5564 | case 216: |
| 5565 | #line 3085 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5566 | { |
| 5567 | (yyval.enums.combinedNodeOp) = CombineNodes::Intersect; |
| 5568 | } |
| 5569 | #line 5521 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5570 | break; |
| 5571 | |
| 5572 | case 217: |
| 5573 | #line 3089 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5574 | { |
| 5575 | (yyval.enums.combinedNodeOp) = CombineNodes::Except; |
| 5576 | } |
| 5577 | #line 5529 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5578 | break; |
| 5579 | |
| 5580 | case 219: |
| 5581 | #line 3095 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5582 | { |
| 5583 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5584 | (yyval.expr) = create(expr: new InstanceOf((yyvsp[-3].expr), |
| 5585 | SequenceType::Ptr((yyvsp[0].sequenceType))), sourceLocator: (yyloc), parseInfo); |
| 5586 | } |
| 5587 | #line 5539 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5588 | break; |
| 5589 | |
| 5590 | case 221: |
| 5591 | #line 3103 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5592 | { |
| 5593 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5594 | (yyval.expr) = create(expr: new TreatAs((yyvsp[-3].expr), (yyvsp[0].sequenceType)), sourceLocator: (yyloc), parseInfo); |
| 5595 | } |
| 5596 | #line 5548 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5597 | break; |
| 5598 | |
| 5599 | case 223: |
| 5600 | #line 3110 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5601 | { |
| 5602 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5603 | (yyval.expr) = create(expr: new CastableAs((yyvsp[-3].expr), (yyvsp[0].sequenceType)), sourceLocator: (yyloc), parseInfo); |
| 5604 | } |
| 5605 | #line 5557 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5606 | break; |
| 5607 | |
| 5608 | case 225: |
| 5609 | #line 3117 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5610 | { |
| 5611 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5612 | (yyval.expr) = create(expr: new CastAs((yyvsp[-3].expr), (yyvsp[0].sequenceType)), sourceLocator: (yyloc), parseInfo); |
| 5613 | } |
| 5614 | #line 5566 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5615 | break; |
| 5616 | |
| 5617 | case 227: |
| 5618 | #line 3124 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5619 | { |
| 5620 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5621 | (yyval.expr) = create(expr: new UnaryExpression((yyvsp[-1].enums.mathOperator), (yyvsp[0].expr), parseInfo->staticContext), sourceLocator: (yyloc), parseInfo); |
| 5622 | } |
| 5623 | #line 5575 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5624 | break; |
| 5625 | |
| 5626 | case 228: |
| 5627 | #line 3130 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5628 | { |
| 5629 | (yyval.enums.mathOperator) = AtomicMathematician::Add; |
| 5630 | } |
| 5631 | #line 5583 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5632 | break; |
| 5633 | |
| 5634 | case 229: |
| 5635 | #line 3134 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5636 | { |
| 5637 | (yyval.enums.mathOperator) = AtomicMathematician::Substract; |
| 5638 | } |
| 5639 | #line 5591 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5640 | break; |
| 5641 | |
| 5642 | case 233: |
| 5643 | #line 3143 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5644 | { |
| 5645 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 5646 | (yyval.expr) = create(expr: new GeneralComparison((yyvsp[-2].expr), (yyvsp[-1].enums.valueOperator), (yyvsp[0].expr), parseInfo->isBackwardsCompat.top()), sourceLocator: (yyloc), parseInfo); |
| 5647 | } |
| 5648 | #line 5600 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5649 | break; |
| 5650 | |
| 5651 | case 234: |
| 5652 | #line 3148 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5653 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorEqual;} |
| 5654 | #line 5606 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5655 | break; |
| 5656 | |
| 5657 | case 235: |
| 5658 | #line 3149 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5659 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorNotEqual;} |
| 5660 | #line 5612 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5661 | break; |
| 5662 | |
| 5663 | case 236: |
| 5664 | #line 3150 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5665 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterOrEqual;} |
| 5666 | #line 5618 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5667 | break; |
| 5668 | |
| 5669 | case 237: |
| 5670 | #line 3151 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5671 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterThan;} |
| 5672 | #line 5624 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5673 | break; |
| 5674 | |
| 5675 | case 238: |
| 5676 | #line 3152 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5677 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessOrEqual;} |
| 5678 | #line 5630 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5679 | break; |
| 5680 | |
| 5681 | case 239: |
| 5682 | #line 3153 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5683 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessThan;} |
| 5684 | #line 5636 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5685 | break; |
| 5686 | |
| 5687 | case 240: |
| 5688 | #line 3156 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5689 | { |
| 5690 | (yyval.expr) = create(expr: new ValueComparison((yyvsp[-2].expr), (yyvsp[-1].enums.valueOperator), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5691 | } |
| 5692 | #line 5644 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5693 | break; |
| 5694 | |
| 5695 | case 241: |
| 5696 | #line 3160 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5697 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorEqual;} |
| 5698 | #line 5650 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5699 | break; |
| 5700 | |
| 5701 | case 242: |
| 5702 | #line 3161 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5703 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorNotEqual;} |
| 5704 | #line 5656 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5705 | break; |
| 5706 | |
| 5707 | case 243: |
| 5708 | #line 3162 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5709 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterOrEqual;} |
| 5710 | #line 5662 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5711 | break; |
| 5712 | |
| 5713 | case 244: |
| 5714 | #line 3163 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5715 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterThan;} |
| 5716 | #line 5668 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5717 | break; |
| 5718 | |
| 5719 | case 245: |
| 5720 | #line 3164 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5721 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessOrEqual;} |
| 5722 | #line 5674 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5723 | break; |
| 5724 | |
| 5725 | case 246: |
| 5726 | #line 3165 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5727 | {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessThan;} |
| 5728 | #line 5680 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5729 | break; |
| 5730 | |
| 5731 | case 247: |
| 5732 | #line 3168 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5733 | { |
| 5734 | (yyval.expr) = create(expr: new NodeComparison((yyvsp[-2].expr), (yyvsp[-1].enums.nodeOperator), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5735 | } |
| 5736 | #line 5688 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5737 | break; |
| 5738 | |
| 5739 | case 248: |
| 5740 | #line 3172 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5741 | {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Is;} |
| 5742 | #line 5694 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5743 | break; |
| 5744 | |
| 5745 | case 249: |
| 5746 | #line 3173 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5747 | {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Precedes;} |
| 5748 | #line 5700 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5749 | break; |
| 5750 | |
| 5751 | case 250: |
| 5752 | #line 3174 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5753 | {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Follows;} |
| 5754 | #line 5706 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5755 | break; |
| 5756 | |
| 5757 | case 251: |
| 5758 | #line 3177 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5759 | { |
| 5760 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 5761 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The Schema Validation Feature is not supported. " |
| 5762 | "Hence, %1-expressions may not be used." ) |
| 5763 | .arg(a: formatKeyword(keyword: "validate" )), |
| 5764 | errorCode: ReportContext::XQST0075, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 5765 | /* |
| 5766 | $$ = Validate::create($2, $1, parseInfo->staticContext); |
| 5767 | */ |
| 5768 | } |
| 5769 | #line 5721 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5770 | break; |
| 5771 | |
| 5772 | case 252: |
| 5773 | #line 3190 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5774 | {(yyval.enums.validationMode) = Validate::Strict;} |
| 5775 | #line 5727 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5776 | break; |
| 5777 | |
| 5778 | case 253: |
| 5779 | #line 3191 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5780 | {(yyval.enums.validationMode) = Validate::Strict;} |
| 5781 | #line 5733 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5782 | break; |
| 5783 | |
| 5784 | case 254: |
| 5785 | #line 3192 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5786 | {(yyval.enums.validationMode) = Validate::Lax;} |
| 5787 | #line 5739 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5788 | break; |
| 5789 | |
| 5790 | case 255: |
| 5791 | #line 3195 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5792 | { |
| 5793 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 5794 | /* We don't support any pragmas, so we only do the |
| 5795 | * necessary validation and use the fallback expression. */ |
| 5796 | |
| 5797 | if((yyvsp[0].expr)) |
| 5798 | (yyval.expr) = (yyvsp[0].expr); |
| 5799 | else |
| 5800 | { |
| 5801 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "None of the pragma expressions are supported. " |
| 5802 | "Therefore, a fallback expression " |
| 5803 | "must be present" ), |
| 5804 | errorCode: ReportContext::XQST0079, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 5805 | } |
| 5806 | } |
| 5807 | #line 5759 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5808 | break; |
| 5809 | |
| 5810 | case 256: |
| 5811 | #line 3212 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5812 | { |
| 5813 | (yyval.expr).reset(); |
| 5814 | } |
| 5815 | #line 5767 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5816 | break; |
| 5817 | |
| 5818 | case 257: |
| 5819 | #line 3216 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5820 | { |
| 5821 | (yyval.expr) = (yyvsp[-1].expr); |
| 5822 | } |
| 5823 | #line 5775 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5824 | break; |
| 5825 | |
| 5826 | case 260: |
| 5827 | #line 3224 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5828 | { |
| 5829 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 5830 | } |
| 5831 | #line 5783 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5832 | break; |
| 5833 | |
| 5834 | case 263: |
| 5835 | #line 3232 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5836 | { |
| 5837 | /* This is "/step". That is, fn:root(self::node()) treat as document-node()/RelativePathExpr. */ |
| 5838 | (yyval.expr) = create(expr: new Path(createRootExpression(parseInfo, sl: (yyloc)), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5839 | } |
| 5840 | #line 5792 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5841 | break; |
| 5842 | |
| 5843 | case 264: |
| 5844 | #line 3238 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5845 | { |
| 5846 | (yyval.expr) = createSlashSlashPath(begin: createRootExpression(parseInfo, sl: (yyloc)), end: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo); |
| 5847 | } |
| 5848 | #line 5800 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5849 | break; |
| 5850 | |
| 5851 | case 265: |
| 5852 | #line 3242 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5853 | { |
| 5854 | /* This is "/". That is, fn:root(self::node()) treat as document-node(). */ |
| 5855 | (yyval.expr) = createRootExpression(parseInfo, sl: (yyloc)); |
| 5856 | } |
| 5857 | #line 5809 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5858 | break; |
| 5859 | |
| 5860 | case 268: |
| 5861 | #line 3252 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5862 | { |
| 5863 | (yyval.expr) = create(expr: new Path((yyvsp[-2].expr), (yyvsp[0].expr), (yyvsp[-1].enums.pathKind)), sourceLocator: (yyloc), parseInfo); |
| 5864 | } |
| 5865 | #line 5817 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5866 | break; |
| 5867 | |
| 5868 | case 269: |
| 5869 | #line 3256 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5870 | { |
| 5871 | const Expression::Ptr orderBy(createReturnOrderBy(orderSpecTransfer: (yyvsp[-3].orderSpecs), returnExpr: (yyvsp[-1].expr), stability: parseInfo->orderStability.pop(), sourceLocator: (yyloc), parseInfo)); |
| 5872 | |
| 5873 | ReturnOrderBy *const rob = orderBy->as<ReturnOrderBy>(); |
| 5874 | const Expression::Ptr path(create(expr: new Path((yyvsp[-6].expr), orderBy, (yyvsp[-5].enums.pathKind)), sourceLocator: (yyloc), parseInfo)); |
| 5875 | |
| 5876 | (yyval.expr) = create(expr: new OrderBy(rob->stability(), rob->orderSpecs(), path, rob), sourceLocator: (yyloc), parseInfo); |
| 5877 | } |
| 5878 | #line 5830 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5879 | break; |
| 5880 | |
| 5881 | case 270: |
| 5882 | #line 3265 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5883 | { |
| 5884 | (yyval.expr) = createSlashSlashPath(begin: (yyvsp[-2].expr), end: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo); |
| 5885 | } |
| 5886 | #line 5838 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5887 | break; |
| 5888 | |
| 5889 | case 271: |
| 5890 | #line 3270 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5891 | { |
| 5892 | (yyval.expr) = NodeSortExpression::wrapAround(operand: (yyvsp[0].expr), context: parseInfo->staticContext); |
| 5893 | } |
| 5894 | #line 5846 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5895 | break; |
| 5896 | |
| 5897 | case 273: |
| 5898 | #line 3275 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5899 | { |
| 5900 | (yyval.expr) = create(expr: new CurrentItemStore((yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 5901 | } |
| 5902 | #line 5854 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5903 | break; |
| 5904 | |
| 5905 | case 274: |
| 5906 | #line 3279 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5907 | { |
| 5908 | const xsDouble version = (yyvsp[0].sval).toDouble(); |
| 5909 | |
| 5910 | parseInfo->isBackwardsCompat.push(t: version != 2); |
| 5911 | |
| 5912 | (yyval.enums.Double) = version; |
| 5913 | } |
| 5914 | #line 5866 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5915 | break; |
| 5916 | |
| 5917 | case 275: |
| 5918 | #line 3287 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5919 | { |
| 5920 | if((yyvsp[-1].enums.Double) < 2) |
| 5921 | (yyval.expr) = createCompatStore(expr: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo); |
| 5922 | else |
| 5923 | (yyval.expr) = (yyvsp[0].expr); |
| 5924 | } |
| 5925 | #line 5877 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5926 | break; |
| 5927 | |
| 5928 | case 276: |
| 5929 | #line 3294 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5930 | { |
| 5931 | allowedIn(allowedLanguages: QXmlQuery::XSLT20, parseInfo, sourceLocator: (yyloc)); |
| 5932 | Q_ASSERT(!(yyvsp[-3].sval).isEmpty()); |
| 5933 | (yyval.expr) = create(expr: new StaticBaseURIStore((yyvsp[-3].sval), (yyvsp[-1].expr)), sourceLocator: (yyloc), parseInfo); |
| 5934 | } |
| 5935 | #line 5887 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5936 | break; |
| 5937 | |
| 5938 | case 277: |
| 5939 | #line 3301 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5940 | { |
| 5941 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20), parseInfo, sourceLocator: (yyloc)); |
| 5942 | parseInfo->resolvers.push(t: parseInfo->staticContext->namespaceBindings()); |
| 5943 | const NamespaceResolver::Ptr resolver(new DelegatingNamespaceResolver(parseInfo->staticContext->namespaceBindings())); |
| 5944 | resolver->addBinding(nb: QXmlName(parseInfo->staticContext->namePool()->allocateNamespace(uri: (yyvsp[-1].sval)), |
| 5945 | StandardLocalNames::empty, |
| 5946 | parseInfo->staticContext->namePool()->allocatePrefix(prefix: (yyvsp[-3].sval)))); |
| 5947 | parseInfo->staticContext->setNamespaceBindings(resolver); |
| 5948 | } |
| 5949 | #line 5901 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5950 | break; |
| 5951 | |
| 5952 | case 278: |
| 5953 | #line 3312 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5954 | { |
| 5955 | parseInfo->staticContext->setNamespaceBindings(parseInfo->resolvers.pop()); |
| 5956 | (yyval.expr) = (yyvsp[-1].expr); |
| 5957 | } |
| 5958 | #line 5910 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5959 | break; |
| 5960 | |
| 5961 | case 279: |
| 5962 | #line 3317 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5963 | { |
| 5964 | (yyval.expr) = create(expr: new CallTemplate((yyvsp[-3].qName), parseInfo->templateWithParams), sourceLocator: (yyloc), parseInfo); |
| 5965 | parseInfo->templateWithParametersHandled(); |
| 5966 | parseInfo->templateCalls.append(t: (yyval.expr)); |
| 5967 | } |
| 5968 | #line 5920 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5969 | break; |
| 5970 | |
| 5971 | case 280: |
| 5972 | #line 3324 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5973 | { |
| 5974 | parseInfo->startParsingWithParam(); |
| 5975 | } |
| 5976 | #line 5928 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5977 | break; |
| 5978 | |
| 5979 | case 281: |
| 5980 | #line 3328 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5981 | { |
| 5982 | parseInfo->endParsingWithParam(); |
| 5983 | } |
| 5984 | #line 5936 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5985 | break; |
| 5986 | |
| 5987 | case 282: |
| 5988 | #line 3333 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5989 | { |
| 5990 | } |
| 5991 | #line 5943 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5992 | break; |
| 5993 | |
| 5994 | case 283: |
| 5995 | #line 3336 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 5996 | { |
| 5997 | } |
| 5998 | #line 5950 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 5999 | break; |
| 6000 | |
| 6001 | case 284: |
| 6002 | #line 3339 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6003 | { |
| 6004 | } |
| 6005 | #line 5957 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6006 | break; |
| 6007 | |
| 6008 | case 285: |
| 6009 | #line 3343 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6010 | { |
| 6011 | } |
| 6012 | #line 5964 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6013 | break; |
| 6014 | |
| 6015 | case 286: |
| 6016 | #line 3346 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6017 | { |
| 6018 | } |
| 6019 | #line 5971 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6020 | break; |
| 6021 | |
| 6022 | case 287: |
| 6023 | #line 3350 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6024 | { |
| 6025 | /* Note, this grammar rule is invoked for @c xsl:param @em and @c |
| 6026 | * xsl:with-param. */ |
| 6027 | const bool isParsingWithParam = parseInfo->isParsingWithParam(); |
| 6028 | |
| 6029 | /** |
| 6030 | * @c xsl:param doesn't make life easy: |
| 6031 | * |
| 6032 | * If it only has @c name, it's default value is an empty |
| 6033 | * string(hence has type @c xs:string), but the value that |
| 6034 | * (maybe) is supplied can be anything, typically a node. |
| 6035 | * |
| 6036 | * Therefore, for that very common case we can't rely on |
| 6037 | * the Expression's type, but have to force it to item()*. |
| 6038 | * |
| 6039 | * So if we're supplied the type item()*, we pass a null |
| 6040 | * SequenceType. TemplateParameterReference recognizes this |
| 6041 | * and has item()* as its static type, regardless of if the |
| 6042 | * expression has a more specific type. |
| 6043 | */ |
| 6044 | SequenceType::Ptr type; |
| 6045 | |
| 6046 | if(!(yyvsp[-1].sequenceType)->is(other: CommonSequenceTypes::ZeroOrMoreItems)) |
| 6047 | type = (yyvsp[-1].sequenceType); |
| 6048 | |
| 6049 | Expression::Ptr expr; |
| 6050 | |
| 6051 | /* The default value is an empty sequence. */ |
| 6052 | if(!(yyvsp[0].expr) && ((type && (yyvsp[-1].sequenceType)->cardinality().allowsEmpty()) |
| 6053 | || isParsingWithParam)) |
| 6054 | expr = create(expr: new EmptySequence, sourceLocator: (yyloc), parseInfo); |
| 6055 | else |
| 6056 | expr = (yyvsp[0].expr); |
| 6057 | |
| 6058 | /* We ensure we have some type, so CallTemplate, Template and friends |
| 6059 | * are happy. */ |
| 6060 | if(!isParsingWithParam && !type) |
| 6061 | type = CommonSequenceTypes::ZeroOrMoreItems; |
| 6062 | |
| 6063 | if((yyvsp[-4].enums.Bool)) |
| 6064 | /* TODO, handle tunnel parameters. */; |
| 6065 | else |
| 6066 | { |
| 6067 | if((!isParsingWithParam && VariableDeclaration::contains(list: parseInfo->templateParameters, lookup: (yyvsp[-2].qName))) || |
| 6068 | (isParsingWithParam && parseInfo->templateWithParams.contains(akey: (yyvsp[-2].qName)))) |
| 6069 | { |
| 6070 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Each name of a template parameter must be unique; %1 is duplicated." ) |
| 6071 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-2].qName))), |
| 6072 | errorCode: isParsingWithParam ? ReportContext::XTSE0670 : ReportContext::XTSE0580, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6073 | } |
| 6074 | else |
| 6075 | { |
| 6076 | if(isParsingWithParam) |
| 6077 | parseInfo->templateWithParams[(yyvsp[-2].qName)] = WithParam::Ptr(new WithParam((yyvsp[-2].qName), (yyvsp[-1].sequenceType), expr)); |
| 6078 | else |
| 6079 | { |
| 6080 | Q_ASSERT(type); |
| 6081 | pushVariable(name: (yyvsp[-2].qName), seqType: type, expr, type: VariableDeclaration::TemplateParameter, sourceLocator: (yyloc), parseInfo); |
| 6082 | parseInfo->templateParameters.append(t: parseInfo->variables.top()); |
| 6083 | } |
| 6084 | } |
| 6085 | } |
| 6086 | } |
| 6087 | #line 6039 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6088 | break; |
| 6089 | |
| 6090 | case 288: |
| 6091 | #line 3415 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6092 | { |
| 6093 | (yyval.enums.Bool) = false; |
| 6094 | } |
| 6095 | #line 6047 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6096 | break; |
| 6097 | |
| 6098 | case 289: |
| 6099 | #line 3419 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6100 | { |
| 6101 | (yyval.enums.Bool) = true; |
| 6102 | } |
| 6103 | #line 6055 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6104 | break; |
| 6105 | |
| 6106 | case 290: |
| 6107 | #line 3424 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6108 | { |
| 6109 | (yyval.expr) = Expression::Ptr(); |
| 6110 | } |
| 6111 | #line 6063 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6112 | break; |
| 6113 | |
| 6114 | case 291: |
| 6115 | #line 3428 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6116 | { |
| 6117 | (yyval.expr) = (yyvsp[0].expr); |
| 6118 | } |
| 6119 | #line 6071 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6120 | break; |
| 6121 | |
| 6122 | case 292: |
| 6123 | #line 3437 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6124 | { |
| 6125 | (yyval.enums.pathKind) = Path::RegularPath; |
| 6126 | } |
| 6127 | #line 6079 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6128 | break; |
| 6129 | |
| 6130 | case 293: |
| 6131 | #line 3441 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6132 | { |
| 6133 | (yyval.enums.pathKind) = Path::XSLTForEach; |
| 6134 | } |
| 6135 | #line 6087 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6136 | break; |
| 6137 | |
| 6138 | case 294: |
| 6139 | #line 3445 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6140 | { |
| 6141 | (yyval.enums.pathKind) = Path::ForApplyTemplate; |
| 6142 | } |
| 6143 | #line 6095 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6144 | break; |
| 6145 | |
| 6146 | case 296: |
| 6147 | #line 3451 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6148 | { |
| 6149 | (yyval.expr) = create(expr: GenericPredicate::create(sourceExpression: (yyvsp[-3].expr), predicateExpression: (yyvsp[-1].expr), context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 6150 | } |
| 6151 | #line 6103 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6152 | break; |
| 6153 | |
| 6154 | case 299: |
| 6155 | #line 3459 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6156 | { |
| 6157 | if((yyvsp[0].enums.axis) == QXmlNodeModelIndex::AxisAttribute) |
| 6158 | parseInfo->nodeTestSource = BuiltinTypes::attribute; |
| 6159 | } |
| 6160 | #line 6112 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6161 | break; |
| 6162 | |
| 6163 | case 300: |
| 6164 | #line 3464 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6165 | { |
| 6166 | if((yyvsp[0].itemType)) |
| 6167 | { |
| 6168 | /* A node test was explicitly specified. The un-abbreviated syntax was used. */ |
| 6169 | (yyval.expr) = create(expr: new AxisStep((yyvsp[-2].enums.axis), (yyvsp[0].itemType)), sourceLocator: (yyloc), parseInfo); |
| 6170 | } |
| 6171 | else |
| 6172 | { |
| 6173 | /* Quote from 3.2.1.1 Axes |
| 6174 | * |
| 6175 | * [Definition: Every axis has a principal node kind. If an axis |
| 6176 | * can contain elements, then the principal node kind is element; |
| 6177 | * otherwise, it is the kind of nodes that the axis can contain.] Thus: |
| 6178 | * - For the attribute axis, the principal node kind is attribute. |
| 6179 | * - For all other axes, the principal node kind is element. */ |
| 6180 | |
| 6181 | if((yyvsp[-2].enums.axis) == QXmlNodeModelIndex::AxisAttribute) |
| 6182 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisAttribute, BuiltinTypes::attribute), sourceLocator: (yyloc), parseInfo); |
| 6183 | else |
| 6184 | (yyval.expr) = create(expr: new AxisStep((yyvsp[-2].enums.axis), BuiltinTypes::element), sourceLocator: (yyloc), parseInfo); |
| 6185 | } |
| 6186 | |
| 6187 | parseInfo->restoreNodeTestSource(); |
| 6188 | } |
| 6189 | #line 6141 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6190 | break; |
| 6191 | |
| 6192 | case 304: |
| 6193 | #line 3494 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6194 | { |
| 6195 | if((yyvsp[-1].enums.axis) == QXmlNodeModelIndex::AxisNamespace) |
| 6196 | { |
| 6197 | /* We don't raise XPST0010 here because the namespace axis isn't an optional |
| 6198 | * axis. It simply is not part of the XQuery grammar. */ |
| 6199 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The %1-axis is unsupported in XQuery" ) |
| 6200 | .arg(a: formatKeyword(keyword: "namespace" )), |
| 6201 | errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6202 | } |
| 6203 | else |
| 6204 | (yyval.enums.axis) = (yyvsp[-1].enums.axis); |
| 6205 | |
| 6206 | switch((yyvsp[-1].enums.axis)) |
| 6207 | { |
| 6208 | case QXmlNodeModelIndex::AxisAttribute: |
| 6209 | { |
| 6210 | allowedIn(allowedLanguages: QueryLanguages( QXmlQuery::XPath20 |
| 6211 | | QXmlQuery::XQuery10 |
| 6212 | | QXmlQuery::XmlSchema11IdentityConstraintField |
| 6213 | | QXmlQuery::XSLT20), |
| 6214 | parseInfo, sourceLocator: (yyloc)); |
| 6215 | break; |
| 6216 | } |
| 6217 | case QXmlNodeModelIndex::AxisChild: |
| 6218 | { |
| 6219 | allowedIn(allowedLanguages: QueryLanguages( QXmlQuery::XPath20 |
| 6220 | | QXmlQuery::XQuery10 |
| 6221 | | QXmlQuery::XmlSchema11IdentityConstraintField |
| 6222 | | QXmlQuery::XmlSchema11IdentityConstraintSelector |
| 6223 | | QXmlQuery::XSLT20), |
| 6224 | parseInfo, sourceLocator: (yyloc)); |
| 6225 | break; |
| 6226 | } |
| 6227 | default: |
| 6228 | { |
| 6229 | allowedIn(allowedLanguages: QueryLanguages( QXmlQuery::XPath20 |
| 6230 | | QXmlQuery::XQuery10 |
| 6231 | | QXmlQuery::XSLT20), |
| 6232 | parseInfo, sourceLocator: (yyloc)); |
| 6233 | } |
| 6234 | } |
| 6235 | } |
| 6236 | #line 6188 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6237 | break; |
| 6238 | |
| 6239 | case 305: |
| 6240 | #line 3537 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6241 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAncestorOrSelf ;} |
| 6242 | #line 6194 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6243 | break; |
| 6244 | |
| 6245 | case 306: |
| 6246 | #line 3538 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6247 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAncestor ;} |
| 6248 | #line 6200 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6249 | break; |
| 6250 | |
| 6251 | case 307: |
| 6252 | #line 3539 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6253 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAttribute ;} |
| 6254 | #line 6206 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6255 | break; |
| 6256 | |
| 6257 | case 308: |
| 6258 | #line 3540 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6259 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisChild ;} |
| 6260 | #line 6212 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6261 | break; |
| 6262 | |
| 6263 | case 309: |
| 6264 | #line 3541 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6265 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisDescendantOrSelf;} |
| 6266 | #line 6218 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6267 | break; |
| 6268 | |
| 6269 | case 310: |
| 6270 | #line 3542 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6271 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisDescendant ;} |
| 6272 | #line 6224 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6273 | break; |
| 6274 | |
| 6275 | case 311: |
| 6276 | #line 3543 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6277 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisFollowing ;} |
| 6278 | #line 6230 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6279 | break; |
| 6280 | |
| 6281 | case 312: |
| 6282 | #line 3544 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6283 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisPreceding ;} |
| 6284 | #line 6236 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6285 | break; |
| 6286 | |
| 6287 | case 313: |
| 6288 | #line 3545 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6289 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisFollowingSibling;} |
| 6290 | #line 6242 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6291 | break; |
| 6292 | |
| 6293 | case 314: |
| 6294 | #line 3546 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6295 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisPrecedingSibling;} |
| 6296 | #line 6248 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6297 | break; |
| 6298 | |
| 6299 | case 315: |
| 6300 | #line 3547 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6301 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisParent ;} |
| 6302 | #line 6254 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6303 | break; |
| 6304 | |
| 6305 | case 316: |
| 6306 | #line 3548 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6307 | {(yyval.enums.axis) = QXmlNodeModelIndex::AxisSelf ;} |
| 6308 | #line 6260 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6309 | break; |
| 6310 | |
| 6311 | case 317: |
| 6312 | #line 3551 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6313 | { |
| 6314 | parseInfo->nodeTestSource = BuiltinTypes::attribute; |
| 6315 | } |
| 6316 | #line 6268 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6317 | break; |
| 6318 | |
| 6319 | case 318: |
| 6320 | #line 3555 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6321 | { |
| 6322 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20 | QXmlQuery::XmlSchema11IdentityConstraintField), parseInfo, sourceLocator: (yyloc)); |
| 6323 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisAttribute, (yyvsp[0].itemType)), sourceLocator: (yyloc), parseInfo); |
| 6324 | |
| 6325 | parseInfo->restoreNodeTestSource(); |
| 6326 | } |
| 6327 | #line 6279 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6328 | break; |
| 6329 | |
| 6330 | case 319: |
| 6331 | #line 3562 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6332 | { |
| 6333 | ItemType::Ptr nodeTest; |
| 6334 | |
| 6335 | if(parseInfo->isParsingPattern && *(yyvsp[0].itemType) == *BuiltinTypes::node) |
| 6336 | nodeTest = BuiltinTypes::xsltNodeTest; |
| 6337 | else |
| 6338 | nodeTest = (yyvsp[0].itemType); |
| 6339 | |
| 6340 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisChild, nodeTest), sourceLocator: (yyloc), parseInfo); |
| 6341 | } |
| 6342 | #line 6294 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6343 | break; |
| 6344 | |
| 6345 | case 320: |
| 6346 | #line 3573 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6347 | { |
| 6348 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisAttribute, (yyvsp[0].itemType)), sourceLocator: (yyloc), parseInfo); |
| 6349 | } |
| 6350 | #line 6302 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6351 | break; |
| 6352 | |
| 6353 | case 322: |
| 6354 | #line 3580 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6355 | { |
| 6356 | (yyval.expr) = create(expr: new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::node), sourceLocator: (yyloc), parseInfo); |
| 6357 | } |
| 6358 | #line 6310 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6359 | break; |
| 6360 | |
| 6361 | case 324: |
| 6362 | #line 3586 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6363 | { |
| 6364 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6365 | } |
| 6366 | #line 6318 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6367 | break; |
| 6368 | |
| 6369 | case 325: |
| 6370 | #line 3591 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6371 | { |
| 6372 | (yyval.itemType) = QNameTest::create(primaryType: parseInfo->nodeTestSource, qName: (yyvsp[0].qName)); |
| 6373 | } |
| 6374 | #line 6326 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6375 | break; |
| 6376 | |
| 6377 | case 327: |
| 6378 | #line 3597 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6379 | { |
| 6380 | (yyval.itemType) = parseInfo->nodeTestSource; |
| 6381 | } |
| 6382 | #line 6334 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6383 | break; |
| 6384 | |
| 6385 | case 328: |
| 6386 | #line 3601 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6387 | { |
| 6388 | const NamePool::Ptr np(parseInfo->staticContext->namePool()); |
| 6389 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 6390 | |
| 6391 | const QXmlName::NamespaceCode ns(QNameConstructor::namespaceForPrefix(prefix: np->allocatePrefix(prefix: (yyvsp[0].sval)), context: parseInfo->staticContext, r: &ryy)); |
| 6392 | |
| 6393 | (yyval.itemType) = NamespaceNameTest::create(primaryType: parseInfo->nodeTestSource, namespaceURI: ns); |
| 6394 | } |
| 6395 | #line 6347 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6396 | break; |
| 6397 | |
| 6398 | case 329: |
| 6399 | #line 3610 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6400 | { |
| 6401 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6402 | const QXmlName::LocalNameCode c = parseInfo->staticContext->namePool()->allocateLocalName(ln: (yyvsp[0].sval)); |
| 6403 | (yyval.itemType) = LocalNameTest::create(primaryType: parseInfo->nodeTestSource, localName: c); |
| 6404 | } |
| 6405 | #line 6357 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6406 | break; |
| 6407 | |
| 6408 | case 331: |
| 6409 | #line 3618 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6410 | { |
| 6411 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6412 | (yyval.expr) = create(expr: GenericPredicate::create(sourceExpression: (yyvsp[-3].expr), predicateExpression: (yyvsp[-1].expr), context: parseInfo->staticContext, location: fromYYLTYPE(sourceLocator: (yylsp[0]), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 6413 | } |
| 6414 | #line 6366 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6415 | break; |
| 6416 | |
| 6417 | case 339: |
| 6418 | #line 3631 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6419 | { |
| 6420 | (yyval.expr) = create(expr: new ApplyTemplate(parseInfo->modeFor(modeName: (yyvsp[-3].qName)), |
| 6421 | parseInfo->templateWithParams, |
| 6422 | parseInfo->modeFor(modeName: QXmlName(StandardNamespaces::InternalXSLT, |
| 6423 | StandardLocalNames::Default))), |
| 6424 | sourceLocator: (yylsp[-4]), parseInfo); |
| 6425 | parseInfo->templateWithParametersHandled(); |
| 6426 | } |
| 6427 | #line 6379 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6428 | break; |
| 6429 | |
| 6430 | case 341: |
| 6431 | #line 3642 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6432 | { |
| 6433 | (yyval.expr) = create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo); |
| 6434 | } |
| 6435 | #line 6387 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6436 | break; |
| 6437 | |
| 6438 | case 342: |
| 6439 | #line 3647 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6440 | { |
| 6441 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6442 | (yyval.expr) = createNumericLiteral<Double>(in: (yyvsp[0].sval), sl: (yyloc), parseInfo); |
| 6443 | } |
| 6444 | #line 6396 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6445 | break; |
| 6446 | |
| 6447 | case 343: |
| 6448 | #line 3652 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6449 | { |
| 6450 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6451 | (yyval.expr) = createNumericLiteral<Numeric>(in: (yyvsp[0].sval), sl: (yyloc), parseInfo); |
| 6452 | } |
| 6453 | #line 6405 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6454 | break; |
| 6455 | |
| 6456 | case 344: |
| 6457 | #line 3658 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6458 | { |
| 6459 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6460 | (yyval.expr) = resolveVariable(name: (yyvsp[0].qName), sourceLocator: (yyloc), parseInfo, raiseErrorOnUnavailability: false); |
| 6461 | } |
| 6462 | #line 6414 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6463 | break; |
| 6464 | |
| 6465 | case 345: |
| 6466 | #line 3664 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6467 | { |
| 6468 | /* See: http://www.w3.org/TR/xpath20/#id-variables */ |
| 6469 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: QString(), localName: (yyvsp[0].sval)); |
| 6470 | } |
| 6471 | #line 6423 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6472 | break; |
| 6473 | |
| 6474 | case 346: |
| 6475 | #line 3669 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6476 | { |
| 6477 | (yyval.qName) = (yyvsp[0].qName); |
| 6478 | } |
| 6479 | #line 6431 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6480 | break; |
| 6481 | |
| 6482 | case 347: |
| 6483 | #line 3674 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6484 | { |
| 6485 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6486 | (yyval.expr) = (yyvsp[-1].expr); |
| 6487 | } |
| 6488 | #line 6440 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6489 | break; |
| 6490 | |
| 6491 | case 348: |
| 6492 | #line 3679 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6493 | { |
| 6494 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6495 | (yyval.expr) = create(expr: new EmptySequence, sourceLocator: (yyloc), parseInfo); |
| 6496 | } |
| 6497 | #line 6449 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6498 | break; |
| 6499 | |
| 6500 | case 349: |
| 6501 | #line 3685 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6502 | { |
| 6503 | (yyval.expr) = create(expr: new ContextItem(), sourceLocator: (yyloc), parseInfo); |
| 6504 | } |
| 6505 | #line 6457 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6506 | break; |
| 6507 | |
| 6508 | case 350: |
| 6509 | #line 3690 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6510 | { |
| 6511 | (yyval.expr) = (yyvsp[0].expr); |
| 6512 | } |
| 6513 | #line 6465 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6514 | break; |
| 6515 | |
| 6516 | case 351: |
| 6517 | #line 3695 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6518 | { |
| 6519 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 6520 | if(XPathHelper::isReservedNamespace(ns: (yyvsp[-3].qName).namespaceURI()) || (yyvsp[-3].qName).namespaceURI() == StandardNamespaces::InternalXSLT) |
| 6521 | { /* We got a call to a builtin function. */ |
| 6522 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 6523 | |
| 6524 | const Expression::Ptr |
| 6525 | func(parseInfo->staticContext-> |
| 6526 | functionSignatures()->createFunctionCall(name: (yyvsp[-3].qName), arguments: (yyvsp[-1].expressionList), context: parseInfo->staticContext, r: &ryy)); |
| 6527 | |
| 6528 | if(func) |
| 6529 | (yyval.expr) = create(expr: func, sourceLocator: (yyloc), parseInfo); |
| 6530 | else |
| 6531 | { |
| 6532 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "No function with name %1 is available." ) |
| 6533 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-3].qName))), |
| 6534 | errorCode: ReportContext::XPST0017, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6535 | } |
| 6536 | } |
| 6537 | else /* It's a call to a function created with 'declare function'.*/ |
| 6538 | { |
| 6539 | (yyval.expr) = create(expr: new UserFunctionCallsite((yyvsp[-3].qName), (yyvsp[-1].expressionList).count()), sourceLocator: (yyloc), parseInfo); |
| 6540 | |
| 6541 | (yyval.expr)->setOperands((yyvsp[-1].expressionList)); |
| 6542 | parseInfo->userFunctionCallsites.append(t: (yyval.expr)); |
| 6543 | } |
| 6544 | } |
| 6545 | #line 6497 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6546 | break; |
| 6547 | |
| 6548 | case 352: |
| 6549 | #line 3724 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6550 | { |
| 6551 | (yyval.expressionList) = Expression::List(); |
| 6552 | } |
| 6553 | #line 6505 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6554 | break; |
| 6555 | |
| 6556 | case 353: |
| 6557 | #line 3729 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6558 | { |
| 6559 | Expression::List list; |
| 6560 | list.append(t: (yyvsp[0].expr)); |
| 6561 | (yyval.expressionList) = list; |
| 6562 | } |
| 6563 | #line 6515 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6564 | break; |
| 6565 | |
| 6566 | case 355: |
| 6567 | #line 3738 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6568 | { |
| 6569 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc)); |
| 6570 | } |
| 6571 | #line 6523 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6572 | break; |
| 6573 | |
| 6574 | case 360: |
| 6575 | #line 3782 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6576 | { |
| 6577 | (yyval.enums.tokenizerPosition) = parseInfo->tokenizer->commenceScanOnly(); |
| 6578 | parseInfo->scanOnlyStack.push(t: true); |
| 6579 | } |
| 6580 | #line 6532 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6581 | break; |
| 6582 | |
| 6583 | case 361: |
| 6584 | #line 3791 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6585 | { |
| 6586 | ++parseInfo->elementConstructorDepth; |
| 6587 | Expression::List constructors; |
| 6588 | |
| 6589 | parseInfo->resolvers.push(t: parseInfo->staticContext->namespaceBindings()); |
| 6590 | |
| 6591 | /* Fix up attributes and namespace declarations. */ |
| 6592 | const NamespaceResolver::Ptr resolver(new DelegatingNamespaceResolver(parseInfo->staticContext->namespaceBindings())); |
| 6593 | const NamePool::Ptr namePool(parseInfo->staticContext->namePool()); |
| 6594 | const int len = (yyvsp[0].attributeHolders).size(); |
| 6595 | QSet<QXmlName::PrefixCode> usedDeclarations; |
| 6596 | |
| 6597 | /* Whether xmlns="" has been encountered. */ |
| 6598 | bool hasDefaultDeclaration = false; |
| 6599 | |
| 6600 | /* For each attribute & namespace declaration, do: */ |
| 6601 | for(int i = 0; i < len; ++i) |
| 6602 | { |
| 6603 | QString strLocalName; |
| 6604 | QString strPrefix; |
| 6605 | |
| 6606 | XPathHelper::splitQName(qName: (yyvsp[0].attributeHolders).at(i).first, prefix&: strPrefix, localName&: strLocalName); |
| 6607 | const QXmlName::PrefixCode prefix = namePool->allocatePrefix(prefix: strPrefix); |
| 6608 | |
| 6609 | /* This can seem a bit weird. However, this name is ending up in a QXmlName |
| 6610 | * which consider its prefix a... prefix. So, a namespace binding name can in some cases |
| 6611 | * be a local name, but that's just as the initial syntactical construct. */ |
| 6612 | const QXmlName::LocalNameCode localName = namePool->allocatePrefix(prefix: strLocalName); |
| 6613 | |
| 6614 | /* Not that localName is "foo" in "xmlns:foo" and that prefix is "xmlns". */ |
| 6615 | |
| 6616 | if(prefix == StandardPrefixes::xmlns || |
| 6617 | (prefix == StandardPrefixes::empty && localName == StandardPrefixes::xmlns)) |
| 6618 | { |
| 6619 | if(localName == StandardPrefixes::xmlns) |
| 6620 | hasDefaultDeclaration = true; |
| 6621 | |
| 6622 | /* We have a namespace declaration. */ |
| 6623 | |
| 6624 | const Expression::Ptr nsExpr((yyvsp[0].attributeHolders).at(i).second); |
| 6625 | |
| 6626 | const QString strNamespace(nsExpr->is(i: Expression::IDEmptySequence) ? QString() : nsExpr->as<Literal>()->item().stringValue()); |
| 6627 | |
| 6628 | const QXmlName::NamespaceCode ns = namePool->allocateNamespace(uri: strNamespace); |
| 6629 | |
| 6630 | if(ns == StandardNamespaces::empty) |
| 6631 | { |
| 6632 | if(localName != StandardPrefixes::xmlns) |
| 6633 | { |
| 6634 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The namespace URI cannot be the empty string when binding to a prefix, %1." ) |
| 6635 | .arg(a: formatURI(uri: strPrefix)), |
| 6636 | errorCode: ReportContext::XQST0085, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6637 | } |
| 6638 | } |
| 6639 | else if(!AnyURI::isValid(candidate: strNamespace)) |
| 6640 | { |
| 6641 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is an invalid namespace URI." ).arg(a: formatURI(uri: strNamespace)), |
| 6642 | errorCode: ReportContext::XQST0022, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6643 | } |
| 6644 | |
| 6645 | if(prefix == StandardPrefixes::xmlns && localName == StandardPrefixes::xmlns) |
| 6646 | { |
| 6647 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "It is not possible to bind to the prefix %1" ) |
| 6648 | .arg(a: formatKeyword(keyword: "xmlns" )), |
| 6649 | errorCode: ReportContext::XQST0070, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6650 | } |
| 6651 | |
| 6652 | if(ns == StandardNamespaces::xml && localName != StandardPrefixes::xml) |
| 6653 | { |
| 6654 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared)." ) |
| 6655 | .arg(a: formatURI(uri: namePool->stringForNamespace(code: StandardNamespaces::xml))) |
| 6656 | .arg(a: formatKeyword(keyword: "xml" )), |
| 6657 | errorCode: ReportContext::XQST0070, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6658 | } |
| 6659 | |
| 6660 | if(localName == StandardPrefixes::xml && ns != StandardNamespaces::xml) |
| 6661 | { |
| 6662 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared)." ) |
| 6663 | .arg(a: formatKeyword(keyword: "xml" )) |
| 6664 | .arg(a: formatURI(uri: namePool->stringForNamespace(code: StandardNamespaces::xml))), |
| 6665 | errorCode: ReportContext::XQST0070, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6666 | } |
| 6667 | |
| 6668 | QXmlName nb; |
| 6669 | |
| 6670 | if(localName == StandardPrefixes::xmlns) |
| 6671 | nb = QXmlName(ns, StandardLocalNames::empty); |
| 6672 | else |
| 6673 | nb = QXmlName(ns, StandardLocalNames::empty, localName); |
| 6674 | |
| 6675 | if(usedDeclarations.contains(value: nb.prefix())) |
| 6676 | { |
| 6677 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "Two namespace declaration attributes have the same name: %1." ) |
| 6678 | .arg(a: formatKeyword(keyword: namePool->stringForPrefix(code: nb.prefix()))), |
| 6679 | errorCode: ReportContext::XQST0071, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6680 | |
| 6681 | } |
| 6682 | else |
| 6683 | usedDeclarations.insert(value: nb.prefix()); |
| 6684 | |
| 6685 | /* If the user has bound the XML namespace correctly, we in either |
| 6686 | * case don't want to output it. |
| 6687 | * |
| 6688 | * We only have to check the namespace parts since the above checks has ensured |
| 6689 | * consistency in the prefix parts. */ |
| 6690 | if(ns != StandardNamespaces::xml) |
| 6691 | { |
| 6692 | /* We don't want default namespace declarations when the |
| 6693 | * default namespace already is empty. */ |
| 6694 | if(!(ns == StandardNamespaces::empty && |
| 6695 | localName == StandardNamespaces::xmlns && |
| 6696 | resolver->lookupNamespaceURI(prefix: StandardPrefixes::empty) == StandardNamespaces::empty)) |
| 6697 | { |
| 6698 | constructors.append(t: create(expr: new NamespaceConstructor(nb), sourceLocator: (yyloc), parseInfo)); |
| 6699 | resolver->addBinding(nb); |
| 6700 | } |
| 6701 | } |
| 6702 | } |
| 6703 | } |
| 6704 | |
| 6705 | if(parseInfo->elementConstructorDepth == 1 && !hasDefaultDeclaration) |
| 6706 | { |
| 6707 | /* TODO But mostly this isn't needed, since the default element |
| 6708 | * namespace is empty? How does this at all work? */ |
| 6709 | const QXmlName def(resolver->lookupNamespaceURI(prefix: StandardPrefixes::empty), StandardLocalNames::empty); |
| 6710 | constructors.append(t: create(expr: new NamespaceConstructor(def), sourceLocator: (yyloc), parseInfo)); |
| 6711 | } |
| 6712 | |
| 6713 | parseInfo->staticContext->setNamespaceBindings(resolver); |
| 6714 | (yyval.expressionList) = constructors; |
| 6715 | |
| 6716 | /* Resolve the name of the element, now that the namespace attributes are read. */ |
| 6717 | { |
| 6718 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 6719 | |
| 6720 | const QXmlName ele = QNameConstructor::expandQName<StaticContext::Ptr, |
| 6721 | ReportContext::XPST0081, |
| 6722 | ReportContext::XPST0081>(lexicalQName: (yyvsp[-2].sval), context: parseInfo->staticContext, nsResolver: resolver, r: &ryy); |
| 6723 | parseInfo->tagStack.push(t: ele); |
| 6724 | } |
| 6725 | |
| 6726 | parseInfo->tokenizer->resumeTokenizationFrom(position: (yyvsp[-1].enums.tokenizerPosition)); |
| 6727 | } |
| 6728 | #line 6680 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6729 | break; |
| 6730 | |
| 6731 | case 362: |
| 6732 | #line 3937 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6733 | { |
| 6734 | /* We add the content constructor after the attribute constructors. This might result |
| 6735 | * in nested ExpressionSequences, but it will be optimized away later on. */ |
| 6736 | |
| 6737 | Expression::List attributes((yyvsp[-3].expressionList)); |
| 6738 | const NamePool::Ptr namePool(parseInfo->staticContext->namePool()); |
| 6739 | const int len = (yyvsp[-1].attributeHolders).size(); |
| 6740 | QSet<QXmlName> declaredAttributes; |
| 6741 | declaredAttributes.reserve(asize: len); |
| 6742 | |
| 6743 | /* For each namespace, resolve its name(now that we have resolved the namespace declarations) and |
| 6744 | * turn it into an attribute constructor. */ |
| 6745 | for(int i = 0; i < len; ++i) |
| 6746 | { |
| 6747 | QString strLocalName; |
| 6748 | QString strPrefix; |
| 6749 | |
| 6750 | XPathHelper::splitQName(qName: (yyvsp[-1].attributeHolders).at(i).first, prefix&: strPrefix, localName&: strLocalName); |
| 6751 | const QXmlName::PrefixCode prefix = namePool->allocatePrefix(prefix: strPrefix); |
| 6752 | const QXmlName::LocalNameCode localName = namePool->allocateLocalName(ln: strLocalName); |
| 6753 | |
| 6754 | if(prefix == StandardPrefixes::xmlns || |
| 6755 | (prefix == StandardPrefixes::empty && localName == StandardLocalNames::xmlns)) |
| 6756 | { |
| 6757 | const Expression::ID id = (yyvsp[-1].attributeHolders).at(i).second->id(); |
| 6758 | |
| 6759 | if(id == Expression::IDStringValue || id == Expression::IDEmptySequence) |
| 6760 | { |
| 6761 | /* It's a namespace declaration, and we've already handled those above. */ |
| 6762 | continue; |
| 6763 | } |
| 6764 | else |
| 6765 | { |
| 6766 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The namespace URI must be a constant and cannot " |
| 6767 | "use enclosed expressions." ), |
| 6768 | errorCode: ReportContext::XQST0022, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6769 | } |
| 6770 | |
| 6771 | } |
| 6772 | else |
| 6773 | { |
| 6774 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 6775 | const QXmlName att = QNameConstructor::expandQName<StaticContext::Ptr, |
| 6776 | ReportContext::XPST0081, |
| 6777 | ReportContext::XPST0081>(lexicalQName: (yyvsp[-1].attributeHolders).at(i).first, context: parseInfo->staticContext, |
| 6778 | nsResolver: parseInfo->staticContext->namespaceBindings(), |
| 6779 | r: &ryy, asForAttribute: true); |
| 6780 | if(declaredAttributes.contains(value: att)) |
| 6781 | { |
| 6782 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "An attribute with name %1 has already appeared on this element." ) |
| 6783 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: att)), |
| 6784 | errorCode: ReportContext::XQST0040, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6785 | |
| 6786 | } |
| 6787 | else |
| 6788 | declaredAttributes.insert(value: att); |
| 6789 | |
| 6790 | /* wrapLiteral() needs the SourceLocationReflection of the AttributeConstructor, but |
| 6791 | * it's unknown inside the arguments to its constructor. Hence we have to do this workaround of setting |
| 6792 | * it twice. |
| 6793 | * |
| 6794 | * The AttributeConstructor's arguments are just dummies. */ |
| 6795 | const Expression::Ptr ctor(create(expr: new AttributeConstructor((yyvsp[-1].attributeHolders).at(i).second, (yyvsp[-1].attributeHolders).at(i).second), sourceLocator: (yyloc), parseInfo)); |
| 6796 | |
| 6797 | Expression::List ops; |
| 6798 | ops.append(t: wrapLiteral(item: toItem(atomicValue: QNameValue::fromValue(np: namePool, name: att)), context: parseInfo->staticContext, r: ctor.data())); |
| 6799 | ops.append(t: (yyvsp[-1].attributeHolders).at(i).second); |
| 6800 | ctor->setOperands(ops); |
| 6801 | |
| 6802 | attributes.append(t: ctor); |
| 6803 | } |
| 6804 | } |
| 6805 | |
| 6806 | Expression::Ptr contentOp; |
| 6807 | |
| 6808 | if(attributes.isEmpty()) |
| 6809 | contentOp = (yyvsp[0].expr); |
| 6810 | else |
| 6811 | { |
| 6812 | attributes.append(t: (yyvsp[0].expr)); |
| 6813 | contentOp = create(expr: new ExpressionSequence(attributes), sourceLocator: (yyloc), parseInfo); |
| 6814 | } |
| 6815 | |
| 6816 | const Expression::Ptr name(create(expr: new Literal(toItem(atomicValue: QNameValue::fromValue(np: parseInfo->staticContext->namePool(), name: parseInfo->tagStack.top()))), sourceLocator: (yyloc), parseInfo)); |
| 6817 | (yyval.expr) = create(expr: new ElementConstructor(name, contentOp, parseInfo->isXSLT()), sourceLocator: (yyloc), parseInfo); |
| 6818 | |
| 6819 | /* Restore the old context. We don't want the namespaces |
| 6820 | * to be in-scope for expressions appearing after the |
| 6821 | * element they appeared on. */ |
| 6822 | parseInfo->staticContext->setNamespaceBindings(parseInfo->resolvers.pop()); |
| 6823 | parseInfo->tagStack.pop(); |
| 6824 | |
| 6825 | --parseInfo->elementConstructorDepth; |
| 6826 | } |
| 6827 | #line 6779 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6828 | break; |
| 6829 | |
| 6830 | case 363: |
| 6831 | #line 4033 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6832 | { |
| 6833 | (yyval.expr) = create(expr: new EmptySequence(), sourceLocator: (yyloc), parseInfo); |
| 6834 | } |
| 6835 | #line 6787 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6836 | break; |
| 6837 | |
| 6838 | case 364: |
| 6839 | #line 4037 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6840 | { |
| 6841 | if(!(yyvsp[-1].qName).isLexicallyEqual(other: parseInfo->tagStack.top())) |
| 6842 | { |
| 6843 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "A direct element constructor is not " |
| 6844 | "well-formed. %1 is ended with %2." ) |
| 6845 | .arg(args: formatKeyword(keyword: parseInfo->staticContext->namePool()->toLexical(qName: parseInfo->tagStack.top())), |
| 6846 | args: formatKeyword(keyword: parseInfo->staticContext->namePool()->toLexical(qName: (yyvsp[-1].qName)))), |
| 6847 | errorCode: ReportContext::XPST0003, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 6848 | } |
| 6849 | |
| 6850 | if((yyvsp[-3].expressionList).isEmpty()) |
| 6851 | (yyval.expr) = create(expr: new EmptySequence(), sourceLocator: (yyloc), parseInfo); |
| 6852 | else if((yyvsp[-3].expressionList).size() == 1) |
| 6853 | (yyval.expr) = (yyvsp[-3].expressionList).first(); |
| 6854 | else |
| 6855 | (yyval.expr) = create(expr: new ExpressionSequence((yyvsp[-3].expressionList)), sourceLocator: (yyloc), parseInfo); |
| 6856 | } |
| 6857 | #line 6809 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6858 | break; |
| 6859 | |
| 6860 | case 365: |
| 6861 | #line 4056 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6862 | { |
| 6863 | (yyval.attributeHolders) = AttributeHolderVector(); |
| 6864 | } |
| 6865 | #line 6817 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6866 | break; |
| 6867 | |
| 6868 | case 366: |
| 6869 | #line 4060 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6870 | { |
| 6871 | (yyvsp[-1].attributeHolders).append(t: (yyvsp[0].attributeHolder)); |
| 6872 | (yyval.attributeHolders) = (yyvsp[-1].attributeHolders); |
| 6873 | } |
| 6874 | #line 6826 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6875 | break; |
| 6876 | |
| 6877 | case 367: |
| 6878 | #line 4066 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6879 | { |
| 6880 | (yyval.attributeHolder) = qMakePair(x: (yyvsp[-2].sval), y: (yyvsp[0].expr)); |
| 6881 | } |
| 6882 | #line 6834 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6883 | break; |
| 6884 | |
| 6885 | case 368: |
| 6886 | #line 4071 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6887 | { |
| 6888 | (yyval.expr) = createDirAttributeValue(content: (yyvsp[-1].expressionList), parseInfo, sourceLocator: (yyloc)); |
| 6889 | } |
| 6890 | #line 6842 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6891 | break; |
| 6892 | |
| 6893 | case 369: |
| 6894 | #line 4076 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6895 | { |
| 6896 | (yyval.expr) = createDirAttributeValue(content: (yyvsp[-1].expressionList), parseInfo, sourceLocator: (yyloc)); |
| 6897 | } |
| 6898 | #line 6850 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6899 | break; |
| 6900 | |
| 6901 | case 370: |
| 6902 | #line 4081 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6903 | { |
| 6904 | (yyval.expressionList) = Expression::List(); |
| 6905 | } |
| 6906 | #line 6858 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6907 | break; |
| 6908 | |
| 6909 | case 371: |
| 6910 | #line 4085 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6911 | { |
| 6912 | Expression::Ptr content((yyvsp[-1].expr)); |
| 6913 | |
| 6914 | if(parseInfo->isBackwardsCompat.top()) |
| 6915 | content = create(expr: GenericPredicate::createFirstItem(sourceExpression: content), sourceLocator: (yyloc), parseInfo); |
| 6916 | |
| 6917 | (yyvsp[0].expressionList).prepend(t: createSimpleContent(source: content, sourceLocator: (yyloc), parseInfo)); |
| 6918 | (yyval.expressionList) = (yyvsp[0].expressionList); |
| 6919 | } |
| 6920 | #line 6872 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6921 | break; |
| 6922 | |
| 6923 | case 372: |
| 6924 | #line 4095 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6925 | { |
| 6926 | (yyvsp[0].expressionList).prepend(t: create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[-1].sval))), sourceLocator: (yyloc), parseInfo)); |
| 6927 | (yyval.expressionList) = (yyvsp[0].expressionList); |
| 6928 | } |
| 6929 | #line 6881 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6930 | break; |
| 6931 | |
| 6932 | case 373: |
| 6933 | #line 4101 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6934 | { |
| 6935 | (yyval.expressionList) = Expression::List(); |
| 6936 | parseInfo->isPreviousEnclosedExpr = false; |
| 6937 | } |
| 6938 | #line 6890 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6939 | break; |
| 6940 | |
| 6941 | case 374: |
| 6942 | #line 4106 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6943 | { |
| 6944 | (yyvsp[-1].expressionList).append(t: (yyvsp[0].expr)); |
| 6945 | (yyval.expressionList) = (yyvsp[-1].expressionList); |
| 6946 | parseInfo->isPreviousEnclosedExpr = false; |
| 6947 | } |
| 6948 | #line 6900 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6949 | break; |
| 6950 | |
| 6951 | case 375: |
| 6952 | #line 4112 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6953 | { |
| 6954 | if(parseInfo->staticContext->boundarySpacePolicy() == StaticContext::BSPStrip && |
| 6955 | XPathHelper::isWhitespaceOnly(string: (yyvsp[0].sval))) |
| 6956 | { |
| 6957 | (yyval.expressionList) = (yyvsp[-1].expressionList); |
| 6958 | } |
| 6959 | else |
| 6960 | { |
| 6961 | (yyvsp[-1].expressionList).append(t: create(expr: new TextNodeConstructor(create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo)); |
| 6962 | (yyval.expressionList) = (yyvsp[-1].expressionList); |
| 6963 | parseInfo->isPreviousEnclosedExpr = false; |
| 6964 | } |
| 6965 | } |
| 6966 | #line 6918 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6967 | break; |
| 6968 | |
| 6969 | case 376: |
| 6970 | #line 4126 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6971 | { |
| 6972 | (yyvsp[-1].expressionList).append(t: create(expr: new TextNodeConstructor(create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo)); |
| 6973 | (yyval.expressionList) = (yyvsp[-1].expressionList); |
| 6974 | parseInfo->isPreviousEnclosedExpr = false; |
| 6975 | } |
| 6976 | #line 6928 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6977 | break; |
| 6978 | |
| 6979 | case 377: |
| 6980 | #line 4132 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 6981 | { |
| 6982 | /* We insert a text node constructor that send an empty text node between |
| 6983 | * the two enclosed expressions, in order to ensure that no space is inserted. |
| 6984 | * |
| 6985 | * However, we only do it when we have no node constructors. */ |
| 6986 | if(parseInfo->isPreviousEnclosedExpr && |
| 6987 | BuiltinTypes::xsAnyAtomicType->xdtTypeMatches(other: (yyvsp[0].expr)->staticType()->itemType()) && |
| 6988 | BuiltinTypes::xsAnyAtomicType->xdtTypeMatches(other: (yyvsp[-1].expressionList).last()->staticType()->itemType())) |
| 6989 | (yyvsp[-1].expressionList).append(t: create(expr: new TextNodeConstructor(create(expr: new Literal(AtomicString::fromValue(value: QString())), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo)); |
| 6990 | else |
| 6991 | parseInfo->isPreviousEnclosedExpr = true; |
| 6992 | |
| 6993 | (yyvsp[-1].expressionList).append(t: createCopyOf(operand: (yyvsp[0].expr), parseInfo, sl: (yyloc))); |
| 6994 | (yyval.expressionList) = (yyvsp[-1].expressionList); |
| 6995 | } |
| 6996 | #line 6948 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 6997 | break; |
| 6998 | |
| 6999 | case 378: |
| 7000 | #line 4149 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7001 | { |
| 7002 | (yyval.expr) = create(expr: new CommentConstructor(create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7003 | } |
| 7004 | #line 6956 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7005 | break; |
| 7006 | |
| 7007 | case 379: |
| 7008 | #line 4154 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7009 | { |
| 7010 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 7011 | NCNameConstructor::validateTargetName<StaticContext::Ptr, |
| 7012 | ReportContext::XPST0003, |
| 7013 | ReportContext::XPST0003>(lexicalTarget: (yyvsp[-1].sval), |
| 7014 | context: parseInfo->staticContext, r: &ryy); |
| 7015 | |
| 7016 | (yyval.expr) = create(expr: new ProcessingInstructionConstructor( |
| 7017 | create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[-1].sval))), sourceLocator: (yyloc), parseInfo), |
| 7018 | create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7019 | } |
| 7020 | #line 6972 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7021 | break; |
| 7022 | |
| 7023 | case 387: |
| 7024 | #line 4175 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7025 | { |
| 7026 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-1].enums.Bool)); |
| 7027 | |
| 7028 | (yyval.expr) = create(expr: new DocumentConstructor((yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 7029 | } |
| 7030 | #line 6982 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7031 | break; |
| 7032 | |
| 7033 | case 388: |
| 7034 | #line 4182 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7035 | { |
| 7036 | /* This value is incremented before the action below is executed. */ |
| 7037 | ++parseInfo->elementConstructorDepth; |
| 7038 | } |
| 7039 | #line 6991 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7040 | break; |
| 7041 | |
| 7042 | case 389: |
| 7043 | #line 4187 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7044 | { |
| 7045 | Q_ASSERT(5); |
| 7046 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-3].enums.Bool)); |
| 7047 | |
| 7048 | Expression::Ptr effExpr; |
| 7049 | |
| 7050 | if((yyvsp[0].expr)) |
| 7051 | effExpr = createCopyOf(operand: (yyvsp[0].expr), parseInfo, sl: (yyloc)); |
| 7052 | else |
| 7053 | effExpr = create(expr: new EmptySequence(), sourceLocator: (yyloc), parseInfo); |
| 7054 | |
| 7055 | const QXmlName::NamespaceCode ns = parseInfo->resolvers.top()->lookupNamespaceURI(prefix: StandardPrefixes::empty); |
| 7056 | |
| 7057 | /* Ensure the default namespace gets counted as an in-scope binding, if such a one exists. If we're |
| 7058 | * a child of another constructor, it has already been done. */ |
| 7059 | if(parseInfo->elementConstructorDepth == 1 && ns != StandardNamespaces::empty) |
| 7060 | { |
| 7061 | Expression::List exprList; |
| 7062 | |
| 7063 | /* We append the namespace constructor before the body, in order to |
| 7064 | * comply with QAbstractXmlPushHandler's contract. */ |
| 7065 | const QXmlName def(parseInfo->resolvers.top()->lookupNamespaceURI(prefix: StandardPrefixes::empty), StandardLocalNames::empty); |
| 7066 | exprList.append(t: create(expr: new NamespaceConstructor(def), sourceLocator: (yyloc), parseInfo)); |
| 7067 | |
| 7068 | exprList.append(t: effExpr); |
| 7069 | |
| 7070 | effExpr = create(expr: new ExpressionSequence(exprList), sourceLocator: (yyloc), parseInfo); |
| 7071 | } |
| 7072 | |
| 7073 | --parseInfo->elementConstructorDepth; |
| 7074 | (yyval.expr) = create(expr: new ElementConstructor((yyvsp[-2].expr), effExpr, parseInfo->isXSLT()), sourceLocator: (yyloc), parseInfo); |
| 7075 | } |
| 7076 | #line 7028 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7077 | break; |
| 7078 | |
| 7079 | case 390: |
| 7080 | #line 4221 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7081 | { |
| 7082 | (yyval.enums.Bool) = false; |
| 7083 | } |
| 7084 | #line 7036 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7085 | break; |
| 7086 | |
| 7087 | case 391: |
| 7088 | #line 4225 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7089 | { |
| 7090 | (yyval.enums.Bool) = true; |
| 7091 | } |
| 7092 | #line 7044 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7093 | break; |
| 7094 | |
| 7095 | case 392: |
| 7096 | #line 4233 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7097 | { |
| 7098 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-2].enums.Bool)); |
| 7099 | |
| 7100 | const Expression::Ptr name(create(expr: new AttributeNameValidator((yyvsp[-1].expr)), sourceLocator: (yyloc), parseInfo)); |
| 7101 | |
| 7102 | if((yyvsp[0].expr)) |
| 7103 | (yyval.expr) = create(expr: new AttributeConstructor(name, createSimpleContent(source: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7104 | else |
| 7105 | (yyval.expr) = create(expr: new AttributeConstructor(name, create(expr: new EmptySequence(), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7106 | } |
| 7107 | #line 7059 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7108 | break; |
| 7109 | |
| 7110 | case 393: |
| 7111 | #line 4245 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7112 | { |
| 7113 | (yyval.expr) = create(expr: new TextNodeConstructor(createSimpleContent(source: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7114 | } |
| 7115 | #line 7067 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7116 | break; |
| 7117 | |
| 7118 | case 394: |
| 7119 | #line 4250 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7120 | { |
| 7121 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-1].enums.Bool)); |
| 7122 | |
| 7123 | (yyval.expr) = create(expr: new CommentConstructor(createSimpleContent(source: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7124 | } |
| 7125 | #line 7077 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7126 | break; |
| 7127 | |
| 7128 | case 395: |
| 7129 | #line 4257 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7130 | { |
| 7131 | allowedIn(allowedLanguages: QXmlQuery::XQuery10, parseInfo, sourceLocator: (yyloc), isInternal: (yyvsp[-1].expr)); |
| 7132 | |
| 7133 | if((yyvsp[0].expr)) |
| 7134 | { |
| 7135 | (yyval.expr) = create(expr: new ProcessingInstructionConstructor((yyvsp[-1].expr), createSimpleContent(source: (yyvsp[0].expr), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7136 | } |
| 7137 | else |
| 7138 | (yyval.expr) = create(expr: new ProcessingInstructionConstructor((yyvsp[-1].expr), create(expr: new EmptySequence(), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7139 | } |
| 7140 | #line 7092 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7141 | break; |
| 7142 | |
| 7143 | case 396: |
| 7144 | #line 4268 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7145 | { |
| 7146 | parseInfo->nodeTestSource = BuiltinTypes::attribute; |
| 7147 | } |
| 7148 | #line 7100 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7149 | break; |
| 7150 | |
| 7151 | case 397: |
| 7152 | #line 4272 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7153 | { |
| 7154 | parseInfo->restoreNodeTestSource(); |
| 7155 | } |
| 7156 | #line 7108 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7157 | break; |
| 7158 | |
| 7159 | case 398: |
| 7160 | #line 4275 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7161 | { |
| 7162 | (yyval.expr) = create(expr: new Literal(toItem(atomicValue: QNameValue::fromValue(np: parseInfo->staticContext->namePool(), name: (yyvsp[-1].qName)))), sourceLocator: (yyloc), parseInfo); |
| 7163 | } |
| 7164 | #line 7116 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7165 | break; |
| 7166 | |
| 7167 | case 400: |
| 7168 | #line 4281 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7169 | { |
| 7170 | (yyval.expr) = create(expr: new Literal(toItem(atomicValue: QNameValue::fromValue(np: parseInfo->staticContext->namePool(), name: (yyvsp[0].qName)))), sourceLocator: (yyloc), parseInfo); |
| 7171 | } |
| 7172 | #line 7124 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7173 | break; |
| 7174 | |
| 7175 | case 402: |
| 7176 | #line 4287 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7177 | { |
| 7178 | if(BuiltinTypes::xsQName->xdtTypeMatches(other: (yyvsp[0].expr)->staticType()->itemType())) |
| 7179 | (yyval.expr) = (yyvsp[0].expr); |
| 7180 | else |
| 7181 | { |
| 7182 | (yyval.expr) = create(expr: new QNameConstructor((yyvsp[0].expr), |
| 7183 | parseInfo->staticContext->namespaceBindings()), |
| 7184 | sourceLocator: (yyloc), parseInfo); |
| 7185 | } |
| 7186 | } |
| 7187 | #line 7139 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7188 | break; |
| 7189 | |
| 7190 | case 403: |
| 7191 | #line 4302 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7192 | { |
| 7193 | (yyval.expr) = create(expr: new NCNameConstructor(create(expr: new Literal(AtomicString::fromValue(value: (yyvsp[0].sval))), sourceLocator: (yyloc), parseInfo)), sourceLocator: (yyloc), parseInfo); |
| 7194 | } |
| 7195 | #line 7147 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7196 | break; |
| 7197 | |
| 7198 | case 404: |
| 7199 | #line 4306 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7200 | { |
| 7201 | (yyval.expr) = create(expr: new NCNameConstructor((yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 7202 | } |
| 7203 | #line 7155 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7204 | break; |
| 7205 | |
| 7206 | case 405: |
| 7207 | #line 4315 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7208 | { |
| 7209 | (yyval.expr) = create(expr: new ComputedNamespaceConstructor((yyvsp[-1].expr), (yyvsp[0].expr)), sourceLocator: (yyloc), parseInfo); |
| 7210 | } |
| 7211 | #line 7163 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7212 | break; |
| 7213 | |
| 7214 | case 406: |
| 7215 | #line 4320 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7216 | { |
| 7217 | (yyval.sequenceType) = makeGenericSequenceType(itemType: (yyvsp[0].itemType), cardinality: Cardinality::exactlyOne()); |
| 7218 | } |
| 7219 | #line 7171 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7220 | break; |
| 7221 | |
| 7222 | case 407: |
| 7223 | #line 4324 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7224 | { |
| 7225 | (yyval.sequenceType) = makeGenericSequenceType(itemType: (yyvsp[-1].itemType), cardinality: Cardinality::zeroOrOne()); |
| 7226 | } |
| 7227 | #line 7179 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7228 | break; |
| 7229 | |
| 7230 | case 408: |
| 7231 | #line 4329 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7232 | { |
| 7233 | (yyval.sequenceType) = CommonSequenceTypes::ZeroOrMoreItems; |
| 7234 | } |
| 7235 | #line 7187 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7236 | break; |
| 7237 | |
| 7238 | case 409: |
| 7239 | #line 4333 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7240 | { |
| 7241 | (yyval.sequenceType) = (yyvsp[0].sequenceType); |
| 7242 | } |
| 7243 | #line 7195 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7244 | break; |
| 7245 | |
| 7246 | case 410: |
| 7247 | #line 4338 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7248 | { |
| 7249 | (yyval.sequenceType) = makeGenericSequenceType(itemType: (yyvsp[-1].itemType), cardinality: (yyvsp[0].cardinality)); |
| 7250 | } |
| 7251 | #line 7203 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7252 | break; |
| 7253 | |
| 7254 | case 411: |
| 7255 | #line 4343 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7256 | { |
| 7257 | (yyval.sequenceType) = CommonSequenceTypes::Empty; |
| 7258 | } |
| 7259 | #line 7211 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7260 | break; |
| 7261 | |
| 7262 | case 412: |
| 7263 | #line 4347 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7264 | {(yyval.cardinality) = Cardinality::exactlyOne();} |
| 7265 | #line 7217 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7266 | break; |
| 7267 | |
| 7268 | case 413: |
| 7269 | #line 4348 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7270 | {(yyval.cardinality) = Cardinality::oneOrMore();} |
| 7271 | #line 7223 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7272 | break; |
| 7273 | |
| 7274 | case 414: |
| 7275 | #line 4349 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7276 | {(yyval.cardinality) = Cardinality::zeroOrMore();} |
| 7277 | #line 7229 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7278 | break; |
| 7279 | |
| 7280 | case 415: |
| 7281 | #line 4350 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7282 | {(yyval.cardinality) = Cardinality::zeroOrOne();} |
| 7283 | #line 7235 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7284 | break; |
| 7285 | |
| 7286 | case 419: |
| 7287 | #line 4356 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7288 | { |
| 7289 | (yyval.itemType) = BuiltinTypes::item; |
| 7290 | } |
| 7291 | #line 7243 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7292 | break; |
| 7293 | |
| 7294 | case 420: |
| 7295 | #line 4361 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7296 | { |
| 7297 | const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType(name: (yyvsp[0].qName))); |
| 7298 | |
| 7299 | if(!t) |
| 7300 | { |
| 7301 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The name %1 does not refer to any schema type." ) |
| 7302 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[0].qName))), errorCode: ReportContext::XPST0051, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7303 | } |
| 7304 | else if(BuiltinTypes::xsAnyAtomicType->wxsTypeMatches(other: t)) |
| 7305 | (yyval.itemType) = AtomicType::Ptr(t); |
| 7306 | else |
| 7307 | { |
| 7308 | /* Try to give an intelligent message. */ |
| 7309 | if(t->isComplexType()) |
| 7310 | { |
| 7311 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is an complex type. Casting to complex " |
| 7312 | "types is not possible. However, casting " |
| 7313 | "to atomic types such as %2 works." ) |
| 7314 | .arg(a: formatType(np: parseInfo->staticContext->namePool(), type: t)) |
| 7315 | .arg(a: formatType(np: parseInfo->staticContext->namePool(), type: BuiltinTypes::xsInteger)), |
| 7316 | errorCode: ReportContext::XPST0051, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7317 | } |
| 7318 | else |
| 7319 | { |
| 7320 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is not an atomic type. Casting " |
| 7321 | "is only possible to atomic types." ) |
| 7322 | .arg(a: formatType(np: parseInfo->staticContext->namePool(), type: t)), |
| 7323 | errorCode: ReportContext::XPST0051, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7324 | } |
| 7325 | } |
| 7326 | } |
| 7327 | #line 7279 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7328 | break; |
| 7329 | |
| 7330 | case 428: |
| 7331 | #line 4405 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7332 | { |
| 7333 | (yyval.itemType) = BuiltinTypes::node; |
| 7334 | } |
| 7335 | #line 7287 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7336 | break; |
| 7337 | |
| 7338 | case 429: |
| 7339 | #line 4410 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7340 | { |
| 7341 | (yyval.itemType) = BuiltinTypes::document; |
| 7342 | } |
| 7343 | #line 7295 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7344 | break; |
| 7345 | |
| 7346 | case 430: |
| 7347 | #line 4415 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7348 | { |
| 7349 | // TODO support for document element testing |
| 7350 | (yyval.itemType) = BuiltinTypes::document; |
| 7351 | } |
| 7352 | #line 7304 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7353 | break; |
| 7354 | |
| 7355 | case 433: |
| 7356 | #line 4424 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7357 | { |
| 7358 | (yyval.itemType) = BuiltinTypes::text; |
| 7359 | } |
| 7360 | #line 7312 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7361 | break; |
| 7362 | |
| 7363 | case 434: |
| 7364 | #line 4429 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7365 | { |
| 7366 | (yyval.itemType) = BuiltinTypes::comment; |
| 7367 | } |
| 7368 | #line 7320 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7369 | break; |
| 7370 | |
| 7371 | case 435: |
| 7372 | #line 4434 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7373 | { |
| 7374 | (yyval.itemType) = BuiltinTypes::pi; |
| 7375 | } |
| 7376 | #line 7328 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7377 | break; |
| 7378 | |
| 7379 | case 436: |
| 7380 | #line 4439 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7381 | { |
| 7382 | (yyval.itemType) = LocalNameTest::create(primaryType: BuiltinTypes::pi, localName: parseInfo->staticContext->namePool()->allocateLocalName(ln: (yyvsp[-1].sval))); |
| 7383 | } |
| 7384 | #line 7336 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7385 | break; |
| 7386 | |
| 7387 | case 437: |
| 7388 | #line 4444 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7389 | { |
| 7390 | if(QXmlUtils::isNCName(ncName: (yyvsp[-1].sval))) |
| 7391 | { |
| 7392 | (yyval.itemType) = LocalNameTest::create(primaryType: BuiltinTypes::pi, localName: parseInfo->staticContext->namePool()->allocateLocalName(ln: (yyvsp[-1].sval))); |
| 7393 | } |
| 7394 | else |
| 7395 | { |
| 7396 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is not a valid name for a " |
| 7397 | "processing-instruction." ) |
| 7398 | .arg(a: formatKeyword(keyword: (yyvsp[-1].sval))), |
| 7399 | errorCode: ReportContext::XPTY0004, |
| 7400 | sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7401 | } |
| 7402 | } |
| 7403 | #line 7355 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7404 | break; |
| 7405 | |
| 7406 | case 440: |
| 7407 | #line 4463 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7408 | { |
| 7409 | (yyval.itemType) = BuiltinTypes::attribute; |
| 7410 | } |
| 7411 | #line 7363 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7412 | break; |
| 7413 | |
| 7414 | case 441: |
| 7415 | #line 4468 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7416 | { |
| 7417 | (yyval.itemType) = BuiltinTypes::attribute; |
| 7418 | } |
| 7419 | #line 7371 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7420 | break; |
| 7421 | |
| 7422 | case 442: |
| 7423 | #line 4473 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7424 | { |
| 7425 | (yyval.itemType) = QNameTest::create(primaryType: BuiltinTypes::attribute, qName: (yyvsp[-1].qName)); |
| 7426 | } |
| 7427 | #line 7379 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7428 | break; |
| 7429 | |
| 7430 | case 443: |
| 7431 | #line 4477 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7432 | { |
| 7433 | const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType(name: (yyvsp[-1].qName))); |
| 7434 | |
| 7435 | if(t) |
| 7436 | (yyval.itemType) = BuiltinTypes::attribute; |
| 7437 | else |
| 7438 | { |
| 7439 | parseInfo->staticContext->error(message: unknownType().arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-1].qName))), |
| 7440 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7441 | } |
| 7442 | } |
| 7443 | #line 7395 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7444 | break; |
| 7445 | |
| 7446 | case 444: |
| 7447 | #line 4489 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7448 | { |
| 7449 | const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType(name: (yyvsp[-1].qName))); |
| 7450 | |
| 7451 | if(t) |
| 7452 | (yyval.itemType) = BuiltinTypes::attribute; |
| 7453 | else |
| 7454 | { |
| 7455 | parseInfo->staticContext->error(message: unknownType().arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-1].qName))), |
| 7456 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7457 | } |
| 7458 | } |
| 7459 | #line 7411 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7460 | break; |
| 7461 | |
| 7462 | case 445: |
| 7463 | #line 4502 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7464 | { |
| 7465 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is not in the in-scope attribute " |
| 7466 | "declarations. Note that the schema import " |
| 7467 | "feature is not supported." ) |
| 7468 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-1].qName))), |
| 7469 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7470 | (yyval.itemType).reset(); |
| 7471 | } |
| 7472 | #line 7424 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7473 | break; |
| 7474 | |
| 7475 | case 446: |
| 7476 | #line 4512 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7477 | { |
| 7478 | (yyval.itemType) = BuiltinTypes::element; |
| 7479 | } |
| 7480 | #line 7432 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7481 | break; |
| 7482 | |
| 7483 | case 447: |
| 7484 | #line 4517 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7485 | { |
| 7486 | (yyval.itemType) = BuiltinTypes::element; |
| 7487 | } |
| 7488 | #line 7440 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7489 | break; |
| 7490 | |
| 7491 | case 448: |
| 7492 | #line 4522 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7493 | { |
| 7494 | (yyval.itemType) = QNameTest::create(primaryType: BuiltinTypes::element, qName: (yyvsp[-1].qName)); |
| 7495 | } |
| 7496 | #line 7448 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7497 | break; |
| 7498 | |
| 7499 | case 449: |
| 7500 | #line 4527 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7501 | { |
| 7502 | const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType(name: (yyvsp[-2].qName))); |
| 7503 | |
| 7504 | if(t) |
| 7505 | (yyval.itemType) = BuiltinTypes::element; |
| 7506 | else |
| 7507 | { |
| 7508 | parseInfo->staticContext->error(message: unknownType() |
| 7509 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-2].qName))), |
| 7510 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7511 | } |
| 7512 | } |
| 7513 | #line 7465 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7514 | break; |
| 7515 | |
| 7516 | case 450: |
| 7517 | #line 4541 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7518 | { |
| 7519 | const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType(name: (yyvsp[-2].qName))); |
| 7520 | |
| 7521 | if(t) |
| 7522 | (yyval.itemType) = BuiltinTypes::element; |
| 7523 | else |
| 7524 | { |
| 7525 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is an unknown schema type." ) |
| 7526 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-2].qName))), |
| 7527 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7528 | } |
| 7529 | } |
| 7530 | #line 7482 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7531 | break; |
| 7532 | |
| 7533 | case 453: |
| 7534 | #line 4558 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7535 | { |
| 7536 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "%1 is not in the in-scope attribute " |
| 7537 | "declarations. Note that the schema import " |
| 7538 | "feature is not supported." ) |
| 7539 | .arg(a: formatKeyword(np: parseInfo->staticContext->namePool(), name: (yyvsp[-1].qName))), |
| 7540 | errorCode: ReportContext::XPST0008, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7541 | (yyval.itemType).reset(); |
| 7542 | } |
| 7543 | #line 7495 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7544 | break; |
| 7545 | |
| 7546 | case 455: |
| 7547 | #line 4570 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7548 | { |
| 7549 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: StandardNamespaces::empty, ln: (yyvsp[0].sval)); |
| 7550 | } |
| 7551 | #line 7503 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7552 | break; |
| 7553 | |
| 7554 | case 457: |
| 7555 | #line 4582 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7556 | { |
| 7557 | if(parseInfo->nodeTestSource == BuiltinTypes::element) |
| 7558 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: parseInfo->staticContext->namespaceBindings()->lookupNamespaceURI(prefix: StandardPrefixes::empty), ln: (yyvsp[0].sval)); |
| 7559 | else |
| 7560 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: StandardNamespaces::empty, ln: (yyvsp[0].sval)); |
| 7561 | } |
| 7562 | #line 7514 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7563 | break; |
| 7564 | |
| 7565 | case 462: |
| 7566 | #line 4596 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7567 | { |
| 7568 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: parseInfo->staticContext->defaultFunctionNamespace(), localName: (yyvsp[0].sval)); |
| 7569 | } |
| 7570 | #line 7522 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7571 | break; |
| 7572 | |
| 7573 | case 463: |
| 7574 | #line 4600 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7575 | { |
| 7576 | (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(uri: StandardNamespaces::InternalXSLT, ln: (yyvsp[0].sval)); |
| 7577 | } |
| 7578 | #line 7530 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7579 | break; |
| 7580 | |
| 7581 | case 466: |
| 7582 | #line 4608 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7583 | { |
| 7584 | parseInfo->staticContext->error(message: QtXmlPatterns::tr(sourceText: "The name of an extension expression must be in " |
| 7585 | "a namespace." ), |
| 7586 | errorCode: ReportContext::XPST0081, sourceLocation: fromYYLTYPE(sourceLocator: (yyloc), parseInfo)); |
| 7587 | } |
| 7588 | #line 7540 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7589 | break; |
| 7590 | |
| 7591 | case 469: |
| 7592 | #line 4618 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7593 | { |
| 7594 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 7595 | } |
| 7596 | #line 7548 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7597 | break; |
| 7598 | |
| 7599 | case 470: |
| 7600 | #line 4622 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7601 | { |
| 7602 | allowedIn(allowedLanguages: QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, sourceLocator: (yyloc)); |
| 7603 | } |
| 7604 | #line 7556 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7605 | break; |
| 7606 | |
| 7607 | case 471: |
| 7608 | #line 4627 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7609 | { |
| 7610 | |
| 7611 | const ReflectYYLTYPE ryy((yyloc), parseInfo); |
| 7612 | |
| 7613 | (yyval.qName) = QNameConstructor:: |
| 7614 | expandQName<StaticContext::Ptr, |
| 7615 | ReportContext::XPST0081, |
| 7616 | ReportContext::XPST0081>(lexicalQName: (yyvsp[0].sval), context: parseInfo->staticContext, |
| 7617 | nsResolver: parseInfo->staticContext->namespaceBindings(), r: &ryy); |
| 7618 | |
| 7619 | } |
| 7620 | #line 7572 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7621 | break; |
| 7622 | |
| 7623 | case 472: |
| 7624 | #line 4639 "querytransformparser.ypp" /* yacc.c:1652 */ |
| 7625 | { |
| 7626 | (yyval.qName) = parseInfo->staticContext->namePool()->fromClarkName(clarkName: (yyvsp[0].sval)); |
| 7627 | } |
| 7628 | #line 7580 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7629 | break; |
| 7630 | |
| 7631 | |
| 7632 | #line 7584 "qquerytransformparser.cpp" /* yacc.c:1652 */ |
| 7633 | default: break; |
| 7634 | } |
| 7635 | /* User semantic actions sometimes alter yychar, and that requires |
| 7636 | that yytoken be updated with the new translation. We take the |
| 7637 | approach of translating immediately before every use of yytoken. |
| 7638 | One alternative is translating here after every semantic action, |
| 7639 | but that translation would be missed if the semantic action invokes |
| 7640 | YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or |
| 7641 | if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an |
| 7642 | incorrect destructor might then be invoked immediately. In the |
| 7643 | case of YYERROR or YYBACKUP, subsequent parser actions might lead |
| 7644 | to an incorrect destructor call or verbose syntax error message |
| 7645 | before the lookahead is translated. */ |
| 7646 | YY_SYMBOL_PRINT ("-> $$ =" , yyr1[yyn], &yyval, &yyloc); |
| 7647 | |
| 7648 | YYPOPSTACK (yylen); |
| 7649 | yylen = 0; |
| 7650 | YY_STACK_PRINT (yyss, yyssp); |
| 7651 | |
| 7652 | *++yyvsp = yyval; |
| 7653 | *++yylsp = yyloc; |
| 7654 | |
| 7655 | /* Now 'shift' the result of the reduction. Determine what state |
| 7656 | that goes to, based on the state we popped back to and the rule |
| 7657 | number reduced by. */ |
| 7658 | { |
| 7659 | const int yylhs = yyr1[yyn] - YYNTOKENS; |
| 7660 | const int yyi = yypgoto[yylhs] + *yyssp; |
| 7661 | yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp |
| 7662 | ? yytable[yyi] |
| 7663 | : yydefgoto[yylhs]); |
| 7664 | } |
| 7665 | |
| 7666 | goto yynewstate; |
| 7667 | |
| 7668 | |
| 7669 | /*--------------------------------------. |
| 7670 | | yyerrlab -- here on detecting error. | |
| 7671 | `--------------------------------------*/ |
| 7672 | yyerrlab: |
| 7673 | /* Make sure we have latest lookahead translation. See comments at |
| 7674 | user semantic actions for why this is necessary. */ |
| 7675 | yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); |
| 7676 | |
| 7677 | /* If not already recovering from an error, report this error. */ |
| 7678 | if (!yyerrstatus) |
| 7679 | { |
| 7680 | ++yynerrs; |
| 7681 | #if ! YYERROR_VERBOSE |
| 7682 | yyerror (&yylloc, parseInfo, YY_("syntax error" )); |
| 7683 | #else |
| 7684 | # define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ |
| 7685 | yyssp, yytoken) |
| 7686 | { |
| 7687 | char const *yymsgp = YY_("syntax error" ); |
| 7688 | int yysyntax_error_status; |
| 7689 | yysyntax_error_status = YYSYNTAX_ERROR; |
| 7690 | if (yysyntax_error_status == 0) |
| 7691 | yymsgp = yymsg; |
| 7692 | else if (yysyntax_error_status == 1) |
| 7693 | { |
| 7694 | if (yymsg != yymsgbuf) |
| 7695 | YYSTACK_FREE (ptr: yymsg); |
| 7696 | yymsg = (char *) YYSTACK_ALLOC (size: yymsg_alloc); |
| 7697 | if (!yymsg) |
| 7698 | { |
| 7699 | yymsg = yymsgbuf; |
| 7700 | yymsg_alloc = sizeof yymsgbuf; |
| 7701 | yysyntax_error_status = 2; |
| 7702 | } |
| 7703 | else |
| 7704 | { |
| 7705 | yysyntax_error_status = YYSYNTAX_ERROR; |
| 7706 | yymsgp = yymsg; |
| 7707 | } |
| 7708 | } |
| 7709 | yyerror (sourceLocator: &yylloc, parseInfo, msg: yymsgp); |
| 7710 | if (yysyntax_error_status == 2) |
| 7711 | goto yyexhaustedlab; |
| 7712 | } |
| 7713 | # undef YYSYNTAX_ERROR |
| 7714 | #endif |
| 7715 | } |
| 7716 | |
| 7717 | yyerror_range[1] = yylloc; |
| 7718 | |
| 7719 | if (yyerrstatus == 3) |
| 7720 | { |
| 7721 | /* If just tried and failed to reuse lookahead token after an |
| 7722 | error, discard it. */ |
| 7723 | |
| 7724 | if (yychar <= YYEOF) |
| 7725 | { |
| 7726 | /* Return failure if at end of input. */ |
| 7727 | if (yychar == YYEOF) |
| 7728 | YYABORT; |
| 7729 | } |
| 7730 | else |
| 7731 | { |
| 7732 | yydestruct (yymsg: "Error: discarding" , |
| 7733 | yytype: yytoken, yyvaluep: &yylval, yylocationp: &yylloc, parseInfo); |
| 7734 | yychar = YYEMPTY; |
| 7735 | } |
| 7736 | } |
| 7737 | |
| 7738 | /* Else will try to reuse lookahead token after shifting the error |
| 7739 | token. */ |
| 7740 | goto yyerrlab1; |
| 7741 | |
| 7742 | |
| 7743 | /*---------------------------------------------------. |
| 7744 | | yyerrorlab -- error raised explicitly by YYERROR. | |
| 7745 | `---------------------------------------------------*/ |
| 7746 | yyerrorlab: |
| 7747 | /* Pacify compilers when the user code never invokes YYERROR and the |
| 7748 | label yyerrorlab therefore never appears in user code. */ |
| 7749 | if (0) |
| 7750 | YYERROR; |
| 7751 | |
| 7752 | /* Do not reclaim the symbols of the rule whose action triggered |
| 7753 | this YYERROR. */ |
| 7754 | YYPOPSTACK (yylen); |
| 7755 | yylen = 0; |
| 7756 | YY_STACK_PRINT (yyss, yyssp); |
| 7757 | yystate = *yyssp; |
| 7758 | goto yyerrlab1; |
| 7759 | |
| 7760 | |
| 7761 | /*-------------------------------------------------------------. |
| 7762 | | yyerrlab1 -- common code for both syntax error and YYERROR. | |
| 7763 | `-------------------------------------------------------------*/ |
| 7764 | yyerrlab1: |
| 7765 | yyerrstatus = 3; /* Each real token shifted decrements this. */ |
| 7766 | |
| 7767 | for (;;) |
| 7768 | { |
| 7769 | yyn = yypact[yystate]; |
| 7770 | if (!yypact_value_is_default (yyn)) |
| 7771 | { |
| 7772 | yyn += YYTERROR; |
| 7773 | if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) |
| 7774 | { |
| 7775 | yyn = yytable[yyn]; |
| 7776 | if (0 < yyn) |
| 7777 | break; |
| 7778 | } |
| 7779 | } |
| 7780 | |
| 7781 | /* Pop the current state because it cannot handle the error token. */ |
| 7782 | if (yyssp == yyss) |
| 7783 | YYABORT; |
| 7784 | |
| 7785 | yyerror_range[1] = *yylsp; |
| 7786 | yydestruct (yymsg: "Error: popping" , |
| 7787 | yytype: yystos[yystate], yyvaluep: yyvsp, yylocationp: yylsp, parseInfo); |
| 7788 | YYPOPSTACK (1); |
| 7789 | yystate = *yyssp; |
| 7790 | YY_STACK_PRINT (yyss, yyssp); |
| 7791 | } |
| 7792 | |
| 7793 | YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN |
| 7794 | *++yyvsp = yylval; |
| 7795 | YY_IGNORE_MAYBE_UNINITIALIZED_END |
| 7796 | |
| 7797 | yyerror_range[2] = yylloc; |
| 7798 | /* Using YYLLOC is tempting, but would change the location of |
| 7799 | the lookahead. YYLOC is available though. */ |
| 7800 | YYLLOC_DEFAULT (yyloc, yyerror_range, 2); |
| 7801 | *++yylsp = yyloc; |
| 7802 | |
| 7803 | /* Shift the error token. */ |
| 7804 | YY_SYMBOL_PRINT ("Shifting" , yystos[yyn], yyvsp, yylsp); |
| 7805 | |
| 7806 | yystate = yyn; |
| 7807 | goto yynewstate; |
| 7808 | |
| 7809 | |
| 7810 | /*-------------------------------------. |
| 7811 | | yyacceptlab -- YYACCEPT comes here. | |
| 7812 | `-------------------------------------*/ |
| 7813 | yyacceptlab: |
| 7814 | yyresult = 0; |
| 7815 | goto yyreturn; |
| 7816 | |
| 7817 | |
| 7818 | /*-----------------------------------. |
| 7819 | | yyabortlab -- YYABORT comes here. | |
| 7820 | `-----------------------------------*/ |
| 7821 | yyabortlab: |
| 7822 | yyresult = 1; |
| 7823 | goto yyreturn; |
| 7824 | |
| 7825 | |
| 7826 | #if !defined yyoverflow || YYERROR_VERBOSE |
| 7827 | /*-------------------------------------------------. |
| 7828 | | yyexhaustedlab -- memory exhaustion comes here. | |
| 7829 | `-------------------------------------------------*/ |
| 7830 | yyexhaustedlab: |
| 7831 | yyerror (sourceLocator: &yylloc, parseInfo, YY_("memory exhausted" )); |
| 7832 | yyresult = 2; |
| 7833 | /* Fall through. */ |
| 7834 | #endif |
| 7835 | |
| 7836 | |
| 7837 | /*-----------------------------------------------------. |
| 7838 | | yyreturn -- parsing is finished, return the result. | |
| 7839 | `-----------------------------------------------------*/ |
| 7840 | yyreturn: |
| 7841 | if (yychar != YYEMPTY) |
| 7842 | { |
| 7843 | /* Make sure we have latest lookahead translation. See comments at |
| 7844 | user semantic actions for why this is necessary. */ |
| 7845 | yytoken = YYTRANSLATE (yychar); |
| 7846 | yydestruct (yymsg: "Cleanup: discarding lookahead" , |
| 7847 | yytype: yytoken, yyvaluep: &yylval, yylocationp: &yylloc, parseInfo); |
| 7848 | } |
| 7849 | /* Do not reclaim the symbols of the rule whose action triggered |
| 7850 | this YYABORT or YYACCEPT. */ |
| 7851 | YYPOPSTACK (yylen); |
| 7852 | YY_STACK_PRINT (yyss, yyssp); |
| 7853 | while (yyssp != yyss) |
| 7854 | { |
| 7855 | yydestruct (yymsg: "Cleanup: popping" , |
| 7856 | yytype: yystos[*yyssp], yyvaluep: yyvsp, yylocationp: yylsp, parseInfo); |
| 7857 | YYPOPSTACK (1); |
| 7858 | } |
| 7859 | #ifndef yyoverflow |
| 7860 | if (yyss != yyssa) |
| 7861 | YYSTACK_FREE (yyss); |
| 7862 | #endif |
| 7863 | #if YYERROR_VERBOSE |
| 7864 | if (yymsg != yymsgbuf) |
| 7865 | YYSTACK_FREE (ptr: yymsg); |
| 7866 | #endif |
| 7867 | return yyresult; |
| 7868 | } |
| 7869 | #line 4643 "querytransformparser.ypp" /* yacc.c:1918 */ |
| 7870 | |
| 7871 | |
| 7872 | QString Tokenizer::tokenToString(const Token &token) |
| 7873 | { |
| 7874 | switch(token.type) |
| 7875 | { |
| 7876 | case T_NCNAME: |
| 7877 | case T_QNAME: |
| 7878 | case T_NUMBER: |
| 7879 | case T_XPATH2_NUMBER: |
| 7880 | return token.value; |
| 7881 | case T_STRING_LITERAL: |
| 7882 | return QLatin1Char('"') + token.value + QLatin1Char('"'); |
| 7883 | default: |
| 7884 | { |
| 7885 | const QString raw(QString::fromLatin1(str: yytname[YYTRANSLATE(token.type)])); |
| 7886 | |
| 7887 | /* Remove the quotes. */ |
| 7888 | if(raw.at(i: 0) == QLatin1Char('"') && raw.length() > 1) |
| 7889 | return raw.mid(position: 1, n: raw.length() - 2); |
| 7890 | else |
| 7891 | return raw; |
| 7892 | } |
| 7893 | } |
| 7894 | } |
| 7895 | |
| 7896 | } /* namespace Patternist */ |
| 7897 | |
| 7898 | QT_END_NAMESPACE |
| 7899 | |
| 7900 | // vim: et:ts=4:sw=4:sts=4:syntax=yacc |
| 7901 | |