diff -r 000000000000 -r 1918ee327afb src/xmlpatterns/parser/qquerytransformparser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/xmlpatterns/parser/qquerytransformparser.cpp Mon Jan 11 14:00:40 2010 +0000 @@ -0,0 +1,8035 @@ +/**************************************************************************** +** +** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** This file is part of the QtXmlPatterns module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** No Commercial Usage +** This file contains pre-release code and may not be distributed. +** You may use this file in accordance with the terms and conditions +** contained in the Technology Preview License Agreement accompanying +** this package. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +** +** +** +** +** +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/* A Bison parser, made by GNU Bison 2.3a. */ + +/* Skeleton implementation for Bison's Yacc-like parsers in C + + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006 + Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "2.3a" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Using locations. */ +#define YYLSP_NEEDED 1 + +/* Substitute the variable and function names. */ +#define yyparse XPathparse +#define yylex XPathlex +#define yyerror XPatherror +#define yylval XPathlval +#define yychar XPathchar +#define yydebug XPathdebug +#define yynerrs XPathnerrs +#define yylloc XPathlloc + +/* Copy the first part of user declarations. */ +/* Line 164 of yacc.c. */ +#line 22 "querytransformparser.ypp" + +#include + +#include + +#include "qabstractfloat_p.h" +#include "qandexpression_p.h" +#include "qanyuri_p.h" +#include "qapplytemplate_p.h" +#include "qargumentreference_p.h" +#include "qarithmeticexpression_p.h" +#include "qatomicstring_p.h" +#include "qattributeconstructor_p.h" +#include "qattributenamevalidator_p.h" +#include "qaxisstep_p.h" +#include "qbuiltintypes_p.h" +#include "qcalltemplate_p.h" +#include "qcastableas_p.h" +#include "qcastas_p.h" +#include "qcombinenodes_p.h" +#include "qcommentconstructor_p.h" +#include "qcommonnamespaces_p.h" +#include "qcommonsequencetypes_p.h" +#include "qcommonvalues_p.h" +#include "qcomputednamespaceconstructor_p.h" +#include "qcontextitem_p.h" +#include "qcopyof_p.h" +#include "qcurrentitemstore_p.h" +#include "qdebug_p.h" +#include "qdelegatingnamespaceresolver_p.h" +#include "qdocumentconstructor_p.h" +#include "qelementconstructor_p.h" +#include "qemptysequence_p.h" +#include "qemptysequencetype_p.h" +#include "qevaluationcache_p.h" +#include "qexpressionfactory_p.h" +#include "qexpressionsequence_p.h" +#include "qexpressionvariablereference_p.h" +#include "qexternalvariablereference_p.h" +#include "qforclause_p.h" +#include "qfunctioncall_p.h" +#include "qfunctionfactory_p.h" +#include "qfunctionsignature_p.h" +#include "qgeneralcomparison_p.h" +#include "qgenericpredicate_p.h" +#include "qgenericsequencetype_p.h" +#include "qifthenclause_p.h" +#include "qinstanceof_p.h" +#include "qletclause_p.h" +#include "qliteral_p.h" +#include "qlocalnametest_p.h" +#include "qnamespaceconstructor_p.h" +#include "qnamespacenametest_p.h" +#include "qncnameconstructor_p.h" +#include "qnodecomparison_p.h" +#include "qnodesort_p.h" +#include "qorderby_p.h" +#include "qorexpression_p.h" +#include "qparsercontext_p.h" +#include "qpath_p.h" +#include "qpatternistlocale_p.h" +#include "qpositionalvariablereference_p.h" +#include "qprocessinginstructionconstructor_p.h" +#include "qqnameconstructor_p.h" +#include "qqnametest_p.h" +#include "qqnamevalue_p.h" +#include "qquantifiedexpression_p.h" +#include "qrangeexpression_p.h" +#include "qrangevariablereference_p.h" +#include "qreturnorderby_p.h" +#include "qschemanumeric_p.h" +#include "qschematypefactory_p.h" +#include "qsimplecontentconstructor_p.h" +#include "qstaticbaseuristore_p.h" +#include "qstaticcompatibilitystore_p.h" +#include "qtemplateparameterreference_p.h" +#include "qtemplate_p.h" +#include "qtextnodeconstructor_p.h" +#include "qtokenizer_p.h" +#include "qtreatas_p.h" +#include "qtypechecker_p.h" +#include "qunaryexpression_p.h" +#include "qunresolvedvariablereference_p.h" +#include "quserfunctioncallsite_p.h" +#include "qvaluecomparison_p.h" +#include "qxpathhelper_p.h" +#include "qxsltsimplecontentconstructor_p.h" + +/* + * The cpp generated with bison 2.1 wants to + * redeclare the C-like prototypes of 'malloc' and 'free', so we avoid that. + */ +#define YYMALLOC malloc +#define YYFREE free + +QT_BEGIN_NAMESPACE + +/* Due to Qt's QT_BEGIN_NAMESPACE magic, we can't use `using namespace', for some + * undocumented reason. */ +namespace QPatternist +{ + +/** + * "Macro that you define with #define in the Bison declarations + * section to request verbose, specific error message strings when + * yyerror is called." + */ +#define YYERROR_VERBOSE 1 + +#undef YYLTYPE_IS_TRIVIAL +#define YYLTYPE_IS_TRIVIAL 0 + +/* Suppresses `warning: "YYENABLE_NLS" is not defined` + * @c YYENABLE_NLS enables Bison internationalization, and we don't + * use that, so disable it. See the Bison Manual, section 4.5 Parser Internationalization. + */ +#define YYENABLE_NLS 0 + +static inline QSourceLocation fromYYLTYPE(const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + return QSourceLocation(parseInfo->tokenizer->queryURI(), + sourceLocator.first_line, + sourceLocator.first_column); +} + +/** + * @internal + * @relates QXmlQuery + */ +typedef QFlags QueryLanguages; + +/** + * @short Flags invalid expressions and declarations in the currently + * parsed language. + * + * Since this grammar is used for several languages: XQuery 1.0, XSL-T 2.0, and + * XPath 2.0 inside XSL-T, and field and selector patterns in W3C XML Schema's + * identity constraints, it is the union of all the constructs in these + * languages. However, when dealing with each language individually, we + * regularly need to disallow some expressions, such as direct element + * constructors when parsing XSL-T, or the typeswitch when parsing XPath. + * + * This is further complicated by that XSLTTokenizer sometimes generates code + * which is allowed in XQuery but not in XPath. For that reason the token + * INTERNAL is sometimes generated, which signals that an expression, for + * instance the @c let clause, should not be flagged as an error, because it's + * used for internal purposes. + * + * Hence, this function is called from each expression and declaration with @p + * allowedLanguages stating what languages it is allowed in. + * + * If @p isInternal is @c true, no error is raised. Otherwise, if the current + * language is not in @p allowedLanguages, an error is raised. + */ +static void allowedIn(const QueryLanguages allowedLanguages, + const ParserContext *const parseInfo, + const YYLTYPE &sourceLocator, + const bool isInternal = false) +{ + /* We treat XPath 2.0 as a subset of XSL-T 2.0, so if XPath 2.0 is allowed + * and XSL-T is the language, it's ok. */ + if(!isInternal && + (!allowedLanguages.testFlag(parseInfo->languageAccent) && !(allowedLanguages.testFlag(QXmlQuery::XPath20) && parseInfo->languageAccent == QXmlQuery::XSLT20))) + { + + QString langName; + + switch(parseInfo->languageAccent) + { + case QXmlQuery::XPath20: + langName = QLatin1String("XPath 2.0"); + break; + case QXmlQuery::XSLT20: + langName = QLatin1String("XSL-T 2.0"); + break; + case QXmlQuery::XQuery10: + langName = QLatin1String("XQuery 1.0"); + break; + case QXmlQuery::XmlSchema11IdentityConstraintSelector: + langName = QtXmlPatterns::tr("W3C XML Schema identity constraint selector"); + break; + case QXmlQuery::XmlSchema11IdentityConstraintField: + langName = QtXmlPatterns::tr("W3C XML Schema identity constraint field"); + break; + } + + parseInfo->staticContext->error(QtXmlPatterns::tr("A construct was encountered " + "which is disallowed in the current language(%1).").arg(langName), + ReportContext::XPST0003, + fromYYLTYPE(sourceLocator, parseInfo)); + + } +} + +static inline bool isVariableReference(const Expression::ID id) +{ + return id == Expression::IDExpressionVariableReference + || id == Expression::IDRangeVariableReference + || id == Expression::IDArgumentReference; +} + +class ReflectYYLTYPE : public SourceLocationReflection +{ +public: + inline ReflectYYLTYPE(const YYLTYPE &sourceLocator, + const ParserContext *const pi) : m_sl(sourceLocator) + , m_parseInfo(pi) + { + } + + virtual const SourceLocationReflection *actualReflection() const + { + return this; + } + + virtual QSourceLocation sourceLocation() const + { + return fromYYLTYPE(m_sl, m_parseInfo); + } + + virtual QString description() const + { + Q_ASSERT(false); + return QString(); + } + +private: + const YYLTYPE &m_sl; + const ParserContext *const m_parseInfo; +}; + +/** + * @short Centralizes a translation string for the purpose of increasing consistency. + */ +static inline QString unknownType() +{ + return QtXmlPatterns::tr("%1 is an unknown schema type."); +} + +static inline Expression::Ptr create(Expression *const expr, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + parseInfo->staticContext->addLocation(expr, fromYYLTYPE(sourceLocator, parseInfo)); + return Expression::Ptr(expr); +} + +static inline Template::Ptr create(Template *const expr, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + parseInfo->staticContext->addLocation(expr, fromYYLTYPE(sourceLocator, parseInfo)); + return Template::Ptr(expr); +} + +static inline Expression::Ptr create(const Expression::Ptr &expr, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + parseInfo->staticContext->addLocation(expr.data(), fromYYLTYPE(sourceLocator, parseInfo)); + return expr; +} + +static Expression::Ptr createSimpleContent(const Expression::Ptr &source, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + return create(parseInfo->isXSLT() ? new XSLTSimpleContentConstructor(source) : new SimpleContentConstructor(source), + sourceLocator, + parseInfo); +} + +static void loadPattern(const Expression::Ptr &matchPattern, + TemplatePattern::Vector &ourPatterns, + const TemplatePattern::ID id, + const PatternPriority priority, + const Template::Ptr &temp) +{ + Q_ASSERT(temp); + + const PatternPriority effectivePriority = qIsNaN(priority) ? matchPattern->patternPriority() : priority; + + ourPatterns.append(TemplatePattern::Ptr(new TemplatePattern(matchPattern, effectivePriority, id, temp))); +} + +static Expression::Ptr typeCheckTemplateBody(const Expression::Ptr &body, + const SequenceType::Ptr &reqType, + const ParserContext *const parseInfo) +{ + return TypeChecker::applyFunctionConversion(body, reqType, + parseInfo->staticContext, + ReportContext::XTTE0505, + TypeChecker::Options(TypeChecker::AutomaticallyConvert | TypeChecker::GeneratePromotion)); +} + +static void registerNamedTemplate(const QXmlName &name, + const Expression::Ptr &body, + ParserContext *const parseInfo, + const YYLTYPE &sourceLocator, + const Template::Ptr &temp) +{ + Template::Ptr &e = parseInfo->namedTemplates[name]; + + if(e) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("A template by name %1 " + "has already been declared.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), + name)), + ReportContext::XTSE0660, + fromYYLTYPE(sourceLocator, parseInfo)); + } + else + { + e = temp; + e->body = body; + } +} + +/** + * @short Centralizes code for creating numeric literals. + */ +template +Expression::Ptr createNumericLiteral(const QString &in, + const YYLTYPE &sl, + const ParserContext *const parseInfo) +{ + const Item num(TNumberClass::fromLexical(in)); + + if(num.template as()->hasError()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is not a valid numeric literal.") + .arg(formatData(in)), + ReportContext::XPST0003, fromYYLTYPE(sl, parseInfo)); + return Expression::Ptr(); /* Avoid compiler warning. */ + } + else + return create(new Literal(num), sl, parseInfo); +} + +/** + * @short The generated Bison parser calls this function when there is a parse error. + * + * It is not called, nor should be, for logical errors(which the Bison not know about). For those, + * ReportContext::error() is called. + */ +static int XPatherror(YYLTYPE *sourceLocator, const ParserContext *const parseInfo, const char *const msg) +{ + Q_UNUSED(sourceLocator); + Q_ASSERT(parseInfo); + + parseInfo->staticContext->error(escape(QLatin1String(msg)), ReportContext::XPST0003, fromYYLTYPE(*sourceLocator, parseInfo)); + return 1; +} + +/** + * When we want to connect the OrderBy and ReturnOrderBy, it might be that we have other expressions, such + * as @c where and @c let inbetween. We need to continue through them. This function does that. + */ +static ReturnOrderBy *locateReturnClause(const Expression::Ptr &expr) +{ + Q_ASSERT(expr); + + const Expression::ID id = expr->id(); + if(id == Expression::IDLetClause || id == Expression::IDIfThenClause || id == Expression::IDForClause) + return locateReturnClause(expr->operands()[1]); + else if(id == Expression::IDReturnOrderBy) + return expr->as(); + else + return 0; +} + +static inline bool isPredicate(const Expression::ID id) +{ + return id == Expression::IDGenericPredicate || + id == Expression::IDFirstItemPredicate; +} + +/** + * Assumes expr is an AxisStep wrapped in some kind of predicates or paths. Filters + * through the predicates and returns the AxisStep. + */ +static Expression::Ptr findAxisStep(const Expression::Ptr &expr, + const bool throughStructures = true) +{ + Q_ASSERT(expr); + + if(!throughStructures) + return expr; + + Expression *candidate = expr.data(); + Expression::ID id = candidate->id(); + + while(isPredicate(id) || id == Expression::IDPath) + { + const Expression::List &children = candidate->operands(); + if(children.isEmpty()) + return Expression::Ptr(); + else + { + candidate = children.first().data(); + id = candidate->id(); + } + } + + if(id == Expression::IDEmptySequence) + return Expression::Ptr(); + else + { + Q_ASSERT(candidate->is(Expression::IDAxisStep)); + return Expression::Ptr(candidate); + } +} + +static void changeToTopAxis(const Expression::Ptr &op) +{ + /* This axis must have been written away by now. */ + Q_ASSERT(op->as()->axis() != QXmlNodeModelIndex::AxisChild); + + if(op->as()->axis() != QXmlNodeModelIndex::AxisSelf) + op->as()->setAxis(QXmlNodeModelIndex::AxisAttributeOrTop); +} + +/** + * @short Writes @p operand1 and @p operand2, two operands in an XSL-T pattern, + * into an equivalent XPath expression. + * + * Essentially, the following rewrite is done: + * + * + * axis1::test1(a)/axis2::test2(b) + * => + * child-or-top::test2(b)[parent::test1(a)] + * + * + * Section 5.5.3 The Meaning of a Pattern talks about rewrites that are applied to + * only the first step in a pattern, but since we're doing rewrites more radically, + * its line of reasoning cannot be followed. + * + * Keep in mind the rewrites that non-terminal PatternStep do. + * + * @see createIdPatternPath() + */ +static inline Expression::Ptr createPatternPath(const Expression::Ptr &operand1, + const Expression::Ptr &operand2, + const QXmlNodeModelIndex::Axis axis, + const YYLTYPE &sl, + const ParserContext *const parseInfo) +{ + const Expression::Ptr operandL(findAxisStep(operand1, false)); + + if(operandL->is(Expression::IDAxisStep)) + operandL->as()->setAxis(axis); + else + findAxisStep(operand1)->as()->setAxis(axis); + + return create(GenericPredicate::create(operand2, operandL, + parseInfo->staticContext, fromYYLTYPE(sl, parseInfo)), sl, parseInfo); +} + +/** + * @short Performs the same role as createPatternPath(), but is tailored + * for @c fn:key() and @c fn:id(). + * + * @c fn:key() and @c fn:id() can be part of path patterns(only as the first step, + * to be precise) and that poses a challenge to rewriting because what + * createPatternPath() is not possible to express, since the functions cannot be + * node tests. E.g, this rewrite is not possible: + * + * + * id-or-key/abc + * => + * child-or-top::abc[parent::id-or-key] + * + * + * Our approach is to rewrite like this: + * + * + * id-or-key/abc + * => + * child-or-top::abc[parent::node is id-or-key] + * + * + * @p operand1 is the call to @c fn:key() or @c fn:id(), @p operand2 + * the right operand, and @p axis the target axis to rewrite to. + * + * @see createPatternPath() + */ +static inline Expression::Ptr createIdPatternPath(const Expression::Ptr &operand1, + const Expression::Ptr &operand2, + const QXmlNodeModelIndex::Axis axis, + const YYLTYPE &sl, + const ParserContext *const parseInfo) +{ + const Expression::Ptr operandR(findAxisStep(operand2)); + Q_ASSERT(operandR); + changeToTopAxis(operandR); + + const Expression::Ptr parentStep(create(new AxisStep(axis, BuiltinTypes::node), + sl, + parseInfo)); + const Expression::Ptr isComp(create(new NodeComparison(parentStep, + QXmlNodeModelIndex::Is, + operand1), + sl, + parseInfo)); + + return create(GenericPredicate::create(operandR, isComp, + parseInfo->staticContext, fromYYLTYPE(sl, parseInfo)), sl, parseInfo); +} + +/** + * @short Centralizes a translation message, for the + * purpose of consistency and modularization. + */ +static inline QString prologMessage(const char *const msg) +{ + Q_ASSERT(msg); + return QtXmlPatterns::tr("Only one %1 declaration can occur in the query prolog.").arg(formatKeyword(msg)); +} + +/** + * @short Resolves against the static base URI and checks that @p collation + * is a supported Unicode Collation. + * + * "If a default collation declaration specifies a collation by a + * relative URI, that relative URI is resolved to an absolute + * URI using the base URI in the static context." + * + * @returns the Unicode Collation properly resolved, if @p collation is a valid collation + */ +template +static QUrl resolveAndCheckCollation(const QString &collation, + const ParserContext *const parseInfo, + const YYLTYPE &sl) +{ + Q_ASSERT(parseInfo); + const ReflectYYLTYPE ryy(sl, parseInfo); + + QUrl uri(AnyURI::toQUrl(collation, parseInfo->staticContext, &ryy)); + + if(uri.isRelative()) + uri = parseInfo->staticContext->baseURI().resolved(uri); + + XPathHelper::checkCollationSupport(uri.toString(), parseInfo->staticContext, &ryy); + + return uri; +} + +/* The Bison generated parser declares macros that aren't used + * so suppress the warnings by fake usage of them. + * + * We do the same for some more defines in the first action. */ +#if defined(YYLSP_NEEDED) \ + || defined(YYBISON) \ + || defined(YYBISON_VERSION) \ + || defined(YYPURE) \ + || defined(yydebug) \ + || defined(YYSKELETON_NAME) +#endif + +/** + * Wraps @p operand with a CopyOf in case it makes any difference. + * + * There is no need to wrap the return value in a call to create(), it's + * already done. + */ +static Expression::Ptr createCopyOf(const Expression::Ptr &operand, + const ParserContext *const parseInfo, + const YYLTYPE &sl) +{ + return create(new CopyOf(operand, parseInfo->inheritNamespacesMode, + parseInfo->preserveNamespacesMode), sl, parseInfo); +} + +static Expression::Ptr createCompatStore(const Expression::Ptr &expr, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + return create(new StaticCompatibilityStore(expr), sourceLocator, parseInfo); +} + +/** + * @short Creates an Expression that corresponds to /. This is literally + * fn:root(self::node()) treat as document-node(). + */ +static Expression::Ptr createRootExpression(const ParserContext *const parseInfo, + const YYLTYPE &sl) +{ + Q_ASSERT(parseInfo); + const QXmlName name(StandardNamespaces::fn, StandardLocalNames::root); + + Expression::List args; + args.append(create(new ContextItem(), sl, parseInfo)); + + const ReflectYYLTYPE ryy(sl, parseInfo); + + const Expression::Ptr fnRoot(parseInfo->staticContext->functionSignatures() + ->createFunctionCall(name, args, parseInfo->staticContext, &ryy)); + Q_ASSERT(fnRoot); + + return create(new TreatAs(create(fnRoot, sl, parseInfo), CommonSequenceTypes::ExactlyOneDocumentNode), sl, parseInfo); +} + +static int XPathlex(YYSTYPE *lexVal, YYLTYPE *sourceLocator, const ParserContext *const parseInfo) +{ +#ifdef Patternist_DEBUG_PARSER + /** + * "External integer variable set to zero by default. If yydebug + * is given a nonzero value, the parser will output information on + * input symbols and parser action. See section Debugging Your Parser." + */ +# define YYDEBUG 1 + + extern int XPathdebug; + XPathdebug = 1; +#endif + + Q_ASSERT(parseInfo); + + const Tokenizer::Token tok(parseInfo->tokenizer->nextToken(sourceLocator)); + + (*lexVal).sval = tok.value; + + return static_cast(tok.type); +} + +/** + * @short Creates a path expression which contains the step // between + * @p begin and and @p end. + * + * begin//end is a short form for: begin/descendant-or-self::node()/end + * + * This will be compiled as two-path expression: (/)/(//.)/step/ + */ +static Expression::Ptr createSlashSlashPath(const Expression::Ptr &begin, + const Expression::Ptr &end, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + const Expression::Ptr twoSlash(create(new AxisStep(QXmlNodeModelIndex::AxisDescendantOrSelf, BuiltinTypes::node), sourceLocator, parseInfo)); + const Expression::Ptr p1(create(new Path(begin, twoSlash), sourceLocator, parseInfo)); + + return create(new Path(p1, end), sourceLocator, parseInfo); +} + +/** + * @short Creates a call to fn:concat() with @p args as the arguments. + */ +static inline Expression::Ptr createConcatFN(const ParserContext *const parseInfo, + const Expression::List &args, + const YYLTYPE &sourceLocator) +{ + Q_ASSERT(parseInfo); + const QXmlName name(StandardNamespaces::fn, StandardLocalNames::concat); + const ReflectYYLTYPE ryy(sourceLocator, parseInfo); + + return create(parseInfo->staticContext->functionSignatures()->createFunctionCall(name, args, parseInfo->staticContext, &ryy), + sourceLocator, parseInfo); +} + +static inline Expression::Ptr createDirAttributeValue(const Expression::List &content, + const ParserContext *const parseInfo, + const YYLTYPE &sourceLocator) +{ + if(content.isEmpty()) + return create(new EmptySequence(), sourceLocator, parseInfo); + else if(content.size() == 1) + return content.first(); + else + return createConcatFN(parseInfo, content, sourceLocator); +} + +/** + * @short Checks for variable initialization circularity. + * + * "A recursive function that checks for recursion is full of ironies." + * + * -- The Salsa Master + * + * Issues an error via @p parseInfo's StaticContext if the initialization + * expression @p checkee for the global variable @p var, contains a variable + * reference to @p var. That is, if there's a circularity. + * + * @see XQuery 1.0: An XML + * Query Language, err:XQST0054 + */ +static void checkVariableCircularity(const VariableDeclaration::Ptr &var, + const Expression::Ptr &checkee, + const VariableDeclaration::Type type, + FunctionSignature::List &signList, + const ParserContext *const parseInfo) +{ + Q_ASSERT(var); + Q_ASSERT(checkee); + Q_ASSERT(parseInfo); + + const Expression::ID id = checkee->id(); + + if(id == Expression::IDExpressionVariableReference) + { + const ExpressionVariableReference *const ref = + static_cast(checkee.data()); + + if(var->slot == ref->slot() && type == ref->variableDeclaration()->type) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The initialization of variable %1 " + "depends on itself").arg(formatKeyword(var, parseInfo->staticContext->namePool())), + parseInfo->isXSLT() ? ReportContext::XTDE0640 : ReportContext::XQST0054, ref); + return; + } + else + { + /* If the variable we're checking is below another variable, it can be a recursive + * dependency through functions, so we need to check variable references too. */ + checkVariableCircularity(var, ref->sourceExpression(), type, signList, parseInfo); + return; + } + } + else if(id == Expression::IDUserFunctionCallsite) + { + const UserFunctionCallsite::Ptr callsite(checkee); + const FunctionSignature::Ptr sign(callsite->callTargetDescription()); + const FunctionSignature::List::const_iterator end(signList.constEnd()); + FunctionSignature::List::const_iterator it(signList.constBegin()); + bool noMatch = true; + + for(; it != end; ++it) + { + if(*it == sign) + { + /* The variable we're checking is depending on a function that's recursive. The + * user has written a weird query, in other words. Since it's the second time + * we've encountered a callsite, we now skip it. */ + noMatch = false; + break; + } + } + + if(noMatch) + { + signList.append(sign); + /* Check the body of the function being called. */ + checkVariableCircularity(var, callsite->body(), type, signList, parseInfo); + } + /* Continue with the operands, such that we also check the arguments of the callsite. */ + } + else if(id == Expression::IDUnresolvedVariableReference) + { + /* We're called before it has rewritten itself. */ + checkVariableCircularity(var, checkee->as()->replacement(), type, signList, parseInfo); + } + + /* Check the operands. */ + const Expression::List ops(checkee->operands()); + if(ops.isEmpty()) + return; + + const Expression::List::const_iterator end(ops.constEnd()); + Expression::List::const_iterator it(ops.constBegin()); + + for(; it != end; ++it) + checkVariableCircularity(var, *it, type, signList, parseInfo); +} + +static void variableUnavailable(const QXmlName &variableName, + const ParserContext *const parseInfo, + const YYLTYPE &location) +{ + parseInfo->staticContext->error(QtXmlPatterns::tr("No variable by name %1 exists") + .arg(formatKeyword(parseInfo->staticContext->namePool(), variableName)), + ReportContext::XPST0008, fromYYLTYPE(location, parseInfo)); +} + +/** + * The Cardinality in a TypeDeclaration for a variable in a quantification has no effect, + * and this function ensures this by changing @p type to Cardinality Cardinality::zeroOrMore(). + * + * @see Bugzilla Bug 3305 + * Cardinality + on range variables + * @see ParserContext::finalizePushedVariable() + */ +static inline SequenceType::Ptr quantificationType(const SequenceType::Ptr &type) +{ + Q_ASSERT(type); + return makeGenericSequenceType(type->itemType(), Cardinality::zeroOrMore()); +} + +/** + * @p seqType and @p expr may be @c null. + */ +static Expression::Ptr pushVariable(const QXmlName name, + const SequenceType::Ptr &seqType, + const Expression::Ptr &expr, + const VariableDeclaration::Type type, + const YYLTYPE &sourceLocator, + ParserContext *const parseInfo, + const bool checkSource = true) +{ + Q_ASSERT(!name.isNull()); + Q_ASSERT(parseInfo); + + /* -2 will cause Q_ASSERTs to trigger if it isn't changed. */ + VariableSlotID slot = -2; + + switch(type) + { + case VariableDeclaration::FunctionArgument: + /* Fallthrough. */ + case VariableDeclaration::ExpressionVariable: + { + slot = parseInfo->allocateExpressionSlot(); + break; + } + case VariableDeclaration::GlobalVariable: + { + slot = parseInfo->allocateGlobalVariableSlot(); + break; + } + case VariableDeclaration::RangeVariable: + { + slot = parseInfo->staticContext->allocateRangeSlot(); + break; + } + case VariableDeclaration::PositionalVariable: + { + slot = parseInfo->allocatePositionalSlot(); + break; + } + case VariableDeclaration::TemplateParameter: + /* Fallthrough. We do nothing, template parameters + * doesn't use context slots at all, they're hashed + * on the name. */ + case VariableDeclaration::ExternalVariable: + /* We do nothing, external variables doesn't use + *context slots/stack frames at all. */ + ; + } + + const VariableDeclaration::Ptr var(new VariableDeclaration(name, slot, type, seqType)); + + Expression::Ptr checked; + + if(checkSource && seqType) + { + if(expr) + { + /* We only want to add conversion for function arguments, and variables + * if we're XSL-T. + * + * We unconditionally skip TypeChecker::CheckFocus because the StaticContext we + * pass hasn't set up the focus yet, since that's the parent's responsibility. */ + const TypeChecker::Options options(( type == VariableDeclaration::FunctionArgument + || type == VariableDeclaration::TemplateParameter + || parseInfo->isXSLT()) + ? TypeChecker::AutomaticallyConvert : TypeChecker::Options()); + + checked = TypeChecker::applyFunctionConversion(expr, seqType, parseInfo->staticContext, + parseInfo->isXSLT() ? ReportContext::XTTE0570 : ReportContext::XPTY0004, + options); + } + } + else + checked = expr; + + /* Add an evaluation cache for all expression variables. No EvaluationCache is needed for + * positional variables because in the end they are calls to Iterator::position(). Similarly, + * no need to cache range variables either because they are calls to DynamicContext::rangeVariable(). + * + * We don't do it for function arguments because the Expression being cached depends -- it depends + * on the callsite. UserFunctionCallsite is responsible for the evaluation caches in that case. + * + * In some cases the EvaluationCache instance isn't necessary, but in those cases EvaluationCache + * optimizes itself away. */ + if(type == VariableDeclaration::ExpressionVariable) + checked = create(new EvaluationCache(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); + else if(type == VariableDeclaration::GlobalVariable) + checked = create(new EvaluationCache(checked, var, parseInfo->allocateCacheSlot()), sourceLocator, parseInfo); + + var->setExpression(checked); + + parseInfo->variables.push(var); + return checked; +} + +static inline VariableDeclaration::Ptr variableByName(const QXmlName name, + const ParserContext *const parseInfo) +{ + Q_ASSERT(!name.isNull()); + Q_ASSERT(parseInfo); + + /* We walk the list backwards. */ + const VariableDeclaration::Stack::const_iterator start(parseInfo->variables.constBegin()); + VariableDeclaration::Stack::const_iterator it(parseInfo->variables.constEnd()); + + while(it != start) + { + --it; + Q_ASSERT(*it); + if((*it)->name == name) + return *it; + } + + return VariableDeclaration::Ptr(); +} + +static Expression::Ptr resolveVariable(const QXmlName &name, + const YYLTYPE &sourceLocator, + ParserContext *const parseInfo, + const bool raiseErrorOnUnavailability) +{ + const VariableDeclaration::Ptr var(variableByName(name, parseInfo)); + Expression::Ptr retval; + + if(var && var->type != VariableDeclaration::ExternalVariable) + { + switch(var->type) + { + case VariableDeclaration::RangeVariable: + { + retval = create(new RangeVariableReference(var->expression(), var->slot), sourceLocator, parseInfo); + break; + } + case VariableDeclaration::GlobalVariable: + /* Fallthrough. From the perspective of an ExpressionVariableReference, it can't tell + * a difference between a global and a local expression variable. However, the cache + * mechanism must. */ + case VariableDeclaration::ExpressionVariable: + { + retval = create(new ExpressionVariableReference(var->slot, var), sourceLocator, parseInfo); + break; + } + case VariableDeclaration::FunctionArgument: + { + retval = create(new ArgumentReference(var->sequenceType, var->slot), sourceLocator, parseInfo); + break; + } + case VariableDeclaration::PositionalVariable: + { + retval = create(new PositionalVariableReference(var->slot), sourceLocator, parseInfo); + break; + } + case VariableDeclaration::TemplateParameter: + { + retval = create(new TemplateParameterReference(var), sourceLocator, parseInfo); + break; + } + case VariableDeclaration::ExternalVariable: + /* This code path will never be hit, but the case + * label silences a warning. See above. */ + ; + } + Q_ASSERT(retval); + var->references.append(retval); + } + else + { + /* Let's see if your external variable loader can provide us with one. */ + const SequenceType::Ptr varType(parseInfo->staticContext-> + externalVariableLoader()->announceExternalVariable(name, CommonSequenceTypes::ZeroOrMoreItems)); + + if(varType) + { + const Expression::Ptr extRef(create(new ExternalVariableReference(name, varType), sourceLocator, parseInfo)); + const Expression::Ptr checked(TypeChecker::applyFunctionConversion(extRef, varType, parseInfo->staticContext)); + retval = checked; + } + else if(!raiseErrorOnUnavailability && parseInfo->isXSLT()) + { + /* In XSL-T, global variables are in scope for the whole + * stylesheet, so we must resolve this first at the end. */ + retval = create(new UnresolvedVariableReference(name), sourceLocator, parseInfo); + parseInfo->unresolvedVariableReferences.insert(name, retval); + } + else + variableUnavailable(name, parseInfo, sourceLocator); + } + + return retval; +} + +static Expression::Ptr createReturnOrderBy(const OrderSpecTransfer::List &orderSpecTransfer, + const Expression::Ptr &returnExpr, + const OrderBy::Stability stability, + const YYLTYPE &sourceLocator, + const ParserContext *const parseInfo) +{ + // TODO do resize(orderSpec.size() + 1) + Expression::List exprs; + OrderBy::OrderSpec::Vector orderSpecs; + + exprs.append(returnExpr); + + const int len = orderSpecTransfer.size(); + + for(int i = 0; i < len; ++i) + { + exprs.append(orderSpecTransfer.at(i).expression); + orderSpecs.append(orderSpecTransfer.at(i).orderSpec); + } + + return create(new ReturnOrderBy(stability, orderSpecs, exprs), sourceLocator, parseInfo); +} + + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +/* Enabling the token table. */ +#ifndef YYTOKEN_TABLE +# define YYTOKEN_TABLE 0 +#endif + + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + END_OF_FILE = 0, + STRING_LITERAL = 258, + NON_BOUNDARY_WS = 259, + XPATH2_STRING_LITERAL = 260, + QNAME = 261, + NCNAME = 262, + CLARK_NAME = 263, + ANY_LOCAL_NAME = 264, + ANY_PREFIX = 265, + NUMBER = 266, + XPATH2_NUMBER = 267, + ANCESTOR = 268, + ANCESTOR_OR_SELF = 269, + AND = 270, + APOS = 271, + APPLY_TEMPLATE = 272, + AS = 273, + ASCENDING = 274, + ASSIGN = 275, + AT = 276, + AT_SIGN = 277, + ATTRIBUTE = 278, + AVT = 279, + BAR = 280, + BASEURI = 281, + BEGIN_END_TAG = 282, + BOUNDARY_SPACE = 283, + BY = 284, + CALL_TEMPLATE = 285, + CASE = 286, + CASTABLE = 287, + CAST = 288, + CHILD = 289, + COLLATION = 290, + COLONCOLON = 291, + COMMA = 292, + COMMENT = 293, + COMMENT_START = 294, + CONSTRUCTION = 295, + COPY_NAMESPACES = 296, + CURLY_LBRACE = 297, + CURLY_RBRACE = 298, + DECLARE = 299, + DEFAULT = 300, + DESCENDANT = 301, + DESCENDANT_OR_SELF = 302, + DESCENDING = 303, + DIV = 304, + DOCUMENT = 305, + DOCUMENT_NODE = 306, + DOLLAR = 307, + DOT = 308, + DOTDOT = 309, + ELEMENT = 310, + ELSE = 311, + EMPTY = 312, + EMPTY_SEQUENCE = 313, + ENCODING = 314, + END_SORT = 315, + EQ = 316, + ERROR = 317, + EVERY = 318, + EXCEPT = 319, + EXTERNAL = 320, + FOLLOWING = 321, + FOLLOWING_SIBLING = 322, + FOLLOWS = 323, + FOR_APPLY_TEMPLATE = 324, + FOR = 325, + FUNCTION = 326, + GE = 327, + G_EQ = 328, + G_GE = 329, + G_GT = 330, + G_LE = 331, + G_LT = 332, + G_NE = 333, + GREATEST = 334, + GT = 335, + IDIV = 336, + IF = 337, + IMPORT = 338, + INHERIT = 339, + IN = 340, + INSTANCE = 341, + INTERSECT = 342, + IS = 343, + ITEM = 344, + LAX = 345, + LBRACKET = 346, + LEAST = 347, + LE = 348, + LET = 349, + LPAREN = 350, + LT = 351, + MAP = 352, + MATCHES = 353, + MINUS = 354, + MODE = 355, + MOD = 356, + MODULE = 357, + NAME = 358, + NAMESPACE = 359, + NE = 360, + NODE = 361, + NO_INHERIT = 362, + NO_PRESERVE = 363, + OF = 364, + OPTION = 365, + ORDERED = 366, + ORDERING = 367, + ORDER = 368, + OR = 369, + PARENT = 370, + PI_START = 371, + PLUS = 372, + POSITION_SET = 373, + PRAGMA_END = 374, + PRAGMA_START = 375, + PRECEDES = 376, + PRECEDING = 377, + PRECEDING_SIBLING = 378, + PRESERVE = 379, + PRIORITY = 380, + PROCESSING_INSTRUCTION = 381, + QUESTION = 382, + QUICK_TAG_END = 383, + QUOTE = 384, + RBRACKET = 385, + RETURN = 386, + RPAREN = 387, + SATISFIES = 388, + SCHEMA_ATTRIBUTE = 389, + SCHEMA_ELEMENT = 390, + SCHEMA = 391, + SELF = 392, + SEMI_COLON = 393, + SLASH = 394, + SLASHSLASH = 395, + SOME = 396, + SORT = 397, + STABLE = 398, + STAR = 399, + STRICT = 400, + STRIP = 401, + SUCCESS = 402, + COMMENT_CONTENT = 403, + PI_CONTENT = 404, + PI_TARGET = 405, + XSLT_VERSION = 406, + TEMPLATE = 407, + TEXT = 408, + THEN = 409, + TO = 410, + TREAT = 411, + TUNNEL = 412, + TYPESWITCH = 413, + UNION = 414, + UNORDERED = 415, + VALIDATE = 416, + VARIABLE = 417, + VERSION = 418, + WHERE = 419, + XQUERY = 420, + INTERNAL = 421, + INTERNAL_NAME = 422, + CURRENT = 423 + }; +#endif + + + +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +#endif + +#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + + +/* Copy the second part of user declarations. */ + +/* Line 221 of yacc.c. */ +#line 1323 "qquerytransformparser.cpp" + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#elif (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +typedef signed char yytype_int8; +#else +typedef short int yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(msgid) dgettext ("bison-runtime", msgid) +# endif +# endif +# ifndef YY_ +# define YY_(msgid) msgid +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(e) ((void) (e)) +#else +# define YYUSE(e) /* empty */ +#endif + +/* Identity function, used to suppress warnings about constant conditions. */ +#ifndef lint +# define YYID(n) (n) +#else +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static int +YYID (int yyi) +#else +static int +YYID (yyi) + int yyi; +#endif +{ + return yyi; +} +#endif + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef _STDLIB_H +# define _STDLIB_H 1 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \ + && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss; + YYSTYPE yyvs; + YYLTYPE yyls; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (YYID (0)) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (YYID (0)) + +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 5 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 2052 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 169 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 237 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 472 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 812 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 423 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, + 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, + 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, + 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, + 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const yytype_uint16 yyprhs[] = +{ + 0, 0, 3, 6, 9, 10, 16, 17, 20, 23, + 26, 33, 34, 37, 40, 43, 46, 49, 52, 55, + 58, 66, 67, 68, 84, 85, 88, 89, 91, 94, + 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, + 122, 127, 129, 131, 133, 135, 142, 149, 155, 160, + 162, 164, 170, 173, 176, 183, 185, 187, 189, 191, + 197, 203, 210, 211, 215, 219, 226, 227, 231, 232, + 235, 237, 241, 251, 253, 256, 257, 260, 265, 267, + 269, 270, 282, 283, 285, 289, 293, 295, 297, 301, + 303, 305, 309, 311, 313, 316, 319, 321, 325, 329, + 331, 333, 337, 341, 343, 345, 347, 351, 355, 357, + 359, 361, 363, 365, 370, 371, 374, 375, 378, 380, + 384, 386, 388, 390, 392, 393, 394, 405, 406, 407, + 418, 420, 422, 424, 425, 429, 430, 440, 441, 450, + 452, 454, 456, 460, 466, 467, 469, 472, 476, 478, + 483, 484, 486, 488, 489, 491, 492, 495, 499, 503, + 506, 508, 510, 511, 512, 522, 523, 524, 534, 536, + 537, 538, 548, 549, 550, 560, 562, 565, 566, 573, + 574, 575, 584, 586, 588, 589, 593, 597, 598, 605, + 614, 616, 620, 622, 626, 628, 630, 632, 634, 636, + 640, 642, 646, 648, 650, 652, 656, 658, 660, 662, + 664, 666, 670, 672, 676, 678, 680, 682, 684, 686, + 691, 693, 698, 700, 705, 707, 712, 714, 717, 719, + 721, 723, 725, 727, 731, 733, 735, 737, 739, 741, + 743, 747, 749, 751, 753, 755, 757, 759, 763, 765, + 767, 769, 772, 774, 777, 780, 783, 786, 790, 793, + 795, 800, 801, 803, 806, 809, 811, 813, 815, 819, + 827, 831, 833, 835, 838, 839, 843, 849, 850, 860, + 866, 867, 870, 871, 873, 877, 878, 882, 888, 889, + 891, 892, 895, 897, 899, 901, 903, 908, 910, 912, + 913, 917, 919, 921, 923, 926, 928, 930, 932, 934, + 936, 938, 940, 942, 944, 946, 948, 950, 951, 955, + 957, 959, 961, 963, 965, 967, 969, 971, 973, 975, + 977, 979, 984, 986, 988, 990, 992, 994, 996, 998, + 1004, 1006, 1008, 1010, 1012, 1015, 1017, 1019, 1023, 1026, + 1028, 1031, 1036, 1037, 1039, 1041, 1043, 1045, 1047, 1049, + 1051, 1052, 1053, 1062, 1064, 1070, 1071, 1074, 1078, 1082, + 1086, 1087, 1090, 1093, 1094, 1097, 1100, 1103, 1106, 1109, + 1113, 1115, 1117, 1119, 1121, 1123, 1125, 1127, 1131, 1132, + 1138, 1139, 1141, 1146, 1150, 1154, 1158, 1159, 1160, 1164, + 1166, 1168, 1170, 1172, 1174, 1176, 1180, 1182, 1185, 1186, + 1189, 1192, 1195, 1196, 1198, 1200, 1202, 1204, 1206, 1208, + 1211, 1213, 1215, 1217, 1219, 1221, 1223, 1225, 1227, 1230, + 1233, 1238, 1240, 1242, 1245, 1248, 1251, 1256, 1261, 1263, + 1265, 1268, 1273, 1278, 1285, 1292, 1297, 1300, 1305, 1310, + 1318, 1326, 1327, 1329, 1334, 1337, 1339, 1341, 1343, 1345, + 1347, 1349, 1351, 1353, 1356, 1358, 1360, 1362, 1364, 1366, + 1368, 1370, 1372 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yytype_int16 yyrhs[] = +{ + 170, 0, -1, 171, 174, -1, 171, 173, -1, -1, + 165, 163, 404, 172, 185, -1, -1, 59, 404, -1, + 176, 219, -1, 175, 176, -1, 102, 104, 7, 73, + 403, 185, -1, -1, 176, 189, -1, 176, 183, -1, + 176, 186, -1, 176, 184, -1, 176, 177, -1, 176, + 208, -1, 176, 213, -1, 176, 192, -1, 44, 152, + 182, 317, 377, 305, 185, -1, -1, -1, 44, 152, + 181, 98, 95, 178, 220, 179, 132, 228, 180, 317, + 377, 305, 185, -1, -1, 125, 404, -1, -1, 182, + -1, 103, 397, -1, 187, -1, 200, -1, 201, -1, + 211, -1, 193, -1, 195, -1, 197, -1, 202, -1, + 204, -1, 138, -1, 44, 104, 7, 73, 403, 364, + 185, -1, 44, 28, 188, 185, -1, 146, -1, 124, + -1, 190, -1, 191, -1, 44, 45, 55, 104, 403, + 185, -1, 44, 45, 71, 104, 403, 185, -1, 44, + 110, 397, 404, 185, -1, 44, 112, 194, 185, -1, + 111, -1, 160, -1, 44, 45, 113, 196, 185, -1, + 57, 92, -1, 57, 79, -1, 44, 41, 198, 37, + 199, 185, -1, 124, -1, 108, -1, 84, -1, 107, + -1, 44, 45, 35, 404, 185, -1, 44, 26, 364, + 403, 185, -1, 83, 136, 203, 403, 206, 185, -1, + -1, 45, 55, 104, -1, 104, 7, 73, -1, 83, + 102, 205, 403, 206, 185, -1, -1, 104, 7, 73, + -1, -1, 21, 207, -1, 403, -1, 207, 37, 403, + -1, 44, 162, 364, 52, 341, 377, 209, 210, 185, + -1, 65, -1, 20, 227, -1, -1, 20, 227, -1, + 44, 40, 212, 185, -1, 146, -1, 124, -1, -1, + 44, 71, 364, 399, 95, 215, 132, 214, 377, 217, + 185, -1, -1, 216, -1, 215, 37, 216, -1, 52, + 341, 377, -1, 65, -1, 218, -1, 42, 225, 43, + -1, 225, -1, 221, -1, 220, 25, 221, -1, 223, + -1, 139, -1, 139, 223, -1, 140, 223, -1, 222, + -1, 222, 139, 223, -1, 222, 140, 223, -1, 345, + -1, 224, -1, 223, 139, 224, -1, 223, 140, 224, + -1, 322, -1, 227, -1, 226, -1, 227, 37, 227, + -1, 226, 37, 227, -1, 277, -1, 232, -1, 253, + -1, 267, -1, 276, -1, 24, 95, 356, 132, -1, + -1, 100, 230, -1, -1, 100, 231, -1, 231, -1, + 230, 37, 231, -1, 405, -1, 7, -1, 233, -1, + 240, -1, -1, -1, 70, 52, 341, 377, 239, 85, + 227, 234, 235, 236, -1, -1, -1, 37, 52, 341, + 377, 239, 85, 227, 237, 238, 236, -1, 244, -1, + 233, -1, 240, -1, -1, 21, 52, 341, -1, -1, + 94, 364, 52, 341, 377, 20, 227, 241, 242, -1, + -1, 37, 52, 341, 377, 20, 227, 243, 242, -1, + 244, -1, 233, -1, 240, -1, 245, 131, 227, -1, + 164, 227, 245, 131, 227, -1, -1, 246, -1, 252, + 247, -1, 247, 37, 248, -1, 248, -1, 227, 249, + 250, 251, -1, -1, 19, -1, 48, -1, -1, 196, + -1, -1, 35, 403, -1, 166, 35, 227, -1, 143, + 113, 29, -1, 113, 29, -1, 254, -1, 260, -1, + -1, -1, 141, 52, 341, 377, 85, 227, 255, 256, + 257, -1, -1, -1, 37, 52, 341, 377, 85, 227, + 258, 259, 257, -1, 266, -1, -1, -1, 63, 52, + 341, 377, 85, 227, 261, 262, 263, -1, -1, -1, + 37, 52, 341, 377, 85, 227, 264, 265, 263, -1, + 266, -1, 133, 227, -1, -1, 158, 95, 225, 132, + 268, 269, -1, -1, -1, 31, 273, 378, 270, 131, + 227, 271, 272, -1, 269, -1, 274, -1, -1, 52, + 397, 18, -1, 45, 131, 227, -1, -1, 45, 52, + 397, 275, 131, 227, -1, 82, 95, 225, 132, 154, + 227, 56, 227, -1, 278, -1, 277, 114, 278, -1, + 279, -1, 278, 15, 279, -1, 280, -1, 298, -1, + 296, -1, 300, -1, 281, -1, 281, 155, 281, -1, + 283, -1, 281, 282, 283, -1, 117, -1, 99, -1, + 285, -1, 283, 284, 285, -1, 144, -1, 49, -1, + 81, -1, 101, -1, 286, -1, 285, 287, 286, -1, + 289, -1, 286, 288, 289, -1, 159, -1, 25, -1, + 87, -1, 64, -1, 290, -1, 290, 86, 109, 378, + -1, 291, -1, 291, 156, 18, 378, -1, 292, -1, + 292, 32, 18, 376, -1, 293, -1, 293, 33, 18, + 376, -1, 295, -1, 294, 293, -1, 117, -1, 99, + -1, 302, -1, 309, -1, 304, -1, 280, 297, 280, + -1, 73, -1, 78, -1, 74, -1, 75, -1, 76, + -1, 77, -1, 280, 299, 280, -1, 61, -1, 105, + -1, 72, -1, 80, -1, 93, -1, 96, -1, 280, + 301, 280, -1, 88, -1, 121, -1, 68, -1, 303, + 218, -1, 161, -1, 161, 145, -1, 161, 90, -1, + 306, 305, -1, 42, 43, -1, 42, 225, 43, -1, + 306, 307, -1, 307, -1, 120, 402, 308, 119, -1, + -1, 404, -1, 139, 310, -1, 140, 310, -1, 139, + -1, 310, -1, 311, -1, 310, 321, 311, -1, 310, + 321, 142, 246, 131, 311, 60, -1, 310, 140, 311, + -1, 322, -1, 336, -1, 168, 218, -1, -1, 151, + 312, 218, -1, 26, 404, 42, 225, 43, -1, -1, + 44, 104, 7, 73, 3, 42, 313, 225, 43, -1, + 30, 397, 95, 314, 132, -1, -1, 315, 316, -1, + -1, 318, -1, 316, 37, 318, -1, -1, 95, 316, + 132, -1, 319, 52, 341, 377, 320, -1, -1, 157, + -1, -1, 20, 227, -1, 139, -1, 97, -1, 69, + -1, 323, -1, 322, 91, 225, 130, -1, 324, -1, + 331, -1, -1, 327, 325, 326, -1, 329, -1, 333, + -1, 389, -1, 328, 36, -1, 14, -1, 13, -1, + 23, -1, 34, -1, 47, -1, 46, -1, 66, -1, + 122, -1, 67, -1, 123, -1, 115, -1, 137, -1, + -1, 22, 330, 333, -1, 333, -1, 389, -1, 332, + -1, 54, -1, 334, -1, 382, -1, 397, -1, 335, + -1, 144, -1, 9, -1, 10, -1, 337, -1, 336, + 91, 225, 130, -1, 338, -1, 340, -1, 342, -1, + 343, -1, 345, -1, 344, -1, 347, -1, 17, 229, + 95, 314, 132, -1, 339, -1, 404, -1, 12, -1, + 11, -1, 52, 341, -1, 7, -1, 405, -1, 95, + 225, 132, -1, 95, 132, -1, 53, -1, 194, 218, + -1, 399, 95, 346, 132, -1, -1, 227, -1, 226, + -1, 348, -1, 360, -1, 349, -1, 358, -1, 359, + -1, -1, -1, 77, 401, 350, 353, 351, 118, 353, + 352, -1, 128, -1, 75, 357, 27, 397, 75, -1, + -1, 353, 354, -1, 401, 73, 355, -1, 129, 356, + 129, -1, 16, 356, 16, -1, -1, 218, 356, -1, + 404, 356, -1, -1, 357, 348, -1, 357, 404, -1, + 357, 4, -1, 357, 218, -1, 39, 148, -1, 116, + 150, 149, -1, 361, -1, 362, -1, 365, -1, 366, + -1, 367, -1, 368, -1, 375, -1, 50, 364, 218, + -1, -1, 55, 364, 372, 363, 305, -1, -1, 166, + -1, 23, 364, 369, 305, -1, 153, 364, 218, -1, + 38, 364, 218, -1, 126, 374, 305, -1, -1, -1, + 370, 397, 371, -1, 373, -1, 397, -1, 373, -1, + 218, -1, 7, -1, 218, -1, 104, 218, 218, -1, + 381, -1, 381, 127, -1, -1, 18, 378, -1, 380, + 379, -1, 58, 395, -1, -1, 117, -1, 144, -1, + 127, -1, 381, -1, 382, -1, 389, -1, 89, 395, + -1, 397, -1, 384, -1, 392, -1, 394, -1, 388, + -1, 387, -1, 386, -1, 383, -1, 106, 395, -1, + 51, 395, -1, 51, 95, 385, 132, -1, 392, -1, + 394, -1, 153, 395, -1, 38, 395, -1, 126, 395, + -1, 126, 95, 7, 132, -1, 126, 95, 404, 132, + -1, 390, -1, 391, -1, 23, 395, -1, 23, 95, + 144, 132, -1, 23, 95, 396, 132, -1, 23, 95, + 396, 37, 398, 132, -1, 23, 95, 144, 37, 398, + 132, -1, 134, 95, 397, 132, -1, 55, 395, -1, + 55, 95, 144, 132, -1, 55, 95, 397, 132, -1, + 55, 95, 397, 37, 398, 393, 132, -1, 55, 95, + 144, 37, 398, 393, 132, -1, -1, 127, -1, 135, + 95, 397, 132, -1, 95, 132, -1, 7, -1, 405, + -1, 7, -1, 405, -1, 397, -1, 400, -1, 405, + -1, 7, -1, 167, 7, -1, 7, -1, 6, -1, + 7, -1, 405, -1, 404, -1, 3, -1, 5, -1, + 6, -1, 8, -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const yytype_uint16 yyrline[] = +{ + 0, 1375, 1375, 1376, 1378, 1379, 1410, 1411, 1427, 1525, + 1527, 1533, 1535, 1542, 1548, 1554, 1561, 1564, 1568, 1572, + 1592, 1606, 1610, 1604, 1673, 1677, 1694, 1697, 1699, 1704, + 1705, 1709, 1710, 1714, 1718, 1722, 1724, 1725, 1727, 1729, + 1775, 1789, 1794, 1799, 1800, 1802, 1817, 1832, 1842, 1857, + 1861, 1866, 1880, 1884, 1889, 1903, 1908, 1913, 1918, 1923, + 1939, 1962, 1970, 1971, 1972, 1974, 1991, 1992, 1994, 1995, + 1997, 1998, 2000, 2055, 2059, 2065, 2068, 2073, 2087, 2091, + 2097, 2096, 2205, 2208, 2214, 2235, 2241, 2245, 2247, 2252, + 2262, 2263, 2268, 2269, 2278, 2348, 2359, 2360, 2364, 2369, + 2438, 2439, 2443, 2448, 2492, 2493, 2498, 2505, 2511, 2512, + 2513, 2514, 2515, 2516, 2522, 2527, 2533, 2536, 2541, 2547, + 2553, 2557, 2582, 2583, 2587, 2591, 2585, 2632, 2635, 2630, + 2651, 2652, 2653, 2656, 2660, 2668, 2667, 2681, 2680, 2689, + 2690, 2691, 2693, 2701, 2712, 2715, 2717, 2722, 2729, 2736, + 2742, 2762, 2767, 2773, 2776, 2778, 2779, 2786, 2792, 2796, + 2801, 2802, 2805, 2809, 2804, 2819, 2823, 2818, 2831, 2834, + 2838, 2833, 2848, 2852, 2847, 2860, 2862, 2890, 2889, 2901, + 2909, 2900, 2920, 2921, 2924, 2928, 2933, 2938, 2937, 2953, + 2959, 2960, 2966, 2967, 2973, 2974, 2975, 2976, 2978, 2979, + 2985, 2986, 2992, 2993, 2995, 2996, 3002, 3003, 3004, 3005, + 3007, 3008, 3018, 3019, 3025, 3026, 3028, 3032, 3037, 3038, + 3045, 3046, 3052, 3053, 3059, 3060, 3066, 3067, 3073, 3077, + 3082, 3083, 3084, 3086, 3092, 3093, 3094, 3095, 3096, 3097, + 3099, 3104, 3105, 3106, 3107, 3108, 3109, 3111, 3116, 3117, + 3118, 3120, 3134, 3135, 3136, 3138, 3155, 3159, 3164, 3165, + 3167, 3172, 3173, 3175, 3181, 3185, 3191, 3194, 3195, 3199, + 3208, 3213, 3217, 3218, 3223, 3222, 3237, 3245, 3244, 3260, + 3268, 3268, 3277, 3279, 3282, 3287, 3289, 3293, 3359, 3362, + 3368, 3371, 3380, 3384, 3388, 3393, 3394, 3399, 3400, 3403, + 3402, 3432, 3434, 3435, 3437, 3481, 3482, 3483, 3484, 3485, + 3486, 3487, 3488, 3489, 3490, 3491, 3492, 3495, 3494, 3505, + 3516, 3521, 3523, 3528, 3529, 3534, 3538, 3540, 3544, 3553, + 3560, 3561, 3567, 3568, 3569, 3570, 3571, 3572, 3573, 3574, + 3584, 3585, 3590, 3595, 3601, 3607, 3612, 3617, 3622, 3628, + 3633, 3638, 3668, 3672, 3679, 3681, 3685, 3690, 3691, 3692, + 3726, 3735, 3724, 3976, 3980, 4000, 4003, 4009, 4014, 4019, + 4025, 4028, 4038, 4045, 4049, 4055, 4069, 4075, 4092, 4097, + 4110, 4111, 4112, 4113, 4114, 4115, 4116, 4118, 4126, 4125, + 4165, 4168, 4173, 4188, 4193, 4200, 4212, 4216, 4212, 4222, + 4224, 4228, 4230, 4245, 4249, 4258, 4263, 4267, 4273, 4276, + 4281, 4286, 4291, 4292, 4293, 4294, 4296, 4297, 4298, 4299, + 4304, 4340, 4341, 4342, 4343, 4344, 4345, 4346, 4348, 4353, + 4358, 4364, 4365, 4367, 4372, 4377, 4382, 4387, 4403, 4404, + 4406, 4411, 4416, 4420, 4432, 4445, 4455, 4460, 4465, 4470, + 4484, 4498, 4499, 4501, 4511, 4513, 4518, 4525, 4532, 4534, + 4536, 4537, 4539, 4543, 4548, 4549, 4551, 4557, 4559, 4561, + 4565, 4570, 4582 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "$undefined", "\"\"", + "\"\"", "\"\"", + "\"QName\"", "\"NCName\"", "\"ClarkName\"", "ANY_LOCAL_NAME", + "ANY_PREFIX", "\"\"", "\"\"", + "\"ancestor\"", "\"ancestor-or-self\"", "\"and\"", "\"'\"", + "\"apply-template\"", "\"as\"", "\"ascending\"", "\":=\"", "\"at\"", + "\"@\"", "\"attribute\"", "AVT", "\"|\"", "\"base-uri\"", "\">\"", "\"for-apply-template\"", "\"for\"", + "\"function\"", "\"ge\"", "\"=\"", "\">=\"", "\">\"", "\"<=\"", "\"<\"", + "\"!=\"", "\"greatest\"", "\"gt\"", "\"idiv\"", "\"if\"", "\"import\"", + "\"inherit\"", "\"in\"", "\"instance\"", "\"intersect\"", "\"is\"", + "\"item\"", "\"lax\"", "\"[\"", "\"least\"", "\"le\"", "\"let\"", + "\"(\"", "\"lt\"", "\"map\"", "\"matches\"", "\"-\"", "\"mode\"", + "\"mod\"", "\"module\"", "\"name\"", "\"namespace\"", "\"ne\"", + "\"node\"", "\"no-inherit\"", "\"no-preserve\"", "\"of\"", "\"option\"", + "\"ordered\"", "\"ordering\"", "\"order\"", "\"or\"", "\"parent\"", + "\"\"", "\"\\\"\"", "\"]\"", + "\"return\"", "\")\"", "\"satisfies\"", "\"schema-attribute\"", + "\"schema-element\"", "\"schema\"", "\"self\"", "\";\"", "\"/\"", + "\"//\"", "\"some\"", "\"sort\"", "\"stable\"", "\"*\"", "\"strict\"", + "\"strip\"", "SUCCESS", "COMMENT_CONTENT", "PI_CONTENT", "PI_TARGET", + "XSLT_VERSION", "\"template\"", "\"text\"", "\"then\"", "\"to\"", + "\"treat\"", "\"tunnel\"", "\"typeswitch\"", "\"union\"", + "\"unordered\"", "\"validate\"", "\"variable\"", "\"version\"", + "\"where\"", "\"xquery\"", "\"internal\"", "\"internal-name\"", + "\"current\"", "$accept", "Module", "VersionDecl", "Encoding", + "MainModule", "LibraryModule", "ModuleDecl", "Prolog", "TemplateDecl", + "@1", "@2", "OptionalPriority", "OptionalTemplateName", "TemplateName", + "Setter", "Import", "Separator", "NamespaceDecl", "BoundarySpaceDecl", + "BoundarySpacePolicy", "DefaultNamespaceDecl", + "DeclareDefaultElementNamespace", "DeclareDefaultFunctionNamespace", + "OptionDecl", "OrderingModeDecl", "OrderingMode", "EmptyOrderDecl", + "OrderingEmptySequence", "CopyNamespacesDecl", "PreserveMode", + "InheritMode", "DefaultCollationDecl", "BaseURIDecl", "SchemaImport", + "SchemaPrefix", "ModuleImport", "ModuleNamespaceDecl", "FileLocations", + "FileLocation", "VarDecl", "VariableValue", "OptionalDefaultValue", + "ConstructionDecl", "ConstructionMode", "FunctionDecl", "@3", + "ParamList", "Param", "FunctionBody", "EnclosedExpr", "QueryBody", + "Pattern", "PathPattern", "IdKeyPattern", "RelativePathPattern", + "PatternStep", "Expr", "ExpressionSequence", "ExprSingle", + "OptionalModes", "OptionalMode", "Modes", "Mode", "FLWORExpr", + "ForClause", "@4", "@5", "ForTail", "@6", "@7", "PositionalVar", + "LetClause", "@8", "LetTail", "@9", "WhereClause", "OrderByClause", + "MandatoryOrderByClause", "OrderSpecList", "OrderSpec", + "DirectionModifier", "EmptynessModifier", "CollationModifier", + "OrderByInputOrder", "QuantifiedExpr", "SomeQuantificationExpr", "@10", + "@11", "SomeQuantificationTail", "@12", "@13", "EveryQuantificationExpr", + "@14", "@15", "EveryQuantificationTail", "@16", "@17", "SatisfiesClause", + "TypeswitchExpr", "@18", "CaseClause", "@19", "@20", "CaseTail", + "CaseVariable", "CaseDefault", "@21", "IfExpr", "OrExpr", "AndExpr", + "ComparisonExpr", "RangeExpr", "AdditiveExpr", "AdditiveOperator", + "MultiplicativeExpr", "MultiplyOperator", "UnionExpr", + "IntersectExceptExpr", "UnionOperator", "IntersectOperator", + "InstanceOfExpr", "TreatExpr", "CastableExpr", "CastExpr", "UnaryExpr", + "UnaryOperator", "ValueExpr", "GeneralComp", "GeneralComparisonOperator", + "ValueComp", "ValueComparisonOperator", "NodeComp", "NodeOperator", + "ValidateExpr", "ValidationMode", "ExtensionExpr", + "EnclosedOptionalExpr", "Pragmas", "Pragma", "PragmaContents", + "PathExpr", "RelativePathExpr", "StepExpr", "@22", "@23", + "TemplateWithParameters", "@24", "TemplateParameters", + "OptionalTemplateParameters", "TemplateParameter", "IsTunnel", + "OptionalAssign", "MapOrSlash", "FilteredAxisStep", "AxisStep", + "ForwardStep", "@25", "NodeTestInAxisStep", "Axis", "AxisToken", + "AbbrevForwardStep", "@26", "ReverseStep", "AbbrevReverseStep", + "NodeTest", "NameTest", "WildCard", "FilterExpr", "PrimaryExpr", + "Literal", "NumericLiteral", "VarRef", "VarName", "ParenthesizedExpr", + "ContextItemExpr", "OrderingExpr", "FunctionCallExpr", + "FunctionArguments", "Constructor", "DirectConstructor", + "DirElemConstructor", "@27", "@28", "DirElemConstructorTail", + "DirAttributeList", "Attribute", "DirAttributeValue", "AttrValueContent", + "DirElemContent", "DirCommentConstructor", "DirPIConstructor", + "ComputedConstructor", "CompDocConstructor", "CompElemConstructor", + "@29", "IsInternal", "CompAttrConstructor", "CompTextConstructor", + "CompCommentConstructor", "CompPIConstructor", "CompAttributeName", + "@30", "@31", "CompElementName", "CompNameExpr", "CompPIName", + "CompNamespaceConstructor", "SingleType", "TypeDeclaration", + "SequenceType", "OccurrenceIndicator", "ItemType", "AtomicType", + "KindTest", "AnyKindTest", "DocumentTest", "AnyElementTest", "TextTest", + "CommentTest", "PITest", "AnyAttributeTest", "AttributeTest", + "SchemaAttributeTest", "ElementTest", "OptionalQuestionMark", + "SchemaElementTest", "EmptyParanteses", "AttributeName", "ElementName", + "TypeName", "FunctionName", "NCName", "LexicalName", "PragmaName", + "URILiteral", "StringLiteral", "QName", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, + 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, + 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, + 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, + 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, + 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 418, 419, 420, 421, 422, 423 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint16 yyr1[] = +{ + 0, 169, 170, 170, 171, 171, 172, 172, 173, 174, + 175, 176, 176, 176, 176, 176, 176, 176, 176, 176, + 177, 178, 179, 177, 180, 180, 181, 181, 182, 183, + 183, 183, 183, 183, 183, 183, 184, 184, 185, 186, + 187, 188, 188, 189, 189, 190, 191, 192, 193, 194, + 194, 195, 196, 196, 197, 198, 198, 199, 199, 200, + 201, 202, 203, 203, 203, 204, 205, 205, 206, 206, + 207, 207, 208, 209, 209, 210, 210, 211, 212, 212, + 214, 213, 215, 215, 215, 216, 217, 217, 218, 219, + 220, 220, 221, 221, 221, 221, 221, 221, 221, 222, + 223, 223, 223, 224, 225, 225, 226, 226, 227, 227, + 227, 227, 227, 227, 228, 228, 229, 229, 230, 230, + 231, 231, 232, 232, 234, 235, 233, 237, 238, 236, + 236, 236, 236, 239, 239, 241, 240, 243, 242, 242, + 242, 242, 244, 244, 245, 245, 246, 247, 247, 248, + 249, 249, 249, 250, 250, 251, 251, 251, 252, 252, + 253, 253, 255, 256, 254, 258, 259, 257, 257, 261, + 262, 260, 264, 265, 263, 263, 266, 268, 267, 270, + 271, 269, 272, 272, 273, 273, 274, 275, 274, 276, + 277, 277, 278, 278, 279, 279, 279, 279, 280, 280, + 281, 281, 282, 282, 283, 283, 284, 284, 284, 284, + 285, 285, 286, 286, 287, 287, 288, 288, 289, 289, + 290, 290, 291, 291, 292, 292, 293, 293, 294, 294, + 295, 295, 295, 296, 297, 297, 297, 297, 297, 297, + 298, 299, 299, 299, 299, 299, 299, 300, 301, 301, + 301, 302, 303, 303, 303, 304, 305, 305, 306, 306, + 307, 308, 308, 309, 309, 309, 309, 310, 310, 310, + 310, 311, 311, 311, 312, 311, 311, 313, 311, 311, + 315, 314, 316, 316, 316, 317, 317, 318, 319, 319, + 320, 320, 321, 321, 321, 322, 322, 323, 323, 325, + 324, 324, 326, 326, 327, 328, 328, 328, 328, 328, + 328, 328, 328, 328, 328, 328, 328, 330, 329, 329, + 329, 331, 332, 333, 333, 334, 334, 335, 335, 335, + 336, 336, 337, 337, 337, 337, 337, 337, 337, 337, + 338, 338, 339, 339, 340, 341, 341, 342, 342, 343, + 344, 345, 346, 346, 346, 347, 347, 348, 348, 348, + 350, 351, 349, 352, 352, 353, 353, 354, 355, 355, + 356, 356, 356, 357, 357, 357, 357, 357, 358, 359, + 360, 360, 360, 360, 360, 360, 360, 361, 363, 362, + 364, 364, 365, 366, 367, 368, 370, 371, 369, 369, + 372, 372, 373, 374, 374, 375, 376, 376, 377, 377, + 378, 378, 379, 379, 379, 379, 380, 380, 380, 380, + 381, 382, 382, 382, 382, 382, 382, 382, 383, 384, + 384, 385, 385, 386, 387, 388, 388, 388, 389, 389, + 390, 390, 390, 390, 390, 391, 392, 392, 392, 392, + 392, 393, 393, 394, 395, 396, 396, 397, 397, 398, + 399, 399, 400, 400, 401, 401, 402, 402, 403, 404, + 404, 405, 405 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 2, 2, 0, 5, 0, 2, 2, 2, + 6, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 7, 0, 0, 15, 0, 2, 0, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, + 4, 1, 1, 1, 1, 6, 6, 5, 4, 1, + 1, 5, 2, 2, 6, 1, 1, 1, 1, 5, + 5, 6, 0, 3, 3, 6, 0, 3, 0, 2, + 1, 3, 9, 1, 2, 0, 2, 4, 1, 1, + 0, 11, 0, 1, 3, 3, 1, 1, 3, 1, + 1, 3, 1, 1, 2, 2, 1, 3, 3, 1, + 1, 3, 3, 1, 1, 1, 3, 3, 1, 1, + 1, 1, 1, 4, 0, 2, 0, 2, 1, 3, + 1, 1, 1, 1, 0, 0, 10, 0, 0, 10, + 1, 1, 1, 0, 3, 0, 9, 0, 8, 1, + 1, 1, 3, 5, 0, 1, 2, 3, 1, 4, + 0, 1, 1, 0, 1, 0, 2, 3, 3, 2, + 1, 1, 0, 0, 9, 0, 0, 9, 1, 0, + 0, 9, 0, 0, 9, 1, 2, 0, 6, 0, + 0, 8, 1, 1, 0, 3, 3, 0, 6, 8, + 1, 3, 1, 3, 1, 1, 1, 1, 1, 3, + 1, 3, 1, 1, 1, 3, 1, 1, 1, 1, + 1, 3, 1, 3, 1, 1, 1, 1, 1, 4, + 1, 4, 1, 4, 1, 4, 1, 2, 1, 1, + 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, + 3, 1, 1, 1, 1, 1, 1, 3, 1, 1, + 1, 2, 1, 2, 2, 2, 2, 3, 2, 1, + 4, 0, 1, 2, 2, 1, 1, 1, 3, 7, + 3, 1, 1, 2, 0, 3, 5, 0, 9, 5, + 0, 2, 0, 1, 3, 0, 3, 5, 0, 1, + 0, 2, 1, 1, 1, 1, 4, 1, 1, 0, + 3, 1, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 3, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 1, 1, 1, 1, 1, 1, 1, 5, + 1, 1, 1, 1, 2, 1, 1, 3, 2, 1, + 2, 4, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 8, 1, 5, 0, 2, 3, 3, 3, + 0, 2, 2, 0, 2, 2, 2, 2, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 3, 0, 5, + 0, 1, 4, 3, 3, 3, 0, 0, 3, 1, + 1, 1, 1, 1, 1, 3, 1, 2, 0, 2, + 2, 2, 0, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + 4, 1, 1, 2, 2, 2, 4, 4, 1, 1, + 2, 4, 4, 6, 6, 4, 2, 4, 4, 7, + 7, 0, 1, 4, 2, 1, 1, 1, 1, 1, + 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const yytype_uint16 yydefact[] = +{ + 4, 0, 0, 11, 0, 1, 0, 3, 2, 11, + 0, 469, 470, 6, 0, 9, 471, 457, 472, 328, + 329, 343, 342, 306, 305, 116, 317, 390, 0, 0, + 0, 308, 390, 0, 0, 310, 309, 390, 0, 0, + 349, 322, 390, 0, 311, 313, 0, 0, 0, 0, + 390, 0, 229, 0, 0, 49, 315, 0, 228, 0, + 312, 314, 0, 0, 0, 316, 265, 0, 0, 327, + 274, 390, 0, 50, 252, 0, 0, 16, 13, 15, + 14, 29, 12, 43, 44, 19, 33, 0, 34, 35, + 30, 31, 36, 37, 17, 32, 18, 8, 89, 105, + 104, 109, 122, 123, 110, 160, 161, 111, 112, 108, + 190, 192, 194, 198, 200, 204, 210, 212, 218, 220, + 222, 224, 0, 226, 196, 195, 197, 230, 0, 232, + 0, 259, 231, 266, 267, 271, 295, 297, 299, 0, + 301, 298, 321, 319, 323, 326, 272, 330, 332, 340, + 333, 334, 335, 337, 336, 338, 355, 357, 358, 359, + 356, 380, 381, 382, 383, 384, 385, 386, 324, 427, + 421, 426, 425, 424, 320, 438, 439, 422, 423, 325, + 0, 460, 341, 458, 0, 0, 0, 0, 0, 0, + 0, 0, 391, 396, 440, 370, 0, 457, 0, 458, + 0, 0, 434, 378, 390, 0, 0, 0, 0, 390, + 0, 0, 0, 26, 390, 0, 0, 429, 345, 344, + 346, 0, 0, 446, 0, 0, 465, 464, 360, 0, + 66, 62, 0, 0, 348, 0, 0, 0, 428, 0, + 466, 261, 467, 403, 0, 404, 0, 435, 0, 0, + 263, 264, 0, 0, 0, 433, 0, 254, 253, 463, + 273, 350, 0, 0, 0, 0, 241, 250, 243, 234, + 236, 237, 238, 239, 235, 244, 248, 245, 246, 242, + 249, 0, 0, 0, 203, 202, 0, 0, 207, 208, + 209, 206, 0, 215, 214, 0, 217, 216, 0, 0, + 0, 0, 0, 227, 251, 0, 255, 258, 294, 293, + 292, 0, 0, 0, 0, 304, 0, 352, 7, 38, + 5, 0, 0, 121, 117, 120, 280, 0, 0, 0, + 0, 318, 455, 454, 0, 0, 456, 402, 0, 0, + 399, 370, 0, 370, 0, 280, 394, 0, 42, 41, + 0, 79, 78, 0, 56, 55, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 285, 0, 387, + 0, 431, 432, 0, 0, 388, 401, 400, 408, 408, + 365, 0, 0, 0, 0, 0, 0, 0, 0, 347, + 0, 405, 379, 0, 262, 0, 0, 395, 0, 0, + 408, 275, 393, 0, 107, 106, 191, 193, 233, 240, + 247, 199, 201, 205, 211, 213, 0, 0, 0, 0, + 256, 0, 270, 0, 268, 0, 0, 300, 302, 303, + 0, 354, 353, 0, 0, 468, 0, 0, 282, 0, + 441, 0, 442, 392, 397, 371, 113, 372, 0, 0, + 0, 40, 77, 0, 0, 0, 0, 0, 0, 462, + 0, 461, 0, 0, 48, 28, 0, 282, 408, 0, + 430, 0, 447, 0, 448, 0, 0, 0, 133, 361, + 0, 0, 68, 0, 0, 68, 408, 0, 88, 260, + 436, 437, 445, 453, 0, 177, 0, 0, 219, 412, + 416, 417, 418, 420, 221, 223, 406, 225, 257, 0, + 0, 0, 0, 296, 331, 351, 10, 0, 339, 289, + 281, 283, 0, 459, 0, 0, 398, 276, 279, 60, + 57, 58, 0, 59, 0, 0, 53, 52, 51, 82, + 469, 390, 47, 21, 0, 0, 408, 451, 451, 389, + 409, 0, 0, 0, 0, 366, 0, 0, 67, 0, + 0, 63, 64, 0, 0, 0, 0, 0, 411, 419, + 413, 415, 414, 410, 407, 159, 0, 0, 150, 146, + 148, 288, 0, 444, 443, 54, 45, 46, 0, 0, + 83, 277, 0, 0, 286, 0, 0, 452, 0, 0, + 169, 0, 0, 365, 0, 0, 69, 70, 65, 61, + 0, 0, 162, 184, 178, 158, 0, 151, 152, 153, + 0, 284, 408, 408, 0, 80, 0, 39, 307, 93, + 0, 22, 90, 96, 92, 100, 103, 99, 20, 0, + 73, 75, 450, 449, 170, 134, 124, 0, 370, 370, + 367, 0, 0, 135, 163, 0, 0, 269, 154, 155, + 147, 290, 85, 84, 408, 0, 94, 95, 0, 0, + 0, 0, 0, 0, 74, 0, 0, 0, 125, 373, + 363, 362, 0, 0, 189, 71, 144, 0, 0, 179, + 0, 0, 149, 0, 287, 0, 278, 91, 114, 97, + 98, 101, 102, 76, 72, 0, 0, 171, 175, 144, + 0, 369, 368, 0, 0, 140, 141, 136, 139, 0, + 145, 0, 164, 168, 185, 0, 156, 0, 291, 86, + 0, 87, 0, 24, 0, 176, 0, 131, 126, 132, + 130, 376, 0, 377, 374, 375, 0, 144, 0, 0, + 0, 157, 81, 115, 118, 0, 285, 408, 0, 0, + 408, 0, 142, 408, 180, 0, 25, 408, 0, 408, + 364, 0, 0, 0, 0, 119, 0, 0, 133, 0, + 143, 0, 0, 182, 181, 183, 0, 172, 0, 137, + 165, 0, 0, 23, 173, 0, 144, 166, 187, 186, + 0, 127, 138, 0, 0, 174, 128, 167, 0, 144, + 188, 129 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int16 yydefgoto[] = +{ + -1, 2, 3, 185, 7, 8, 9, 10, 77, 593, + 669, 756, 366, 367, 78, 79, 320, 80, 81, 350, + 82, 83, 84, 85, 86, 87, 88, 458, 89, 356, + 532, 90, 91, 92, 386, 93, 383, 560, 606, 94, + 641, 676, 95, 353, 96, 664, 589, 590, 730, 341, + 97, 631, 632, 633, 634, 635, 98, 99, 100, 733, + 189, 753, 324, 101, 102, 678, 709, 738, 806, 809, + 553, 103, 686, 717, 796, 718, 719, 720, 579, 580, + 619, 659, 692, 512, 104, 105, 654, 687, 722, 797, + 803, 106, 644, 677, 707, 794, 800, 708, 107, 567, + 614, 725, 774, 784, 656, 785, 804, 108, 109, 110, + 111, 112, 113, 287, 114, 292, 115, 116, 295, 298, + 117, 118, 119, 120, 121, 122, 123, 124, 281, 125, + 282, 126, 283, 127, 128, 129, 306, 130, 131, 393, + 132, 133, 134, 253, 626, 437, 438, 520, 468, 521, + 522, 694, 312, 135, 136, 137, 314, 427, 138, 139, + 140, 190, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 219, 151, 152, 153, 154, 433, 155, 156, + 157, 380, 554, 681, 479, 555, 650, 342, 710, 158, + 159, 160, 161, 162, 475, 193, 163, 164, 165, 166, + 338, 339, 526, 375, 340, 246, 167, 505, 477, 498, + 573, 499, 500, 168, 169, 170, 370, 171, 172, 173, + 174, 175, 176, 177, 598, 178, 194, 335, 179, 524, + 180, 181, 556, 241, 541, 182, 183 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -668 +static const yytype_int16 yypact[] = +{ + -63, -28, 185, 86, 337, -668, 117, -668, -668, -668, + 734, -668, -668, 181, 253, 156, -668, 213, -668, -668, + -668, -668, -668, -668, -668, 212, -668, -12, 230, 337, + 342, -668, -38, 189, 298, -668, -668, 188, 272, 353, + -668, -668, 71, 316, -668, -668, 318, 239, 276, 134, + 188, 900, -668, 334, 282, -668, -668, 233, -668, 367, + -668, -668, 133, 290, 295, -668, 1730, 1730, 345, -668, + -668, -38, 305, -668, -36, 396, 334, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -668, 334, -668, -668, + -668, -668, -668, -668, -668, -668, -668, -668, -668, 369, + 370, -668, -668, -668, -668, -668, -668, -668, -668, 307, + 389, -668, 601, 173, 24, -22, 32, -668, 338, 267, + 393, 394, 1398, -668, -668, -668, -668, -668, 334, -668, + 59, -668, -668, 166, -668, 339, -668, -668, -668, 395, + -668, -668, -668, -668, -668, -668, 341, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, + 340, -668, -668, 347, 337, 291, 360, 493, 373, 349, + 1885, 64, -668, 334, -668, 226, 392, -668, 358, -668, + 304, 334, -668, -668, 188, 167, 174, 206, 21, 188, + 430, 342, -53, 351, 188, 334, 6, -668, -668, -668, + -668, 79, 287, -668, 353, 353, -668, -668, -668, 1232, + 336, 18, 403, 344, -668, 324, 1232, 334, -668, 308, + -668, 337, -668, -668, 23, -668, 416, -668, 342, 342, + 166, 166, 353, 334, 334, -668, 1232, -668, -668, -668, + -668, -668, 1232, 1232, 1398, 1398, -668, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -668, -668, -668, -668, + -668, 1398, 1398, 1398, -668, -668, 1398, 1398, -668, -668, + -668, -668, 1398, -668, -668, 1398, -668, -668, 1398, 352, + 447, 448, 449, -668, -668, 1066, -668, -668, -668, -668, + -668, 1730, 1564, 1232, 108, -668, 1232, 1232, -668, -668, + -668, 337, 461, -668, -668, -668, -668, 282, 374, 378, + 282, -668, -668, -668, 0, 51, -668, -668, 416, 342, + -668, 226, 343, 226, 1232, -668, -668, 337, -668, -668, + 291, -668, -668, 291, -668, -668, 437, 337, 372, 376, + 421, 26, 408, 337, 291, 342, 384, -1, 431, -668, + 355, -668, -668, 52, 69, -668, -668, -668, 466, 466, + -668, 356, 482, 337, 435, 484, 337, 353, 485, -668, + 453, -668, -668, 379, -668, 365, 368, -668, 371, 377, + 466, -668, -668, 380, -668, -668, 389, -668, -668, -668, + -668, 168, 24, -22, 32, -668, 456, 456, 342, 342, + -668, 459, -668, 191, -668, 375, 404, -668, -668, -668, + 383, 369, 370, 386, 291, -668, 442, 388, -6, 342, + -668, 342, -668, -668, -668, -668, -668, -668, 465, 391, + 291, -668, -668, 157, 291, 337, 337, 16, 291, -668, + 409, -668, 348, 291, -668, -668, 415, -6, 466, 353, + -668, 342, -668, 342, -668, 416, 456, 440, 495, 239, + 381, 454, 507, 425, 457, 507, 466, 463, -668, -668, + -668, -668, -668, -668, 462, -668, 282, 282, -668, 121, + -668, -668, -668, -668, -668, -668, 412, -668, -668, 512, + 433, 417, 1232, -668, -668, -668, -668, 337, -668, -668, + 513, -668, 497, -668, 422, 423, -668, -668, -668, -668, + -668, -668, 291, -668, 291, 291, -668, -668, -668, 504, + 515, 188, -668, -668, 83, 416, 466, 432, 432, -668, + -668, 1232, 508, 476, 450, -668, 492, 1232, -668, 337, + 291, -668, -668, 291, 547, 566, 1232, 539, -668, -668, + -668, -668, -668, -668, -668, -668, 543, 1730, 62, 536, + -668, 419, 353, -668, -668, -668, -668, -668, 353, 84, + -668, -668, 291, 1804, -668, 291, 46, -668, 445, 446, + -668, 353, 1232, -668, 33, 524, 550, -668, -668, -668, + 1232, 515, -668, 537, -668, -668, 528, -668, -668, 421, + 1232, -668, 466, 466, 504, -668, 1232, -668, 404, 1899, + 1899, 567, -668, 140, 148, -668, 339, -668, -668, 1232, + -668, 573, -668, -668, -668, -668, -668, 92, 226, 226, + -668, 1232, 337, -668, -668, 342, 456, -668, -668, -23, + -668, 574, -668, -668, 466, 552, 148, 148, 1804, 464, + 1899, 1899, 1899, 1899, -668, 1232, 291, 11, -668, -668, + -668, -668, 582, 472, -668, -668, 10, 47, 584, -668, + 337, 569, -668, 1232, -668, 234, -668, -668, 506, 148, + 148, -668, -668, -668, -668, 555, 1232, -668, -668, 63, + 250, -668, -668, 556, 1232, -668, -668, -668, -668, 479, + -668, 559, -668, -668, -668, 481, -668, 1232, -668, -668, + 291, -668, 373, 488, 353, -668, 562, -668, -668, -668, + -668, -668, 342, -668, -668, -668, 353, 191, 1232, 353, + 1232, -668, -668, 578, -668, 337, 521, 466, 353, 542, + 466, 487, -668, 466, -668, 373, -668, 466, 534, 466, + -668, 600, 1232, 538, 125, -668, 416, 1232, 495, 1232, + -668, 1232, -2, -668, -668, -668, 291, -668, 544, -668, + -668, 342, 1232, -668, -668, 1232, 10, -668, -668, -668, + 11, -668, -668, 47, 490, -668, -668, -668, 1232, 63, + -668, -668 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yytype_int16 yypgoto[] = +{ + -668, -668, -668, -668, -668, -668, -668, 613, -668, -668, + -668, -668, -668, -668, -668, -668, -285, -668, -668, -668, + -668, -668, -668, -668, -668, 418, -668, 5, -668, -668, + -668, -668, -668, -668, -668, -668, -668, 142, -668, -668, + -668, -668, -668, -668, -668, -668, -668, 4, -668, -51, + -668, -668, -35, -668, -397, -340, -47, 317, -255, -668, + -668, -668, -641, -668, -619, -668, -668, -174, -668, -668, + -142, -583, -668, -159, -668, -657, -109, 216, -668, 27, + -668, -668, -668, -668, -668, -668, -668, -668, -157, -668, + -668, -668, -668, -668, -152, -668, -668, -667, -668, -668, + -125, -668, -668, -668, -668, -668, -668, -668, -668, 387, + 385, 131, 366, -668, 397, -668, 361, 359, -668, -668, + 362, -668, -668, -668, 535, -668, -668, -668, -668, -668, + -668, -668, -668, -668, -668, -668, -245, -668, 526, -668, + -668, 279, -294, -668, -668, 313, -668, 194, -91, 85, + -668, -668, -668, -87, -668, -668, -668, -668, -668, -668, + -668, -668, -668, -668, -175, -668, -668, -668, -668, -668, + -668, -668, -183, -668, -668, -668, -538, -668, -668, -42, + -668, -668, -668, -668, 67, -668, -668, -327, -668, -668, + -668, -668, -668, -668, -668, 3, -668, -668, -668, -668, + -668, -668, -668, -668, 458, -668, -668, 252, -341, -412, + -668, -668, -55, -394, -668, -668, -668, -668, -668, -668, + -304, -668, -668, 467, 124, 469, -11, -668, -24, -170, + 321, -668, 639, -668, -308, 15, -30 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -463 +static const yytype_int16 yytable[] = +{ + 199, 397, 237, 293, 235, 504, 198, 404, 405, 220, + 429, 245, 690, 434, 445, 331, 447, 422, 424, 13, + 723, 202, 501, 501, -307, 260, 11, 217, 12, 242, + 395, 223, 16, 459, 18, 201, 261, 439, 478, 450, + 215, 378, 379, 238, 196, 222, -288, 713, 705, 648, + 791, 247, 740, 232, 257, 637, 357, 200, 55, 494, + 255, 328, 432, 384, 550, 451, 639, 715, 452, 400, + 16, 332, 18, 288, 254, 482, 358, 304, 485, 464, + 46, 617, 501, 191, 721, 16, 197, 18, 441, 471, + 737, 754, 359, 443, 467, 536, 296, -27, 226, 227, + 736, 305, 1, 716, 50, 289, 473, 73, 537, 258, + 618, 640, 502, 502, 16, 197, 18, 19, 20, 297, + 581, 624, 385, 509, 775, 290, 739, 545, 192, 792, + 637, 426, 440, 46, 360, 4, 723, 294, 333, 428, + 243, 64, 337, 691, 706, 564, 327, 534, 535, 516, + 346, 519, 740, 510, 192, 333, 613, 50, 325, 38, + 199, 336, 649, 328, 369, 529, 221, 679, 291, 533, + 782, 337, 502, 538, 714, 236, 509, 715, 542, 59, + 706, 199, 381, 442, 472, 5, 391, 363, 6, 390, + 737, 199, 199, 75, 220, 220, 333, 374, 377, 318, + 187, 474, 401, 402, 486, 596, 510, 347, 334, 403, + 343, 333, 361, 716, 54, 594, 625, 368, 199, 199, + 680, 14, 220, 373, 398, 399, 739, 714, 244, 11, + 549, 12, 666, 667, 329, 308, 230, 192, 570, 49, + 184, 530, 63, 64, 689, 226, 227, 585, 571, 586, + 587, 607, 69, 11, 741, 12, 394, 578, 421, 396, + 186, 330, 501, 309, 531, 572, 425, 284, 236, 430, + 231, 525, 284, 699, 700, 608, 236, 742, 609, 670, + 671, 661, 662, 616, 199, 285, 546, 672, 673, 33, + 285, 348, 236, 16, 197, 18, 600, 448, 351, 729, + 595, 547, 605, 548, 509, 310, 311, 627, -462, 199, + 638, 612, 188, 349, 354, 444, 202, 223, 247, 255, + 352, 682, 683, 695, 204, 195, 205, 47, 286, 236, + 355, 461, 701, 702, 510, 199, 435, 203, 206, 207, + 11, 465, 12, 208, 685, 250, 251, 646, 16, 197, + 18, 540, 502, 12, 192, 653, 343, 220, 343, 16, + 218, 18, 435, 506, 506, 578, 57, 216, 224, 209, + 225, 229, 454, 16, 240, 18, 236, 200, 463, 16, + 323, 18, 726, 239, 674, 248, 199, 199, 199, 199, + 249, 704, 503, 503, 503, 503, 684, 252, 435, 622, + 256, 435, 210, 259, 265, 623, 262, 263, 211, 199, + 212, 199, 408, 409, 410, 523, 768, 523, 645, 771, + 703, 264, 773, 300, 299, 301, 776, 302, 778, 319, + 313, 315, 316, 321, 344, 317, 333, 362, 728, 220, + 382, 199, -461, 199, 326, 752, 199, 523, 388, 523, + 213, 735, 503, 345, 365, 387, 389, 392, 305, 747, + 214, 416, 16, 197, 18, 417, 418, 419, 436, 221, + 435, 435, 751, 244, 453, 446, 455, 435, 457, 426, + 456, 462, 466, 469, 476, 568, 569, 470, 480, 481, + 483, 484, 487, 762, 327, 764, 488, 490, 489, 191, + 491, 793, 508, 492, 539, 513, 636, 38, 527, 493, + 543, 328, 495, 514, 496, 517, 552, 780, 515, 204, + 518, 205, 787, 528, 789, 551, 790, 558, 559, 561, + 562, 786, 435, 206, 207, 557, 565, 799, 208, 574, + 801, 575, 636, 636, 592, 497, 576, 566, 577, 582, + 581, 757, 220, 810, 583, 584, 588, 591, 220, 597, + 601, 602, 54, 760, 209, 604, 763, 610, 603, 611, + 613, 220, 615, 620, 435, 769, 519, 642, 643, 665, + 651, 636, 329, 636, 636, 636, 636, 652, 657, 655, + 63, 64, 668, 675, 693, 696, 698, 322, 711, 199, + 199, 712, 724, 211, 727, 212, 732, 734, 746, 330, + 748, 749, 750, 755, 758, 765, 467, 770, 772, 777, + 779, 808, 15, 781, 658, 199, 199, 563, 663, 795, + 364, 688, 503, 697, 431, 811, 788, 802, 761, 511, + 199, 199, 199, 199, 731, 213, 807, 660, 805, 783, + 407, 406, 411, 413, 414, 214, 307, 303, 449, 743, + 415, 544, 266, 343, 343, 767, 621, 435, 744, 267, + 647, 507, 599, 268, 269, 270, 271, 272, 273, 274, + 376, 275, 460, 371, 412, 372, 228, 0, 0, 276, + 0, 0, 0, 0, 277, 0, 0, 278, 0, 0, + 0, 0, 325, 0, 220, 435, 279, 0, 0, 0, + 0, 0, 199, 0, 0, 0, 220, 0, 759, 220, + 0, 0, 280, 0, 0, 745, 0, 0, 220, 0, + 0, 0, 0, 0, 0, 325, 0, 11, 0, 12, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, + 0, 25, 0, 0, 0, 0, 26, 27, 28, 0, + 29, 199, 0, 0, 30, 0, 0, 798, 31, 0, + 766, 0, 32, 33, 0, 0, 0, 0, 34, 0, + 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, + 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, + 44, 45, 0, 0, 46, 0, 0, 0, 0, 0, + 0, 47, 0, 0, 0, 0, 48, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, + 0, 0, 0, 52, 0, 0, 0, 0, 53, 0, + 54, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 58, 0, 0, 59, 0, 60, 61, 0, 0, + 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, + 0, 65, 0, 66, 67, 68, 0, 0, 69, 0, + 0, 0, 0, 0, 0, 70, 0, 71, 0, 0, + 0, 0, 72, 0, 73, 74, 0, 0, 0, 0, + 0, 75, 76, 11, 0, 12, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 0, 0, 25, 0, 0, + 0, 0, 26, 27, 28, 0, 29, 0, 0, 0, + 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, + 0, 0, 0, 0, 233, 0, 35, 36, 0, 0, + 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, + 0, 0, 0, 43, 0, 0, 44, 45, 0, 0, + 46, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, + 0, 0, 0, 0, 53, 0, 54, 0, 0, 0, + 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, + 59, 0, 60, 61, 0, 0, 62, 0, 0, 0, + 0, 0, 234, 0, 63, 64, 0, 65, 0, 66, + 67, 68, 0, 0, 69, 0, 0, 0, 0, 0, + 0, 70, 0, 71, 0, 0, 0, 0, 72, 0, + 73, 74, 0, 0, 0, 0, 0, 75, 76, 11, + 0, 12, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 0, 0, 25, 0, 0, 0, 0, 26, 27, + 28, 0, 29, 0, 0, 0, 30, 0, 0, 0, + 31, 0, 0, 0, 32, 33, 0, 0, 0, 420, + 233, 0, 35, 36, 0, 0, 37, 38, 39, 40, + 41, 42, 0, 0, 0, 0, 0, 0, 0, 43, + 0, 0, 44, 45, 0, 0, 46, 0, 0, 0, + 0, 0, 0, 47, 0, 0, 0, 0, 48, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 51, 0, 0, 0, 52, 0, 0, 0, 0, + 53, 0, 54, 0, 0, 0, 0, 55, 0, 0, + 0, 56, 57, 58, 0, 0, 59, 0, 60, 61, + 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, + 63, 64, 0, 65, 0, 66, 67, 68, 0, 0, + 69, 0, 0, 0, 0, 0, 0, 70, 0, 71, + 0, 0, 0, 0, 72, 0, 73, 74, 0, 0, + 0, 0, 0, 75, 76, 11, 0, 12, 16, 17, + 18, 19, 20, 21, 22, 23, 24, 0, 0, 25, + 0, 0, 0, 0, 26, 27, 28, 0, 29, 0, + 0, 0, 30, 0, 0, 0, 31, 0, 0, 0, + 32, 33, 0, 0, 0, 0, 233, 0, 35, 36, + 0, 0, 37, 38, 39, 40, 41, 42, 0, 0, + 0, 0, 0, 0, 0, 43, 0, 0, 44, 45, + 0, 0, 46, 0, 0, 0, 0, 0, 0, 47, + 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, + 0, 52, 0, 0, 0, 0, 53, 0, 54, 0, + 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, + 0, 0, 59, 0, 60, 61, 0, 0, 62, 0, + 0, 0, 0, 0, 0, 0, 63, 64, 0, 65, + 0, 66, 67, 68, 0, 0, 69, 0, 0, 0, + 0, 0, 0, 70, 0, 71, 0, 0, 0, 0, + 72, 0, 73, 74, 0, 0, 0, 0, 0, 75, + 76, 11, 0, 12, 16, 17, 18, 19, 20, 21, + 22, 23, 24, 0, 0, 25, 0, 0, 0, 0, + 26, 27, 0, 0, 29, 0, 0, 0, 30, 0, + 0, 0, 31, 0, 0, 0, 32, 33, 0, 0, + 0, 0, 233, 0, 35, 36, 0, 0, 37, 38, + 39, 40, 41, 42, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 44, 45, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 51, 0, 0, 0, 52, 0, 0, + 0, 0, 53, 0, 54, 0, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 58, 0, 0, 59, 0, + 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, + 0, 0, 63, 64, 0, 65, 0, 66, 67, 0, + 0, 0, 69, 0, 0, 0, 0, 0, 0, 70, + 0, 71, 0, 0, 0, 0, 0, 0, 73, 74, + 0, 0, 0, 0, 0, 75, 76, 11, 0, 12, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 0, + 0, 25, 0, 0, 0, 0, 26, 27, 0, 0, + 29, 0, 0, 0, 30, 0, 0, 0, 31, 0, + 0, 0, 32, 33, 0, 0, 0, 0, 233, 0, + 35, 36, 0, 0, 37, 38, 39, 40, 41, 42, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 44, 45, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, + 0, 0, 0, 0, 0, 0, 0, 0, 53, 0, + 54, 0, 0, 0, 0, 55, 0, 0, 0, 56, + 57, 0, 0, 0, 0, 0, 60, 61, 0, 0, + 62, 0, 0, 0, 0, 0, 0, 0, 63, 64, + 0, 65, 0, 0, 0, 0, 423, 0, 69, 0, + 0, 0, 0, 0, 0, 70, 0, 71, 0, 0, + 0, 0, 0, 0, 73, 0, 0, 0, 0, 0, + 0, 75, 76, 11, 0, 12, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 0, 0, 25, 0, 0, + 0, 0, 26, 27, 0, 0, 29, 0, 0, 0, + 30, 0, 0, 0, 31, 0, 0, 0, 32, 33, + 0, 0, 0, 0, 233, 0, 35, 36, 0, 0, + 37, 38, 39, 40, 41, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 44, 45, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, + 16, 17, 18, 19, 20, 0, 0, 23, 24, 0, + 0, 0, 0, 0, 0, 51, 26, 628, 0, 0, + 0, 0, 0, 0, 53, 0, 54, 0, 31, 0, + 0, 55, 327, 0, 0, 56, 57, 0, 0, 0, + 35, 36, 60, 61, 0, 38, 62, 0, 41, 328, + 0, 0, 0, 0, 63, 64, 0, 65, 0, 0, + 44, 45, 0, 0, 69, 0, 0, 0, 0, 0, + 0, 70, 0, 71, 0, 0, 0, 0, 0, 0, + 73, 16, 197, 18, 19, 20, 0, 75, 76, 0, + 0, 0, 0, 0, 0, 16, 197, 18, 19, 20, + 54, 0, 23, 24, 0, 0, 0, 0, 0, 56, + 0, 26, 628, 327, 0, 0, 60, 61, 0, 0, + 329, 0, 0, 31, 0, 0, 38, 327, 63, 64, + 328, 65, 0, 629, 630, 35, 36, 0, 69, 0, + 38, 0, 0, 41, 328, 0, 0, 330, 0, 0, + 0, 0, 0, 0, 0, 44, 45, 0, 0, 0, + 0, 75, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 54, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, + 0, 329, 0, 0, 56, 0, 0, 0, 0, 0, + 64, 60, 61, 0, 0, 329, 0, 0, 0, 69, + 0, 0, 0, 63, 64, 0, 65, 0, 330, 0, + 0, 0, 0, 69, 0, 0, 0, 0, 0, 0, + 0, 0, 330 +}; + +static const yytype_int16 yycheck[] = +{ + 30, 246, 53, 25, 51, 417, 30, 262, 263, 39, + 314, 62, 35, 321, 341, 190, 343, 311, 312, 4, + 687, 32, 416, 417, 36, 76, 3, 38, 5, 59, + 7, 42, 6, 7, 8, 32, 87, 37, 379, 347, + 37, 224, 225, 54, 29, 42, 52, 37, 37, 16, + 52, 62, 709, 50, 90, 593, 35, 95, 111, 400, + 71, 55, 317, 45, 476, 350, 20, 686, 353, 252, + 6, 7, 8, 49, 71, 383, 55, 128, 386, 364, + 70, 19, 476, 95, 37, 6, 7, 8, 37, 37, + 709, 732, 71, 338, 95, 79, 64, 98, 6, 7, + 37, 42, 165, 686, 94, 81, 37, 160, 92, 145, + 48, 65, 416, 417, 6, 7, 8, 9, 10, 87, + 37, 37, 104, 113, 765, 101, 709, 468, 166, 131, + 668, 23, 132, 70, 113, 163, 803, 159, 132, 314, + 7, 135, 193, 166, 133, 486, 38, 455, 456, 434, + 201, 157, 809, 143, 166, 132, 31, 94, 188, 51, + 190, 191, 129, 55, 215, 450, 95, 75, 144, 454, + 45, 222, 476, 458, 164, 42, 113, 796, 463, 120, + 133, 211, 229, 132, 132, 0, 237, 211, 102, 236, + 809, 221, 222, 167, 224, 225, 132, 221, 222, 184, + 44, 132, 253, 254, 387, 546, 143, 204, 144, 256, + 195, 132, 209, 796, 106, 132, 132, 214, 248, 249, + 128, 104, 252, 144, 248, 249, 809, 164, 95, 3, + 475, 5, 629, 630, 126, 69, 102, 166, 117, 83, + 59, 84, 134, 135, 656, 6, 7, 532, 127, 534, + 535, 559, 144, 3, 4, 5, 241, 512, 305, 244, + 7, 153, 656, 97, 107, 144, 313, 99, 42, 316, + 136, 441, 99, 670, 671, 560, 42, 27, 563, 139, + 140, 622, 623, 577, 314, 117, 469, 139, 140, 39, + 117, 124, 42, 6, 7, 8, 551, 344, 124, 65, + 545, 471, 557, 473, 113, 139, 140, 592, 95, 339, + 595, 566, 100, 146, 108, 339, 327, 328, 329, 330, + 146, 648, 649, 664, 26, 95, 28, 77, 155, 42, + 124, 361, 672, 673, 143, 365, 321, 148, 40, 41, + 3, 365, 5, 45, 652, 66, 67, 602, 6, 7, + 8, 3, 656, 5, 166, 610, 341, 387, 343, 6, + 7, 8, 347, 418, 419, 620, 116, 95, 52, 71, + 52, 95, 357, 6, 7, 8, 42, 95, 363, 6, + 7, 8, 690, 150, 639, 95, 416, 417, 418, 419, + 95, 676, 416, 417, 418, 419, 651, 52, 383, 582, + 95, 386, 104, 7, 15, 588, 37, 37, 110, 439, + 112, 441, 281, 282, 283, 439, 757, 441, 601, 760, + 675, 114, 763, 156, 86, 32, 767, 33, 769, 138, + 91, 36, 91, 73, 42, 95, 132, 7, 693, 469, + 104, 471, 95, 473, 95, 730, 476, 471, 104, 473, + 152, 706, 476, 95, 103, 52, 132, 149, 42, 714, + 162, 109, 6, 7, 8, 18, 18, 18, 7, 95, + 455, 456, 727, 95, 37, 132, 104, 462, 57, 23, + 104, 73, 98, 52, 18, 496, 497, 132, 132, 7, + 55, 7, 7, 748, 38, 750, 43, 132, 119, 95, + 132, 786, 43, 132, 95, 130, 593, 51, 43, 132, + 95, 55, 132, 130, 58, 73, 21, 772, 132, 26, + 132, 28, 777, 132, 779, 85, 781, 73, 21, 104, + 73, 776, 517, 40, 41, 154, 73, 792, 45, 127, + 795, 29, 629, 630, 541, 89, 113, 85, 131, 52, + 37, 734, 582, 808, 132, 132, 52, 42, 588, 127, + 52, 85, 106, 746, 71, 73, 749, 20, 118, 3, + 31, 601, 29, 37, 559, 758, 157, 132, 132, 626, + 56, 668, 126, 670, 671, 672, 673, 37, 60, 52, + 134, 135, 25, 20, 20, 43, 132, 104, 16, 629, + 630, 129, 18, 110, 35, 112, 100, 52, 52, 153, + 131, 52, 131, 125, 52, 37, 95, 75, 131, 85, + 20, 131, 9, 85, 619, 655, 656, 485, 624, 85, + 212, 655, 656, 668, 317, 809, 778, 796, 747, 423, + 670, 671, 672, 673, 695, 152, 803, 620, 800, 774, + 265, 264, 286, 292, 295, 162, 130, 122, 345, 710, + 298, 467, 61, 648, 649, 756, 581, 652, 710, 68, + 603, 419, 548, 72, 73, 74, 75, 76, 77, 78, + 222, 80, 361, 216, 287, 216, 47, -1, -1, 88, + -1, -1, -1, -1, 93, -1, -1, 96, -1, -1, + -1, -1, 732, -1, 734, 690, 105, -1, -1, -1, + -1, -1, 742, -1, -1, -1, 746, -1, 742, 749, + -1, -1, 121, -1, -1, 710, -1, -1, 758, -1, + -1, -1, -1, -1, -1, 765, -1, 3, -1, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, + -1, 17, -1, -1, -1, -1, 22, 23, 24, -1, + 26, 791, -1, -1, 30, -1, -1, 791, 34, -1, + 755, -1, 38, 39, -1, -1, -1, -1, 44, -1, + 46, 47, -1, -1, 50, 51, 52, 53, 54, 55, + -1, -1, -1, -1, -1, -1, -1, 63, -1, -1, + 66, 67, -1, -1, 70, -1, -1, -1, -1, -1, + -1, 77, -1, -1, -1, -1, 82, 83, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 94, 95, + -1, -1, -1, 99, -1, -1, -1, -1, 104, -1, + 106, -1, -1, -1, -1, 111, -1, -1, -1, 115, + 116, 117, -1, -1, 120, -1, 122, 123, -1, -1, + 126, -1, -1, -1, -1, -1, -1, -1, 134, 135, + -1, 137, -1, 139, 140, 141, -1, -1, 144, -1, + -1, -1, -1, -1, -1, 151, -1, 153, -1, -1, + -1, -1, 158, -1, 160, 161, -1, -1, -1, -1, + -1, 167, 168, 3, -1, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, + -1, -1, 22, 23, 24, -1, 26, -1, -1, -1, + 30, -1, -1, -1, 34, -1, -1, -1, 38, 39, + -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, + 50, 51, 52, 53, 54, 55, -1, -1, -1, -1, + -1, -1, -1, 63, -1, -1, 66, 67, -1, -1, + 70, -1, -1, -1, -1, -1, -1, 77, -1, -1, + -1, -1, 82, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 94, 95, -1, -1, -1, 99, + -1, -1, -1, -1, 104, -1, 106, -1, -1, -1, + -1, 111, -1, -1, -1, 115, 116, 117, -1, -1, + 120, -1, 122, 123, -1, -1, 126, -1, -1, -1, + -1, -1, 132, -1, 134, 135, -1, 137, -1, 139, + 140, 141, -1, -1, 144, -1, -1, -1, -1, -1, + -1, 151, -1, 153, -1, -1, -1, -1, 158, -1, + 160, 161, -1, -1, -1, -1, -1, 167, 168, 3, + -1, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, -1, -1, 17, -1, -1, -1, -1, 22, 23, + 24, -1, 26, -1, -1, -1, 30, -1, -1, -1, + 34, -1, -1, -1, 38, 39, -1, -1, -1, 43, + 44, -1, 46, 47, -1, -1, 50, 51, 52, 53, + 54, 55, -1, -1, -1, -1, -1, -1, -1, 63, + -1, -1, 66, 67, -1, -1, 70, -1, -1, -1, + -1, -1, -1, 77, -1, -1, -1, -1, 82, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 94, 95, -1, -1, -1, 99, -1, -1, -1, -1, + 104, -1, 106, -1, -1, -1, -1, 111, -1, -1, + -1, 115, 116, 117, -1, -1, 120, -1, 122, 123, + -1, -1, 126, -1, -1, -1, -1, -1, -1, -1, + 134, 135, -1, 137, -1, 139, 140, 141, -1, -1, + 144, -1, -1, -1, -1, -1, -1, 151, -1, 153, + -1, -1, -1, -1, 158, -1, 160, 161, -1, -1, + -1, -1, -1, 167, 168, 3, -1, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, -1, -1, 17, + -1, -1, -1, -1, 22, 23, 24, -1, 26, -1, + -1, -1, 30, -1, -1, -1, 34, -1, -1, -1, + 38, 39, -1, -1, -1, -1, 44, -1, 46, 47, + -1, -1, 50, 51, 52, 53, 54, 55, -1, -1, + -1, -1, -1, -1, -1, 63, -1, -1, 66, 67, + -1, -1, 70, -1, -1, -1, -1, -1, -1, 77, + -1, -1, -1, -1, 82, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 94, 95, -1, -1, + -1, 99, -1, -1, -1, -1, 104, -1, 106, -1, + -1, -1, -1, 111, -1, -1, -1, 115, 116, 117, + -1, -1, 120, -1, 122, 123, -1, -1, 126, -1, + -1, -1, -1, -1, -1, -1, 134, 135, -1, 137, + -1, 139, 140, 141, -1, -1, 144, -1, -1, -1, + -1, -1, -1, 151, -1, 153, -1, -1, -1, -1, + 158, -1, 160, 161, -1, -1, -1, -1, -1, 167, + 168, 3, -1, 5, 6, 7, 8, 9, 10, 11, + 12, 13, 14, -1, -1, 17, -1, -1, -1, -1, + 22, 23, -1, -1, 26, -1, -1, -1, 30, -1, + -1, -1, 34, -1, -1, -1, 38, 39, -1, -1, + -1, -1, 44, -1, 46, 47, -1, -1, 50, 51, + 52, 53, 54, 55, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 66, 67, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 77, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 95, -1, -1, -1, 99, -1, -1, + -1, -1, 104, -1, 106, -1, -1, -1, -1, 111, + -1, -1, -1, 115, 116, 117, -1, -1, 120, -1, + 122, 123, -1, -1, 126, -1, -1, -1, -1, -1, + -1, -1, 134, 135, -1, 137, -1, 139, 140, -1, + -1, -1, 144, -1, -1, -1, -1, -1, -1, 151, + -1, 153, -1, -1, -1, -1, -1, -1, 160, 161, + -1, -1, -1, -1, -1, 167, 168, 3, -1, 5, + 6, 7, 8, 9, 10, 11, 12, 13, 14, -1, + -1, 17, -1, -1, -1, -1, 22, 23, -1, -1, + 26, -1, -1, -1, 30, -1, -1, -1, 34, -1, + -1, -1, 38, 39, -1, -1, -1, -1, 44, -1, + 46, 47, -1, -1, 50, 51, 52, 53, 54, 55, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 66, 67, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 77, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 95, + -1, -1, -1, -1, -1, -1, -1, -1, 104, -1, + 106, -1, -1, -1, -1, 111, -1, -1, -1, 115, + 116, -1, -1, -1, -1, -1, 122, 123, -1, -1, + 126, -1, -1, -1, -1, -1, -1, -1, 134, 135, + -1, 137, -1, -1, -1, -1, 142, -1, 144, -1, + -1, -1, -1, -1, -1, 151, -1, 153, -1, -1, + -1, -1, -1, -1, 160, -1, -1, -1, -1, -1, + -1, 167, 168, 3, -1, 5, 6, 7, 8, 9, + 10, 11, 12, 13, 14, -1, -1, 17, -1, -1, + -1, -1, 22, 23, -1, -1, 26, -1, -1, -1, + 30, -1, -1, -1, 34, -1, -1, -1, 38, 39, + -1, -1, -1, -1, 44, -1, 46, 47, -1, -1, + 50, 51, 52, 53, 54, 55, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 66, 67, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 77, -1, -1, + 6, 7, 8, 9, 10, -1, -1, 13, 14, -1, + -1, -1, -1, -1, -1, 95, 22, 23, -1, -1, + -1, -1, -1, -1, 104, -1, 106, -1, 34, -1, + -1, 111, 38, -1, -1, 115, 116, -1, -1, -1, + 46, 47, 122, 123, -1, 51, 126, -1, 54, 55, + -1, -1, -1, -1, 134, 135, -1, 137, -1, -1, + 66, 67, -1, -1, 144, -1, -1, -1, -1, -1, + -1, 151, -1, 153, -1, -1, -1, -1, -1, -1, + 160, 6, 7, 8, 9, 10, -1, 167, 168, -1, + -1, -1, -1, -1, -1, 6, 7, 8, 9, 10, + 106, -1, 13, 14, -1, -1, -1, -1, -1, 115, + -1, 22, 23, 38, -1, -1, 122, 123, -1, -1, + 126, -1, -1, 34, -1, -1, 51, 38, 134, 135, + 55, 137, -1, 139, 140, 46, 47, -1, 144, -1, + 51, -1, -1, 54, 55, -1, -1, 153, -1, -1, + -1, -1, -1, -1, -1, 66, 67, -1, -1, -1, + -1, 167, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 106, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 106, -1, -1, -1, -1, + -1, 126, -1, -1, 115, -1, -1, -1, -1, -1, + 135, 122, 123, -1, -1, 126, -1, -1, -1, 144, + -1, -1, -1, 134, 135, -1, 137, -1, 153, -1, + -1, -1, -1, 144, -1, -1, -1, -1, -1, -1, + -1, -1, 153 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint16 yystos[] = +{ + 0, 165, 170, 171, 163, 0, 102, 173, 174, 175, + 176, 3, 5, 404, 104, 176, 6, 7, 8, 9, + 10, 11, 12, 13, 14, 17, 22, 23, 24, 26, + 30, 34, 38, 39, 44, 46, 47, 50, 51, 52, + 53, 54, 55, 63, 66, 67, 70, 77, 82, 83, + 94, 95, 99, 104, 106, 111, 115, 116, 117, 120, + 122, 123, 126, 134, 135, 137, 139, 140, 141, 144, + 151, 153, 158, 160, 161, 167, 168, 177, 183, 184, + 186, 187, 189, 190, 191, 192, 193, 194, 195, 197, + 200, 201, 202, 204, 208, 211, 213, 219, 225, 226, + 227, 232, 233, 240, 253, 254, 260, 267, 276, 277, + 278, 279, 280, 281, 283, 285, 286, 289, 290, 291, + 292, 293, 294, 295, 296, 298, 300, 302, 303, 304, + 306, 307, 309, 310, 311, 322, 323, 324, 327, 328, + 329, 331, 332, 333, 334, 335, 336, 337, 338, 339, + 340, 342, 343, 344, 345, 347, 348, 349, 358, 359, + 360, 361, 362, 365, 366, 367, 368, 375, 382, 383, + 384, 386, 387, 388, 389, 390, 391, 392, 394, 397, + 399, 400, 404, 405, 59, 172, 7, 44, 100, 229, + 330, 95, 166, 364, 395, 95, 404, 7, 397, 405, + 95, 364, 395, 148, 26, 28, 40, 41, 45, 71, + 104, 110, 112, 152, 162, 364, 95, 395, 7, 341, + 405, 95, 364, 395, 52, 52, 6, 7, 401, 95, + 102, 136, 364, 44, 132, 225, 42, 218, 395, 150, + 7, 402, 405, 7, 95, 218, 374, 395, 95, 95, + 310, 310, 52, 312, 364, 395, 95, 90, 145, 7, + 218, 218, 37, 37, 114, 15, 61, 68, 72, 73, + 74, 75, 76, 77, 78, 80, 88, 93, 96, 105, + 121, 297, 299, 301, 99, 117, 155, 282, 49, 81, + 101, 144, 284, 25, 159, 287, 64, 87, 288, 86, + 156, 32, 33, 293, 218, 42, 305, 307, 69, 97, + 139, 140, 321, 91, 325, 36, 91, 95, 404, 138, + 185, 73, 104, 7, 231, 405, 95, 38, 55, 126, + 153, 333, 7, 132, 144, 396, 405, 218, 369, 370, + 373, 218, 356, 404, 42, 95, 218, 364, 124, 146, + 188, 124, 146, 212, 108, 124, 198, 35, 55, 71, + 113, 364, 7, 397, 194, 103, 181, 182, 364, 218, + 385, 392, 394, 144, 397, 372, 373, 397, 341, 341, + 350, 225, 104, 205, 45, 104, 203, 52, 104, 132, + 225, 218, 149, 308, 404, 7, 404, 305, 397, 397, + 341, 218, 218, 225, 227, 227, 278, 279, 280, 280, + 280, 281, 283, 285, 286, 289, 109, 18, 18, 18, + 43, 225, 311, 142, 311, 225, 23, 326, 333, 389, + 225, 226, 227, 346, 403, 404, 7, 314, 315, 37, + 132, 37, 132, 305, 397, 356, 132, 356, 225, 314, + 403, 185, 185, 37, 404, 104, 104, 57, 196, 7, + 399, 405, 73, 404, 185, 397, 98, 95, 317, 52, + 132, 37, 132, 37, 132, 363, 18, 377, 377, 353, + 132, 7, 403, 55, 7, 403, 341, 7, 43, 119, + 132, 132, 132, 132, 377, 132, 58, 89, 378, 380, + 381, 382, 389, 397, 378, 376, 381, 376, 43, 113, + 143, 246, 252, 130, 130, 132, 185, 73, 132, 157, + 316, 318, 319, 397, 398, 398, 371, 43, 132, 185, + 84, 107, 199, 185, 403, 403, 79, 92, 185, 95, + 3, 403, 185, 95, 316, 377, 341, 398, 398, 305, + 378, 85, 21, 239, 351, 354, 401, 154, 73, 21, + 206, 104, 73, 206, 377, 73, 85, 268, 395, 395, + 117, 127, 144, 379, 127, 29, 113, 131, 227, 247, + 248, 37, 52, 132, 132, 185, 185, 185, 52, 215, + 216, 42, 364, 178, 132, 305, 377, 127, 393, 393, + 227, 52, 85, 118, 73, 227, 207, 403, 185, 185, + 20, 3, 227, 31, 269, 29, 311, 19, 48, 249, + 37, 318, 341, 341, 37, 132, 313, 185, 23, 139, + 140, 220, 221, 222, 223, 224, 322, 345, 185, 20, + 65, 209, 132, 132, 261, 341, 227, 353, 16, 129, + 355, 56, 37, 227, 255, 52, 273, 60, 196, 250, + 248, 377, 377, 216, 214, 225, 223, 223, 25, 179, + 139, 140, 139, 140, 227, 20, 210, 262, 234, 75, + 128, 352, 356, 356, 227, 403, 241, 256, 397, 378, + 35, 166, 251, 20, 320, 377, 43, 221, 132, 223, + 223, 224, 224, 227, 185, 37, 133, 263, 266, 235, + 357, 16, 129, 37, 164, 233, 240, 242, 244, 245, + 246, 37, 257, 266, 18, 270, 403, 35, 227, 65, + 217, 218, 100, 228, 52, 227, 37, 233, 236, 240, + 244, 4, 27, 218, 348, 404, 52, 227, 131, 52, + 131, 227, 185, 230, 231, 125, 180, 341, 52, 397, + 341, 245, 227, 341, 227, 37, 404, 317, 377, 341, + 75, 377, 131, 377, 271, 231, 377, 85, 377, 20, + 227, 85, 45, 269, 272, 274, 305, 227, 239, 227, + 227, 52, 131, 185, 264, 85, 243, 258, 397, 227, + 265, 227, 242, 259, 275, 263, 237, 257, 131, 238, + 227, 236 +}; + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK (1); \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (&yylloc, parseInfo, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (YYID (0)) + + +#define YYTERROR 1 +#define YYERRCODE 256 + + +/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. + If N is 0, then set CURRENT to the empty location which ends + the previous symbol: RHS[0] (always defined). */ + +#define YYRHSLOC(Rhs, K) ((Rhs)[K]) +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + do \ + if (YYID (N)) \ + { \ + (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ + (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ + (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ + (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ + } \ + else \ + { \ + (Current).first_line = (Current).last_line = \ + YYRHSLOC (Rhs, 0).last_line; \ + (Current).first_column = (Current).last_column = \ + YYRHSLOC (Rhs, 0).last_column; \ + } \ + while (YYID (0)) +#endif + + +/* YY_LOCATION_PRINT -- Print the location on the stream. + This macro was not mandated originally: define only if we know + we won't break user code: when these are the locations we know. */ + +#ifndef YY_LOCATION_PRINT +# if YYLTYPE_IS_TRIVIAL +# define YY_LOCATION_PRINT(File, Loc) \ + fprintf (File, "%d.%d-%d.%d", \ + (Loc).first_line, (Loc).first_column, \ + (Loc).last_line, (Loc).last_column) +# else +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +# endif +#endif + + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, &yylloc, parseInfo) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (YYID (0)) + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, Location, parseInfo); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (YYID (0)) + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ParserContext *const parseInfo) +#else +static void +yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, parseInfo) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + YYLTYPE const * const yylocationp; + ParserContext *const parseInfo; +#endif +{ + if (!yyvaluep) + return; + YYUSE (yylocationp); + YYUSE (parseInfo); +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# else + YYUSE (yyoutput); +# endif + switch (yytype) + { + default: + break; + } +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, ParserContext *const parseInfo) +#else +static void +yy_symbol_print (yyoutput, yytype, yyvaluep, yylocationp, parseInfo) + FILE *yyoutput; + int yytype; + YYSTYPE const * const yyvaluep; + YYLTYPE const * const yylocationp; + ParserContext *const parseInfo; +#endif +{ + if (yytype < YYNTOKENS) + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + YY_LOCATION_PRINT (yyoutput, *yylocationp); + YYFPRINTF (yyoutput, ": "); + yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp, parseInfo); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +#else +static void +yy_stack_print (yybottom, yytop) + yytype_int16 *yybottom; + yytype_int16 *yytop; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (YYID (0)) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yy_reduce_print (YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule, ParserContext *const parseInfo) +#else +static void +yy_reduce_print (yyvsp, yylsp, yyrule, parseInfo) + YYSTYPE *yyvsp; + YYLTYPE *yylsp; + int yyrule; + ParserContext *const parseInfo; +#endif +{ + int yynrhs = yyr2[yyrule]; + int yyi; + unsigned long int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + fprintf (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , &(yylsp[(yyi + 1) - (yynrhs)]) , parseInfo); + fprintf (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyvsp, yylsp, Rule, parseInfo); \ +} while (YYID (0)) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static YYSIZE_T +yystrlen (const char *yystr) +#else +static YYSIZE_T +yystrlen (yystr) + const char *yystr; +#endif +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static char * +yystpcpy (char *yydest, const char *yysrc) +#else +static char * +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +#endif +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into YYRESULT an error message about the unexpected token + YYCHAR while in state YYSTATE. Return the number of bytes copied, + including the terminating null byte. If YYRESULT is null, do not + copy anything; just return the number of bytes that would be + copied. As a special case, return 0 if an ordinary "syntax error" + message will do. Return YYSIZE_MAXIMUM if overflow occurs during + size calculation. */ +static YYSIZE_T +yysyntax_error (char *yyresult, int yystate, int yychar) +{ + int yyn = yypact[yystate]; + + if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) + return 0; + else + { + int yytype = YYTRANSLATE (yychar); + YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); + YYSIZE_T yysize = yysize0; + YYSIZE_T yysize1; + int yysize_overflow = 0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + int yyx; + +# if 0 + /* This is so xgettext sees the translatable formats that are + constructed on the fly. */ + YY_("syntax error, unexpected %s"); + YY_("syntax error, unexpected %s, expecting %s"); + YY_("syntax error, unexpected %s, expecting %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s"); + YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); +# endif + char *yyfmt; + char const *yyf; + static char const yyunexpected[] = "syntax error, unexpected %s"; + static char const yyexpecting[] = ", expecting %s"; + static char const yyor[] = " or %s"; + char yyformat[sizeof yyunexpected + + sizeof yyexpecting - 1 + + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) + * (sizeof yyor - 1))]; + char const *yyprefix = yyexpecting; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 1; + + yyarg[0] = yytname[yytype]; + yyfmt = yystpcpy (yyformat, yyunexpected); + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + yyformat[sizeof yyunexpected - 1] = '\0'; + break; + } + yyarg[yycount++] = yytname[yyx]; + yysize1 = yysize + yytnamerr (0, yytname[yyx]); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + yyfmt = yystpcpy (yyfmt, yyprefix); + yyprefix = yyor; + } + + yyf = YY_(yyformat); + yysize1 = yysize + yystrlen (yyf); + yysize_overflow |= (yysize1 < yysize); + yysize = yysize1; + + if (yysize_overflow) + return YYSIZE_MAXIMUM; + + if (yyresult) + { + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + char *yyp = yyresult; + int yyi = 0; + while ((*yyp = *yyf) != '\0') + { + if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyf += 2; + } + else + { + yyp++; + yyf++; + } + } + } + return yysize; + } +} +#endif /* YYERROR_VERBOSE */ + + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +/*ARGSUSED*/ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, ParserContext *const parseInfo) +#else +static void +yydestruct (yymsg, yytype, yyvaluep, yylocationp, parseInfo) + const char *yymsg; + int yytype; + YYSTYPE *yyvaluep; + YYLTYPE *yylocationp; + ParserContext *const parseInfo; +#endif +{ + YYUSE (yyvaluep); + YYUSE (yylocationp); + YYUSE (parseInfo); + + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +#if defined __STDC__ || defined __cplusplus +int yyparse (void *YYPARSE_PARAM); +#else +int yyparse (); +#endif +#else /* ! YYPARSE_PARAM */ +#if defined __STDC__ || defined __cplusplus +int yyparse (ParserContext *const parseInfo); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (void *YYPARSE_PARAM) +#else +int +yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +#endif +#else /* ! YYPARSE_PARAM */ +#if (defined __STDC__ || defined __C99__FUNC__ \ + || defined __cplusplus || defined _MSC_VER) +int +yyparse (ParserContext *const parseInfo) +#else +int +yyparse (parseInfo) + ParserContext *const parseInfo; +#endif +#endif +{ + /* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; +/* Location data for the lookahead symbol. */ +YYLTYPE yylloc; + + int yystate; + int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss = yyssa; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + YYSTYPE *yyvsp; + + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + /* The locations where the error started and ended. */ + YYLTYPE yyerror_range[2]; + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N)) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + yylsp = yyls; +#if YYLTYPE_IS_TRIVIAL + /* Initialize the default location before parsing starts. */ + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 1; +#endif + + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + YYSTACK_RELOCATE (yyls); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + yylsp = yyls + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + *++yyvsp = yylval; + *++yylsp = yylloc; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen); + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 5: +/* Line 1269 of yacc.c. */ +#line 1380 "querytransformparser.ypp" + { + +/* Suppress more compiler warnings about unused defines. */ +#if defined(YYNNTS) \ + || defined(yyerrok) \ + || defined(YYNSTATES) \ + || defined(YYRHSLOC) \ + || defined(YYRECOVERING) \ + || defined(YYFAIL) \ + || defined(YYERROR) \ + || defined(YYNRULES) \ + || defined(YYBACKUP) \ + || defined(YYMAXDEPTH) \ + || defined(yyclearin) \ + || defined(YYERRCODE) \ + || defined(YY_LOCATION_PRINT) \ + || defined(YYLLOC_DEFAULT) +#endif + + if((yyvsp[(3) - (5)].sval) != QLatin1String("1.0")) + { + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + parseInfo->staticContext->error(QtXmlPatterns::tr("Version %1 is not supported. The supported " + "XQuery version is 1.0.") + .arg(formatData((yyvsp[(3) - (5)].sval))), + ReportContext::XQST0031, &ryy); + } + } + break; + + case 7: +/* Line 1269 of yacc.c. */ +#line 1412 "querytransformparser.ypp" + { + const QRegExp encNameRegExp(QLatin1String("[A-Za-z][A-Za-z0-9._\\-]*")); + + if(!encNameRegExp.exactMatch((yyvsp[(2) - (2)].sval))) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The encoding %1 is invalid. " + "It must contain Latin characters only, " + "must not contain whitespace, and must match " + "the regular expression %2.") + .arg(formatKeyword((yyvsp[(2) - (2)].sval)), + formatExpression(encNameRegExp.pattern())), + ReportContext::XQST0087, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 8: +/* Line 1269 of yacc.c. */ +#line 1428 "querytransformparser.ypp" + { + /* In XSL-T, we can have dangling variable references, so resolve them + * before we proceed with other steps, such as checking circularity. */ + if(parseInfo->isXSLT()) + { + typedef QHash Hash; + const Hash::const_iterator end(parseInfo->unresolvedVariableReferences.constEnd()); + + for(Hash::const_iterator it(parseInfo->unresolvedVariableReferences.constBegin()); it != end; ++it) + { + const Expression::Ptr body(resolveVariable(it.key(), (yyloc), parseInfo, true)); // TODO source locations vaise + Q_ASSERT(body); + it.value()->as()->bindTo(body); + } + } + + /* The UserFunction callsites aren't bound yet, so bind them(if possible!). */ + { + const UserFunctionCallsite::List::const_iterator cend(parseInfo->userFunctionCallsites.constEnd()); + UserFunctionCallsite::List::const_iterator cit(parseInfo->userFunctionCallsites.constBegin()); + for(; cit != cend; ++cit) /* For each callsite. */ + { + const UserFunctionCallsite::Ptr callsite(*cit); + Q_ASSERT(callsite); + const UserFunction::List::const_iterator end(parseInfo->userFunctions.constEnd()); + UserFunction::List::const_iterator it(parseInfo->userFunctions.constBegin()); + + for(; it != end; ++it) /* For each UserFunction. */ + { + const FunctionSignature::Ptr sign((*it)->signature()); + Q_ASSERT(sign); + + if(callsite->isSignatureValid(sign)) + { + callsite->setSource((*it), + parseInfo->allocateCacheSlots((*it)->argumentDeclarations().count())); + break; + } + } + if(it == end) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("No function with signature %1 is available") + .arg(formatFunction(callsite)), + ReportContext::XPST0017, fromYYLTYPE((yyloc), parseInfo)); + } + } + } + + /* Mark callsites in UserFunction bodies as recursive, if they are. */ + { + const UserFunction::List::const_iterator fend(parseInfo->userFunctions.constEnd()); + UserFunction::List::const_iterator fit(parseInfo->userFunctions.constBegin()); + for(; fit != fend; ++fit) + { + CallTargetDescription::List signList; + signList.append((*fit)->signature()); + CallTargetDescription::checkCallsiteCircularity(signList, (*fit)->body()); + } + } + + /* Now, check all global variables for circularity. This is done + * backwards because global variables are only in scope below them, + * in XQuery. */ + { + const VariableDeclaration::List::const_iterator start(parseInfo->declaredVariables.constBegin()); + VariableDeclaration::List::const_iterator it(parseInfo->declaredVariables.constEnd()); + + while(it != start) + { + --it; + if((*it)->type != VariableDeclaration::ExpressionVariable && (*it)->type != VariableDeclaration::GlobalVariable) + continue; /* We want to ignore 'external' variables. */ + + FunctionSignature::List signList; + checkVariableCircularity(*it, (*it)->expression(), (*it)->type, signList, parseInfo); + ExpressionFactory::registerLastPath((*it)->expression()); + parseInfo->finalizePushedVariable(1, false); /* Warn if it's unused. */ + } + } + + /* Generate code for doing initial template name calling. One problem + * is that we compilation in the initial template name, since we throw away the + * code if we don't have the requested template. */ + if(parseInfo->languageAccent == QXmlQuery::XSLT20 + && !parseInfo->initialTemplateName.isNull() + && parseInfo->namedTemplates.contains(parseInfo->initialTemplateName)) + { + parseInfo->queryBody = create(new CallTemplate(parseInfo->initialTemplateName, + WithParam::Hash()), + (yyloc), parseInfo); + parseInfo->templateCalls.append(parseInfo->queryBody); + /* We just discard the template body that XSLTTokenizer generated. */ + } + else + parseInfo->queryBody = (yyvsp[(2) - (2)].expr); + } + break; + + case 10: +/* Line 1269 of yacc.c. */ +#line 1528 "querytransformparser.ypp" + { + // TODO add to namespace context + parseInfo->moduleNamespace = parseInfo->staticContext->namePool()->allocateNamespace((yyvsp[(3) - (6)].sval)); + } + break; + + case 12: +/* Line 1269 of yacc.c. */ +#line 1536 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + if(parseInfo->hasSecondPrologPart) + parseInfo->staticContext->error(QtXmlPatterns::tr("A default namespace declaration must occur before function, " + "variable, and option declarations."), ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 13: +/* Line 1269 of yacc.c. */ +#line 1543 "querytransformparser.ypp" + { + if(parseInfo->hasSecondPrologPart) + parseInfo->staticContext->error(QtXmlPatterns::tr("A default namespace declaration must occur before function, " + "variable, and option declarations."), ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 14: +/* Line 1269 of yacc.c. */ +#line 1549 "querytransformparser.ypp" + { + if(parseInfo->hasSecondPrologPart) + parseInfo->staticContext->error(QtXmlPatterns::tr("Namespace declarations must occur before function, " + "variable, and option declarations."), ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 15: +/* Line 1269 of yacc.c. */ +#line 1555 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + if(parseInfo->hasSecondPrologPart) + parseInfo->staticContext->error(QtXmlPatterns::tr("Module imports must occur before function, " + "variable, and option declarations."), ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 17: +/* Line 1269 of yacc.c. */ +#line 1565 "querytransformparser.ypp" + { + parseInfo->hasSecondPrologPart = true; + } + break; + + case 18: +/* Line 1269 of yacc.c. */ +#line 1569 "querytransformparser.ypp" + { + parseInfo->hasSecondPrologPart = true; + } + break; + + case 19: +/* Line 1269 of yacc.c. */ +#line 1573 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + parseInfo->hasSecondPrologPart = true; + } + break; + + case 20: +/* Line 1269 of yacc.c. */ +#line 1596 "querytransformparser.ypp" + { + Template::Ptr temp(create(new Template(parseInfo->currentImportPrecedence, (yyvsp[(5) - (7)].sequenceType)), (yyloc), parseInfo)); + + registerNamedTemplate((yyvsp[(3) - (7)].qName), typeCheckTemplateBody((yyvsp[(6) - (7)].expr), (yyvsp[(5) - (7)].sequenceType), parseInfo), + parseInfo, (yylsp[(1) - (7)]), temp); + temp->templateParameters = parseInfo->templateParameters; + parseInfo->templateParametersHandled(); + } + break; + + case 21: +/* Line 1269 of yacc.c. */ +#line 1606 "querytransformparser.ypp" + { + parseInfo->isParsingPattern = true; + } + break; + + case 22: +/* Line 1269 of yacc.c. */ +#line 1610 "querytransformparser.ypp" + { + parseInfo->isParsingPattern = false; + } + break; + + case 23: +/* Line 1269 of yacc.c. */ +#line 1619 "querytransformparser.ypp" + { + /* In this grammar branch, we're guaranteed to be a template rule, but + * may also be a named template. */ + + const ImportPrecedence ip = parseInfo->isFirstTemplate() ? 0 : parseInfo->currentImportPrecedence; + Expression::Ptr pattern((yyvsp[(7) - (15)].expr)); + const TemplatePattern::ID templateID = parseInfo->allocateTemplateID(); + + Template::Ptr templ(create(new Template(ip, (yyvsp[(13) - (15)].sequenceType)), (yyloc), parseInfo)); + templ->body = typeCheckTemplateBody((yyvsp[(14) - (15)].expr), (yyvsp[(13) - (15)].sequenceType), parseInfo); + templ->templateParameters = parseInfo->templateParameters; + parseInfo->templateParametersHandled(); + + TemplatePattern::Vector ourPatterns; + /* We do it as per 6.4 Conflict Resolution for Template Rules: + * + * "If the pattern contains multiple alternatives separated by |, then + * the template rule is treated equivalently to a set of template + * rules, one for each alternative. However, it is not an error if a + * node matches more than one of the alternatives." */ + while(pattern->is(Expression::IDCombineNodes)) + { + const Expression::List operands(pattern->operands()); + pattern = operands.first(); + + loadPattern(operands.at(1), ourPatterns, templateID, (yyvsp[(11) - (15)].enums.Double), templ); + } + + loadPattern(pattern, ourPatterns, templateID, (yyvsp[(11) - (15)].enums.Double), templ); + + if(!(yyvsp[(3) - (15)].qName).isNull()) + registerNamedTemplate((yyvsp[(3) - (15)].qName), (yyvsp[(14) - (15)].expr), parseInfo, (yylsp[(1) - (15)]), templ); + + /* Now, let's add it to all the relevant templates. */ + for(int i = 0; i < (yyvsp[(10) - (15)].qNameVector).count(); ++i) /* For each mode. */ + { + const QXmlName &modeName = (yyvsp[(10) - (15)].qNameVector).at(i); + + if(modeName == QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::all) && (yyvsp[(10) - (15)].qNameVector).count() > 1) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The keyword %1 cannot occur with any other mode name.") + .arg(formatKeyword(QLatin1String("#all"))), + ReportContext::XTSE0530, + fromYYLTYPE((yyloc), parseInfo)); + } + + /* For each pattern the template use. */ + const TemplateMode::Ptr mode(parseInfo->modeFor(modeName)); + for(int t = 0; t < ourPatterns.count(); ++t) + mode->templatePatterns.append(ourPatterns.at(t)); + } + } + break; + + case 24: +/* Line 1269 of yacc.c. */ +#line 1673 "querytransformparser.ypp" + { + (yyval.enums.Double) = std::numeric_limits::quiet_NaN(); + } + break; + + case 25: +/* Line 1269 of yacc.c. */ +#line 1678 "querytransformparser.ypp" + { + const AtomicValue::Ptr val(Decimal::fromLexical((yyvsp[(2) - (2)].sval))); + if(val->hasError()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The value of attribute %1 must of type %2, which %3 isn't.") + .arg(formatKeyword(QLatin1String("priority")), + formatType(parseInfo->staticContext->namePool(), BuiltinTypes::xsDecimal), + formatData((yyvsp[(2) - (2)].sval))), + ReportContext::XTSE0530, + fromYYLTYPE((yyloc), parseInfo)); + } + else + (yyval.enums.Double) = val->as()->toDouble(); + } + break; + + case 26: +/* Line 1269 of yacc.c. */ +#line 1694 "querytransformparser.ypp" + { + (yyval.qName) = QXmlName(); + } + break; + + case 28: +/* Line 1269 of yacc.c. */ +#line 1700 "querytransformparser.ypp" + { + (yyval.qName) = (yyvsp[(2) - (2)].qName); + } + break; + + case 30: +/* Line 1269 of yacc.c. */ +#line 1706 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 32: +/* Line 1269 of yacc.c. */ +#line 1711 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 33: +/* Line 1269 of yacc.c. */ +#line 1715 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 34: +/* Line 1269 of yacc.c. */ +#line 1719 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 39: +/* Line 1269 of yacc.c. */ +#line 1730 "querytransformparser.ypp" + { + if(!(yyvsp[(6) - (7)].enums.Bool)) + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + + if((yyvsp[(3) - (7)].sval) == QLatin1String("xmlns")) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("It is not possible to redeclare prefix %1.") + .arg(formatKeyword(QLatin1String("xmlns"))), + ReportContext::XQST0070, fromYYLTYPE((yyloc), parseInfo)); + } + else if ((yyvsp[(5) - (7)].sval) == CommonNamespaces::XML || (yyvsp[(3) - (7)].sval) == QLatin1String("xml")) + { + parseInfo->staticContext->error(QtXmlPatterns::tr( + "The prefix %1 can not be bound. By default, it is already bound " + "to the namespace %2.") + .arg(formatKeyword("xml")) + .arg(formatURI(CommonNamespaces::XML)), + ReportContext::XQST0070, + fromYYLTYPE((yyloc), parseInfo)); + } + else if(parseInfo->declaredPrefixes.contains((yyvsp[(3) - (7)].sval))) + { + /* This includes the case where the user has bound a default prefix(such + * as 'local') and now tries to do it again. */ + parseInfo->staticContext->error(QtXmlPatterns::tr("Prefix %1 is already declared in the prolog.") + .arg(formatKeyword((yyvsp[(3) - (7)].sval))), + ReportContext::XQST0033, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->declaredPrefixes.append((yyvsp[(3) - (7)].sval)); + + if((yyvsp[(5) - (7)].sval).isEmpty()) + { + parseInfo->staticContext->namespaceBindings()->addBinding(QXmlName(StandardNamespaces::UndeclarePrefix, + StandardLocalNames::empty, + parseInfo->staticContext->namePool()->allocatePrefix((yyvsp[(3) - (7)].sval)))); + } + else + { + parseInfo->staticContext->namespaceBindings()->addBinding(parseInfo->staticContext->namePool()->allocateBinding((yyvsp[(3) - (7)].sval), (yyvsp[(5) - (7)].sval))); + } + } + } + break; + + case 40: +/* Line 1269 of yacc.c. */ +#line 1776 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::BoundarySpaceDecl)) + { + parseInfo->staticContext->error(prologMessage("declare boundary-space"), + ReportContext::XQST0068, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->staticContext->setBoundarySpacePolicy((yyvsp[(3) - (4)].enums.boundarySpacePolicy)); + parseInfo->registerDeclaration(ParserContext::BoundarySpaceDecl); + } + } + break; + + case 41: +/* Line 1269 of yacc.c. */ +#line 1790 "querytransformparser.ypp" + { + (yyval.enums.boundarySpacePolicy) = StaticContext::BSPStrip; + } + break; + + case 42: +/* Line 1269 of yacc.c. */ +#line 1795 "querytransformparser.ypp" + { + (yyval.enums.boundarySpacePolicy) = StaticContext::BSPPreserve; + } + break; + + case 45: +/* Line 1269 of yacc.c. */ +#line 1804 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::DeclareDefaultElementNamespace)) + { + parseInfo->staticContext->error(prologMessage("declare default element namespace"), + ReportContext::XQST0066, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->staticContext->namespaceBindings()->addBinding(QXmlName(parseInfo->staticContext->namePool()->allocateNamespace((yyvsp[(5) - (6)].sval)), StandardLocalNames::empty)); + parseInfo->registerDeclaration(ParserContext::DeclareDefaultElementNamespace); + } + } + break; + + case 46: +/* Line 1269 of yacc.c. */ +#line 1819 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::DeclareDefaultFunctionNamespace)) + { + parseInfo->staticContext->error(prologMessage("declare default function namespace"), + ReportContext::XQST0066, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->staticContext->setDefaultFunctionNamespace((yyvsp[(5) - (6)].sval)); + parseInfo->registerDeclaration(ParserContext::DeclareDefaultFunctionNamespace); + } + } + break; + + case 47: +/* Line 1269 of yacc.c. */ +#line 1833 "querytransformparser.ypp" + { + if((yyvsp[(3) - (5)].qName).prefix() == StandardPrefixes::empty) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The name of an option must have a prefix. " + "There is no default namespace for options."), + ReportContext::XPST0081, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 48: +/* Line 1269 of yacc.c. */ +#line 1843 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + if(parseInfo->hasDeclaration(ParserContext::OrderingModeDecl)) + { + parseInfo->staticContext->error(prologMessage("declare ordering"), + ReportContext::XQST0065, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->registerDeclaration(ParserContext::OrderingModeDecl); + parseInfo->staticContext->setOrderingMode((yyvsp[(3) - (4)].enums.orderingMode)); + } + } + break; + + case 49: +/* Line 1269 of yacc.c. */ +#line 1858 "querytransformparser.ypp" + { + (yyval.enums.orderingMode) = StaticContext::Ordered; + } + break; + + case 50: +/* Line 1269 of yacc.c. */ +#line 1862 "querytransformparser.ypp" + { + (yyval.enums.orderingMode) = StaticContext::Unordered; + } + break; + + case 51: +/* Line 1269 of yacc.c. */ +#line 1867 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::EmptyOrderDecl)) + { + parseInfo->staticContext->error(prologMessage("declare default order"), + ReportContext::XQST0069, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->registerDeclaration(ParserContext::EmptyOrderDecl); + parseInfo->staticContext->setOrderingEmptySequence((yyvsp[(4) - (5)].enums.orderingEmptySequence)); + } + } + break; + + case 52: +/* Line 1269 of yacc.c. */ +#line 1881 "querytransformparser.ypp" + { + (yyval.enums.orderingEmptySequence) = StaticContext::Least; + } + break; + + case 53: +/* Line 1269 of yacc.c. */ +#line 1885 "querytransformparser.ypp" + { + (yyval.enums.orderingEmptySequence) = StaticContext::Greatest; + } + break; + + case 54: +/* Line 1269 of yacc.c. */ +#line 1891 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::CopyNamespacesDecl)) + { + parseInfo->staticContext->error(prologMessage("declare copy-namespaces"), + ReportContext::XQST0055, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->registerDeclaration(ParserContext::CopyNamespacesDecl); + } + } + break; + + case 55: +/* Line 1269 of yacc.c. */ +#line 1904 "querytransformparser.ypp" + { + parseInfo->preserveNamespacesMode = true; + } + break; + + case 56: +/* Line 1269 of yacc.c. */ +#line 1909 "querytransformparser.ypp" + { + parseInfo->preserveNamespacesMode = false; + } + break; + + case 57: +/* Line 1269 of yacc.c. */ +#line 1914 "querytransformparser.ypp" + { + parseInfo->inheritNamespacesMode = true; + } + break; + + case 58: +/* Line 1269 of yacc.c. */ +#line 1919 "querytransformparser.ypp" + { + parseInfo->inheritNamespacesMode = false; + } + break; + + case 59: +/* Line 1269 of yacc.c. */ +#line 1924 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::DefaultCollationDecl)) + { + parseInfo->staticContext->error(prologMessage("declare default collation"), + ReportContext::XQST0038, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + const QUrl coll(resolveAndCheckCollation((yyvsp[(4) - (5)].sval), parseInfo, (yyloc))); + + parseInfo->registerDeclaration(ParserContext::DefaultCollationDecl); + parseInfo->staticContext->setDefaultCollation(coll); + } + } + break; + + case 60: +/* Line 1269 of yacc.c. */ +#line 1940 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20), parseInfo, (yyloc), (yyvsp[(3) - (5)].enums.Bool)); + if(parseInfo->hasDeclaration(ParserContext::BaseURIDecl)) + { + parseInfo->staticContext->error(prologMessage("declare base-uri"), + ReportContext::XQST0032, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->registerDeclaration(ParserContext::BaseURIDecl); + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + QUrl toBeBase(AnyURI::toQUrl((yyvsp[(4) - (5)].sval), parseInfo->staticContext, &ryy)); + /* Now we're guaranteed that base is a valid lexical representation, but it can still be relative. */ + + if(toBeBase.isRelative()) + toBeBase = parseInfo->staticContext->baseURI().resolved(toBeBase); + + parseInfo->staticContext->setBaseURI(toBeBase); + } + } + break; + + case 61: +/* Line 1269 of yacc.c. */ +#line 1963 "querytransformparser.ypp" + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The Schema Import feature is not supported, " + "and therefore %1 declarations cannot occur.") + .arg(formatKeyword("import schema")), + ReportContext::XQST0009, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 65: +/* Line 1269 of yacc.c. */ +#line 1975 "querytransformparser.ypp" + { + if((yyvsp[(4) - (6)].sval).isEmpty()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The target namespace of a %1 cannot be empty.") + .arg(formatKeyword("module import")), + ReportContext::XQST0088, fromYYLTYPE((yyloc), parseInfo)); + + } + else + { + /* This is temporary until we have implemented it. */ + parseInfo->staticContext->error(QtXmlPatterns::tr("The module import feature is not supported"), + ReportContext::XQST0016, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 72: +/* Line 1269 of yacc.c. */ +#line 2002 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(3) - (9)].enums.Bool)); + if(variableByName((yyvsp[(5) - (9)].qName), parseInfo)) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("A variable by name %1 has already " + "been declared.") + .arg(formatKeyword(parseInfo->staticContext->namePool()->toLexical((yyvsp[(5) - (9)].qName)))), + parseInfo->isXSLT() ? ReportContext::XTSE0630 : ReportContext::XQST0049, + fromYYLTYPE((yyloc), parseInfo)); + } + else + { + if((yyvsp[(7) - (9)].expr)) /* We got a value assigned. */ + { + const Expression::Ptr checked + (TypeChecker::applyFunctionConversion((yyvsp[(7) - (9)].expr), (yyvsp[(6) - (9)].sequenceType), parseInfo->staticContext, + (yyvsp[(3) - (9)].enums.Bool) ? ReportContext::XTTE0570 : ReportContext::XPTY0004, + (yyvsp[(3) - (9)].enums.Bool) ? TypeChecker::Options(TypeChecker::CheckFocus | TypeChecker::AutomaticallyConvert) : TypeChecker::CheckFocus)); + + pushVariable((yyvsp[(5) - (9)].qName), (yyvsp[(6) - (9)].sequenceType), checked, VariableDeclaration::GlobalVariable, (yyloc), parseInfo); + parseInfo->declaredVariables.append(parseInfo->variables.last()); + } + else /* We got an 'external' declaration. */ + { + const SequenceType::Ptr varType(parseInfo->staticContext-> + externalVariableLoader()->announceExternalVariable((yyvsp[(5) - (9)].qName), (yyvsp[(6) - (9)].sequenceType))); + + if(varType) + { + /* We push the declaration such that we can see name clashes and so on, but we don't use it for tying + * any references to it. */ + pushVariable((yyvsp[(5) - (9)].qName), varType, Expression::Ptr(), VariableDeclaration::ExternalVariable, (yyloc), parseInfo); + } + else if((yyvsp[(8) - (9)].expr)) + { + /* Ok, the xsl:param got a default value, we make it + * available as a regular variable declaration. */ + // TODO turn into checked + pushVariable((yyvsp[(5) - (9)].qName), (yyvsp[(6) - (9)].sequenceType), (yyvsp[(8) - (9)].expr), VariableDeclaration::GlobalVariable, (yyloc), parseInfo); + // TODO ensure that duplicates are trapped. + } + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("No value is available for the external " + "variable by name %1.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(5) - (9)].qName))), + parseInfo->isXSLT() ? ReportContext::XTDE0050 : ReportContext::XPDY0002, + fromYYLTYPE((yyloc), parseInfo)); + } + } + } + } + break; + + case 73: +/* Line 1269 of yacc.c. */ +#line 2056 "querytransformparser.ypp" + { + (yyval.expr).reset(); + } + break; + + case 74: +/* Line 1269 of yacc.c. */ +#line 2060 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + break; + + case 75: +/* Line 1269 of yacc.c. */ +#line 2065 "querytransformparser.ypp" + { + (yyval.expr).reset(); + } + break; + + case 76: +/* Line 1269 of yacc.c. */ +#line 2069 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + break; + + case 77: +/* Line 1269 of yacc.c. */ +#line 2074 "querytransformparser.ypp" + { + if(parseInfo->hasDeclaration(ParserContext::ConstructionDecl)) + { + parseInfo->staticContext->error(prologMessage("declare ordering"), + ReportContext::XQST0067, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->registerDeclaration(ParserContext::ConstructionDecl); + parseInfo->staticContext->setConstructionMode((yyvsp[(3) - (4)].enums.constructionMode)); + } + } + break; + + case 78: +/* Line 1269 of yacc.c. */ +#line 2088 "querytransformparser.ypp" + { + (yyval.enums.constructionMode) = StaticContext::CMStrip; + } + break; + + case 79: +/* Line 1269 of yacc.c. */ +#line 2092 "querytransformparser.ypp" + { + (yyval.enums.constructionMode) = StaticContext::CMPreserve; + } + break; + + case 80: +/* Line 1269 of yacc.c. */ +#line 2097 "querytransformparser.ypp" + { + (yyval.enums.slot) = parseInfo->currentExpressionSlot() - (yyvsp[(6) - (7)].functionArguments).count(); + } + break; + + case 81: +/* Line 1269 of yacc.c. */ +#line 2101 "querytransformparser.ypp" + { + if(!(yyvsp[(3) - (11)].enums.Bool)) + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(3) - (11)].enums.Bool)); + + /* If FunctionBody is null, it is 'external', otherwise the value is the body. */ + const QXmlName::NamespaceCode ns((yyvsp[(4) - (11)].qName).namespaceURI()); + + if(parseInfo->isXSLT() && !(yyvsp[(4) - (11)].qName).hasPrefix()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("A stylesheet function must have a prefixed name."), + ReportContext::XTSE0740, + fromYYLTYPE((yyloc), parseInfo)); + } + + if((yyvsp[(10) - (11)].expr)) /* We got a function body. */ + { + if(ns == StandardNamespaces::empty) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The namespace for a user defined function " + "cannot be empty (try the predefined " + "prefix %1 which exists for cases " + "like this)") + .arg(formatKeyword("local")), + ReportContext::XQST0060, fromYYLTYPE((yyloc), parseInfo)); + } + else if(XPathHelper::isReservedNamespace(ns)) + { + parseInfo->staticContext->error(QtXmlPatterns::tr( + "The namespace %1 is reserved; therefore " + "user defined functions may not use it. " + "Try the predefined prefix %2, which " + "exists for these cases.") + .arg(formatURI(parseInfo->staticContext->namePool(), ns), formatKeyword("local")), + parseInfo->isXSLT() ? ReportContext::XTSE0080 : ReportContext::XQST0045, + fromYYLTYPE((yyloc), parseInfo)); + } + else if(parseInfo->moduleNamespace != StandardNamespaces::empty && + ns != parseInfo->moduleNamespace) + { + parseInfo->staticContext->error(QtXmlPatterns::tr( + "The namespace of a user defined " + "function in a library module must be " + "equivalent to the module namespace. " + "In other words, it should be %1 instead " + "of %2") + .arg(formatURI(parseInfo->staticContext->namePool(), parseInfo->moduleNamespace), + formatURI(parseInfo->staticContext->namePool(), ns)), + ReportContext::XQST0048, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + /* Apply function conversion such that the body matches the declared + * return type. */ + const Expression::Ptr checked(TypeChecker::applyFunctionConversion((yyvsp[(10) - (11)].expr), (yyvsp[(9) - (11)].sequenceType), + parseInfo->staticContext, + ReportContext::XPTY0004, + TypeChecker::Options(TypeChecker::AutomaticallyConvert | + TypeChecker::CheckFocus | + TypeChecker::GeneratePromotion))); + + const int argCount = (yyvsp[(6) - (11)].functionArguments).count(); + const FunctionSignature::Ptr sign(new FunctionSignature((yyvsp[(4) - (11)].qName) /* name */, + argCount /* minArgs */, + argCount /* maxArgs */, + (yyvsp[(9) - (11)].sequenceType) /* returnType */)); + sign->setArguments((yyvsp[(6) - (11)].functionArguments)); + const UserFunction::List::const_iterator end(parseInfo->userFunctions.constEnd()); + UserFunction::List::const_iterator it(parseInfo->userFunctions.constBegin()); + + for(; it != end; ++it) + { + if(*(*it)->signature() == *sign) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("A function already exists with " + "the signature %1.") + .arg(formatFunction(parseInfo->staticContext->namePool(), sign)), + parseInfo->isXSLT() ? ReportContext::XTSE0770 : ReportContext::XQST0034, fromYYLTYPE((yyloc), parseInfo)); + } + } + + VariableDeclaration::List argDecls; + + for(int i = 0; i < argCount; ++i) + argDecls.append(parseInfo->variables.at(i)); + + if((yyvsp[(8) - (11)].enums.slot) > -1) + { + /* We have allocated slots, so now push them out of scope. */ + parseInfo->finalizePushedVariable(argCount); + } + + parseInfo->userFunctions.append(UserFunction::Ptr(new UserFunction(sign, checked, (yyvsp[(8) - (11)].enums.slot), argDecls))); + } + } + else /* We got an 'external' declaration. */ + { + parseInfo->staticContext->error(QtXmlPatterns::tr("No external functions are supported. " + "All supported functions can be used directly, " + "without first declaring them as external"), + ReportContext::XPST0017, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 82: +/* Line 1269 of yacc.c. */ +#line 2205 "querytransformparser.ypp" + { + (yyval.functionArguments) = FunctionArgument::List(); + } + break; + + case 83: +/* Line 1269 of yacc.c. */ +#line 2209 "querytransformparser.ypp" + { + FunctionArgument::List l; + l.append((yyvsp[(1) - (1)].functionArgument)); + (yyval.functionArguments) = l; + } + break; + + case 84: +/* Line 1269 of yacc.c. */ +#line 2215 "querytransformparser.ypp" + { + FunctionArgument::List::const_iterator it((yyvsp[(1) - (3)].functionArguments).constBegin()); + const FunctionArgument::List::const_iterator end((yyvsp[(1) - (3)].functionArguments).constEnd()); + + for(; it != end; ++it) + { + if((*it)->name() == (yyvsp[(3) - (3)].functionArgument)->name()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("An argument by name %1 has already " + "been declared. Every argument name " + "must be unique.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(3) - (3)].functionArgument)->name())), + ReportContext::XQST0039, fromYYLTYPE((yyloc), parseInfo)); + } + } + + (yyvsp[(1) - (3)].functionArguments).append((yyvsp[(3) - (3)].functionArgument)); + (yyval.functionArguments) = (yyvsp[(1) - (3)].functionArguments); + } + break; + + case 85: +/* Line 1269 of yacc.c. */ +#line 2236 "querytransformparser.ypp" + { + pushVariable((yyvsp[(2) - (3)].qName), (yyvsp[(3) - (3)].sequenceType), Expression::Ptr(), VariableDeclaration::FunctionArgument, (yyloc), parseInfo); + (yyval.functionArgument) = FunctionArgument::Ptr(new FunctionArgument((yyvsp[(2) - (3)].qName), (yyvsp[(3) - (3)].sequenceType))); + } + break; + + case 86: +/* Line 1269 of yacc.c. */ +#line 2242 "querytransformparser.ypp" + { + (yyval.expr).reset(); + } + break; + + case 88: +/* Line 1269 of yacc.c. */ +#line 2248 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (3)].expr); + } + break; + + case 91: +/* Line 1269 of yacc.c. */ +#line 2264 "querytransformparser.ypp" + { + (yyval.expr) = create(new CombineNodes((yyvsp[(1) - (3)].expr), CombineNodes::Union, (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 93: +/* Line 1269 of yacc.c. */ +#line 2270 "querytransformparser.ypp" + { + /* We write this into a node test. The spec says, 5.5.3 The Meaning of a Pattern: + * "Similarly, / matches a document node, and only a document node, + * because the result of the expression root(.)//(/) returns the root + * node of the tree containing the context node if and only if it is a + * document node." */ + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisSelf, BuiltinTypes::document), (yyloc), parseInfo); + } + break; + + case 94: +/* Line 1269 of yacc.c. */ +#line 2279 "querytransformparser.ypp" + { + /* /axis::node-test + * => + * axis::node-test[parent::document-node()] + * + * In practice it looks like this. $2 is: + * + * TruthPredicate + * AxisStep self::element(c) + * TruthPredicate + * AxisStep parent::element(b) + * AxisStep parent::element(a) + * + * and we want this: + * + * TruthPredicate + * AxisStep self::element(c) + * TruthPredicate + * AxisStep self::element(b) + * TruthPredicate + * AxisStep parent::element(a) + * AxisStep parent::document() + * + * So we want to rewrite the predicate deepest down into a + * another TruthPredicate containing the AxisStep. + * + * The simplest case where $2 is only an axis step is special. When $2 is: + * + * AxisStep self::element(a) + * + * we want: + * + * TruthPredicate + * AxisStep self::element(a) + * AxisStep parent::document() + */ + + /* First, find the target. */ + Expression::Ptr target((yyvsp[(2) - (2)].expr)); + + while(isPredicate(target->id())) + { + const Expression::Ptr candidate(target->operands().at(1)); + + if(isPredicate(candidate->id())) + target = candidate; + else + break; /* target is now the last predicate. */ + } + + if(target->is(Expression::IDAxisStep)) + { + (yyval.expr) = create(GenericPredicate::create((yyvsp[(2) - (2)].expr), create(new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::document), (yyloc), parseInfo), + parseInfo->staticContext, fromYYLTYPE((yylsp[(1) - (2)]), parseInfo)), (yylsp[(1) - (2)]), parseInfo); + } + else + { + const Expression::List targetOperands(target->operands()); + Expression::List newOps; + newOps.append(targetOperands.at(0)); + + newOps.append(create(GenericPredicate::create(targetOperands.at(1), + create(new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::document), (yyloc), parseInfo), + parseInfo->staticContext, fromYYLTYPE((yylsp[(1) - (2)]), parseInfo)), (yylsp[(1) - (2)]), parseInfo)); + + target->setOperands(newOps); + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + } + break; + + case 95: +/* Line 1269 of yacc.c. */ +#line 2349 "querytransformparser.ypp" + { + /* //axis::node-test + * => + * axis::node-test[parent::node()] + * + * Spec says: "//para matches any para element that has a parent node." + */ + (yyval.expr) = create(GenericPredicate::create((yyvsp[(2) - (2)].expr), create(new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::node), (yyloc), parseInfo), + parseInfo->staticContext, fromYYLTYPE((yylsp[(1) - (2)]), parseInfo)), (yylsp[(1) - (2)]), parseInfo); + } + break; + + case 97: +/* Line 1269 of yacc.c. */ +#line 2361 "querytransformparser.ypp" + { + createIdPatternPath((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), QXmlNodeModelIndex::AxisParent, (yylsp[(2) - (3)]), parseInfo); + } + break; + + case 98: +/* Line 1269 of yacc.c. */ +#line 2365 "querytransformparser.ypp" + { + createIdPatternPath((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), QXmlNodeModelIndex::AxisAncestor, (yylsp[(2) - (3)]), parseInfo); + } + break; + + case 99: +/* Line 1269 of yacc.c. */ +#line 2370 "querytransformparser.ypp" + { + const Expression::List ands((yyvsp[(1) - (1)].expr)->operands()); + const FunctionSignature::Ptr signature((yyvsp[(1) - (1)].expr)->as()->signature()); + const QXmlName name(signature->name()); + const QXmlName key(StandardNamespaces::fn, StandardLocalNames::key); + const QXmlName id(StandardNamespaces::fn, StandardLocalNames::id); + + if(name == id) + { + const Expression::ID id = ands.first()->id(); + if(!isVariableReference(id) && id != Expression::IDStringValue) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("When function %1 is used for matching inside a pattern, " + "the argument must be a variable reference or a string literal.") + .arg(formatFunction(parseInfo->staticContext->namePool(), signature)), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + } + else if(name == key) + { + if(ands.first()->id() != Expression::IDStringValue) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("In an XSL-T pattern, the first argument to function %1 " + "must be a string literal, when used for matching.") + .arg(formatFunction(parseInfo->staticContext->namePool(), signature)), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + + const Expression::ID id2 = ands.at(1)->id(); + if(!isVariableReference(id2) && + id2 != Expression::IDStringValue && + id2 != Expression::IDIntegerValue && + id2 != Expression::IDBooleanValue && + id2 != Expression::IDFloat) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("In an XSL-T pattern, the first argument to function %1 " + "must be a literal or a variable reference, when used for matching.") + .arg(formatFunction(parseInfo->staticContext->namePool(), signature)), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + + if(ands.count() == 3) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("In an XSL-T pattern, function %1 cannot have a third argument.") + .arg(formatFunction(parseInfo->staticContext->namePool(), signature)), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + + } + else + { + const FunctionSignature::Hash signs(parseInfo->staticContext->functionSignatures()->functionSignatures()); + parseInfo->staticContext->error(QtXmlPatterns::tr("In an XSL-T pattern, only function %1 " + "and %2, not %3, can be used for matching.") + .arg(formatFunction(parseInfo->staticContext->namePool(), signs.value(id)), + formatFunction(parseInfo->staticContext->namePool(), signs.value(key)), + formatFunction(parseInfo->staticContext->namePool(), signature)), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + + (yyval.expr) = (yyvsp[(1) - (1)].expr); + } + break; + + case 101: +/* Line 1269 of yacc.c. */ +#line 2440 "querytransformparser.ypp" + { + (yyval.expr) = createPatternPath((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), QXmlNodeModelIndex::AxisParent, (yylsp[(2) - (3)]), parseInfo); + } + break; + + case 102: +/* Line 1269 of yacc.c. */ +#line 2444 "querytransformparser.ypp" + { + (yyval.expr) = createPatternPath((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), QXmlNodeModelIndex::AxisAncestor, (yylsp[(2) - (3)]), parseInfo); + } + break; + + case 103: +/* Line 1269 of yacc.c. */ +#line 2449 "querytransformparser.ypp" + { + const Expression::Ptr expr(findAxisStep((yyvsp[(1) - (1)].expr))); + + const QXmlNodeModelIndex::Axis axis = expr->as()->axis(); + AxisStep *const axisStep = expr->as(); + + /* Here we constrain the possible axes, and we rewrite the axes as according + * to 5.5.3 The Meaning of a Pattern. + * + * However, we also rewrite axis child and attribute to axis self. The + * reason for this is that if we don't, we will match the children of + * the context node, instead of the context node itself. The formal + * definition of a pattern, root(.)//EE is insensitive to context, + * while the way we implement pattern, "the other way of seeing it", + * e.g from right to left, are very much. */ + + if(axisStep->nodeTest() == BuiltinTypes::document + || axis == QXmlNodeModelIndex::AxisChild) + axisStep->setAxis(QXmlNodeModelIndex::AxisSelf); + else if(axis == QXmlNodeModelIndex::AxisAttribute) + { + axisStep->setAxis(QXmlNodeModelIndex::AxisSelf); + /* Consider that the user write attribute::node(). This is + * semantically equivalent to attribute::attribute(), but since we have changed + * the axis to axis self, we also need to change the node test, such that we + * have self::attribute(). */ + if(*axisStep->nodeTest() == *BuiltinTypes::node) + axisStep->setNodeTest(BuiltinTypes::attribute); + } + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("In an XSL-T pattern, axis %1 cannot be used, " + "only axis %2 or %3 can.") + .arg(formatKeyword(AxisStep::axisName(axis)), + formatKeyword(AxisStep::axisName(QXmlNodeModelIndex::AxisChild)), + formatKeyword(AxisStep::axisName(QXmlNodeModelIndex::AxisAttribute))), + ReportContext::XPST0003, + fromYYLTYPE((yyloc), parseInfo)); + } + + (yyval.expr) = (yyvsp[(1) - (1)].expr); + } + break; + + case 105: +/* Line 1269 of yacc.c. */ +#line 2494 "querytransformparser.ypp" + { + (yyval.expr) = create(new ExpressionSequence((yyvsp[(1) - (1)].expressionList)), (yyloc), parseInfo); + } + break; + + case 106: +/* Line 1269 of yacc.c. */ +#line 2499 "querytransformparser.ypp" + { + Expression::List l; + l.append((yyvsp[(1) - (3)].expr)); + l.append((yyvsp[(3) - (3)].expr)); + (yyval.expressionList) = l; + } + break; + + case 107: +/* Line 1269 of yacc.c. */ +#line 2506 "querytransformparser.ypp" + { + (yyvsp[(1) - (3)].expressionList).append((yyvsp[(3) - (3)].expr)); + (yyval.expressionList) = (yyvsp[(1) - (3)].expressionList); + } + break; + + case 113: +/* Line 1269 of yacc.c. */ +#line 2517 "querytransformparser.ypp" + { + (yyval.expr) = createDirAttributeValue((yyvsp[(3) - (4)].expressionList), parseInfo, (yyloc)); + } + break; + + case 114: +/* Line 1269 of yacc.c. */ +#line 2522 "querytransformparser.ypp" + { + QVector result; + result.append(QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default)); + (yyval.qNameVector) = result; + } + break; + + case 115: +/* Line 1269 of yacc.c. */ +#line 2528 "querytransformparser.ypp" + { + (yyval.qNameVector) = (yyvsp[(2) - (2)].qNameVector); + } + break; + + case 116: +/* Line 1269 of yacc.c. */ +#line 2533 "querytransformparser.ypp" + { + (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default); + } + break; + + case 117: +/* Line 1269 of yacc.c. */ +#line 2537 "querytransformparser.ypp" + { + (yyval.qName) = (yyvsp[(2) - (2)].qName); + } + break; + + case 118: +/* Line 1269 of yacc.c. */ +#line 2542 "querytransformparser.ypp" + { + QVector result; + result.append((yyvsp[(1) - (1)].qName)); + (yyval.qNameVector) = result; + } + break; + + case 119: +/* Line 1269 of yacc.c. */ +#line 2548 "querytransformparser.ypp" + { + (yyvsp[(1) - (3)].qNameVector).append((yyvsp[(3) - (3)].qName)); + (yyval.qNameVector) = (yyvsp[(1) - (3)].qNameVector); + } + break; + + case 120: +/* Line 1269 of yacc.c. */ +#line 2554 "querytransformparser.ypp" + { + (yyval.qName) = (yyvsp[(1) - (1)].qName); + } + break; + + case 121: +/* Line 1269 of yacc.c. */ +#line 2558 "querytransformparser.ypp" + { + if((yyvsp[(1) - (1)].sval) == QLatin1String("#current")) + (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::current); + else if((yyvsp[(1) - (1)].sval) == QLatin1String("#default")) + (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::Default); + else if((yyvsp[(1) - (1)].sval) == QLatin1String("#all")) + (yyval.qName) = QXmlName(StandardNamespaces::InternalXSLT, StandardLocalNames::all); + else + { + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + if(!QXmlUtils::isNCName((yyvsp[(1) - (1)].sval))) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is an invalid template mode name.") + .arg(formatKeyword((yyvsp[(1) - (1)].sval))), + ReportContext::XTSE0550, + fromYYLTYPE((yyloc), parseInfo)); + } + + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(StandardNamespaces::empty, (yyvsp[(1) - (1)].sval)); + } + } + break; + + case 124: +/* Line 1269 of yacc.c. */ +#line 2587 "querytransformparser.ypp" + { + /* We're pushing the range variable here, not the positional. */ + (yyval.expr) = pushVariable((yyvsp[(3) - (7)].qName), quantificationType((yyvsp[(4) - (7)].sequenceType)), (yyvsp[(7) - (7)].expr), VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 125: +/* Line 1269 of yacc.c. */ +#line 2591 "querytransformparser.ypp" + { + /* It is ok this appears after PositionalVar, because currentRangeSlot() + * uses a different "channel" than currentPositionSlot(), so they can't trash + * each other. */ + (yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot(); + } + break; + + case 126: +/* Line 1269 of yacc.c. */ +#line 2598 "querytransformparser.ypp" + { + Q_ASSERT((yyvsp[(7) - (10)].expr)); + Q_ASSERT((yyvsp[(10) - (10)].expr)); + + /* We want the next last pushed variable, since we push the range variable after the + * positional variable. */ + if((yyvsp[(5) - (10)].enums.slot) != -1 && parseInfo->variables.at(parseInfo->variables.count() -2)->name == (yyvsp[(3) - (10)].qName)) + { + /* Ok, a positional variable is used since its slot is not -1, and its name is equal + * to our range variable. This is an error. */ + parseInfo->staticContext->error(QtXmlPatterns::tr("The name of a variable bound in a for-expression must be different " + "from the positional variable. Hence, the two variables named %1 collide.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(3) - (10)].qName))), + ReportContext::XQST0089, + fromYYLTYPE((yyloc), parseInfo)); + + } + + const Expression::Ptr retBody(create(new ForClause((yyvsp[(9) - (10)].enums.slot), (yyvsp[(8) - (10)].expr), (yyvsp[(10) - (10)].expr), (yyvsp[(5) - (10)].enums.slot)), (yyloc), parseInfo)); + ReturnOrderBy *const rob = locateReturnClause((yyvsp[(10) - (10)].expr)); + + if(rob) + (yyval.expr) = create(new OrderBy(rob->stability(), rob->orderSpecs(), retBody, rob), (yyloc), parseInfo); + else + (yyval.expr) = retBody; + + parseInfo->finalizePushedVariable(); + + if((yyvsp[(5) - (10)].enums.slot) != -1) /* We also have a positional variable to remove from the scope. */ + parseInfo->finalizePushedVariable(); + } + break; + + case 127: +/* Line 1269 of yacc.c. */ +#line 2632 "querytransformparser.ypp" + { + pushVariable((yyvsp[(3) - (7)].qName), quantificationType((yyvsp[(4) - (7)].sequenceType)), (yyvsp[(7) - (7)].expr), VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 128: +/* Line 1269 of yacc.c. */ +#line 2635 "querytransformparser.ypp" + { + /* It is ok this appears after PositionalVar, because currentRangeSlot() + * uses a different "channel" than currentPositionSlot(), so they can't trash + * each other. */ + (yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot(); + } + break; + + case 129: +/* Line 1269 of yacc.c. */ +#line 2642 "querytransformparser.ypp" + { + (yyval.expr) = create(new ForClause((yyvsp[(9) - (10)].enums.slot), (yyvsp[(7) - (10)].expr), (yyvsp[(10) - (10)].expr), (yyvsp[(5) - (10)].enums.slot)), (yyloc), parseInfo); + + parseInfo->finalizePushedVariable(); + + if((yyvsp[(5) - (10)].enums.slot) != -1) /* We also have a positional variable to remove from the scope. */ + parseInfo->finalizePushedVariable(); + } + break; + + case 133: +/* Line 1269 of yacc.c. */ +#line 2656 "querytransformparser.ypp" + { + (yyval.enums.slot) = -1; + } + break; + + case 134: +/* Line 1269 of yacc.c. */ +#line 2661 "querytransformparser.ypp" + { + pushVariable((yyvsp[(3) - (3)].qName), CommonSequenceTypes::ExactlyOneInteger, Expression::Ptr(), + VariableDeclaration::PositionalVariable, (yyloc), parseInfo); + (yyval.enums.slot) = parseInfo->currentPositionSlot(); + } + break; + + case 135: +/* Line 1269 of yacc.c. */ +#line 2668 "querytransformparser.ypp" + { + (yyval.expr) = pushVariable((yyvsp[(4) - (7)].qName), quantificationType((yyvsp[(5) - (7)].sequenceType)), (yyvsp[(7) - (7)].expr), VariableDeclaration::ExpressionVariable, (yyloc), parseInfo); + } + break; + + case 136: +/* Line 1269 of yacc.c. */ +#line 2672 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (9)].enums.Bool)); + + Q_ASSERT(parseInfo->variables.top()->name == (yyvsp[(4) - (9)].qName)); + (yyval.expr) = create(new LetClause((yyvsp[(8) - (9)].expr), (yyvsp[(9) - (9)].expr), parseInfo->variables.top()), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 137: +/* Line 1269 of yacc.c. */ +#line 2681 "querytransformparser.ypp" + { (yyval.expr) = pushVariable((yyvsp[(3) - (6)].qName), quantificationType((yyvsp[(4) - (6)].sequenceType)), (yyvsp[(6) - (6)].expr), VariableDeclaration::ExpressionVariable, (yyloc), parseInfo);} + break; + + case 138: +/* Line 1269 of yacc.c. */ +#line 2683 "querytransformparser.ypp" + { + Q_ASSERT(parseInfo->variables.top()->name == (yyvsp[(3) - (8)].qName)); + (yyval.expr) = create(new LetClause((yyvsp[(7) - (8)].expr), (yyvsp[(8) - (8)].expr), parseInfo->variables.top()), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 142: +/* Line 1269 of yacc.c. */ +#line 2694 "querytransformparser.ypp" + { + if((yyvsp[(1) - (3)].orderSpecs).isEmpty()) + (yyval.expr) = (yyvsp[(3) - (3)].expr); + else + (yyval.expr) = createReturnOrderBy((yyvsp[(1) - (3)].orderSpecs), (yyvsp[(3) - (3)].expr), parseInfo->orderStability.pop(), (yyloc), parseInfo); + } + break; + + case 143: +/* Line 1269 of yacc.c. */ +#line 2702 "querytransformparser.ypp" + { + if((yyvsp[(3) - (5)].orderSpecs).isEmpty()) + (yyval.expr) = create(new IfThenClause((yyvsp[(2) - (5)].expr), (yyvsp[(5) - (5)].expr), create(new EmptySequence, (yyloc), parseInfo)), (yyloc), parseInfo); + else + (yyval.expr) = create(new IfThenClause((yyvsp[(2) - (5)].expr), createReturnOrderBy((yyvsp[(3) - (5)].orderSpecs), (yyvsp[(5) - (5)].expr), parseInfo->orderStability.pop(), (yyloc), parseInfo), + create(new EmptySequence, (yyloc), parseInfo)), + (yyloc), parseInfo); + } + break; + + case 144: +/* Line 1269 of yacc.c. */ +#line 2712 "querytransformparser.ypp" + { + (yyval.orderSpecs) = OrderSpecTransfer::List(); + } + break; + + case 146: +/* Line 1269 of yacc.c. */ +#line 2718 "querytransformparser.ypp" + { + (yyval.orderSpecs) = (yyvsp[(2) - (2)].orderSpecs); + } + break; + + case 147: +/* Line 1269 of yacc.c. */ +#line 2723 "querytransformparser.ypp" + { + OrderSpecTransfer::List list; + list += (yyvsp[(1) - (3)].orderSpecs); + list.append((yyvsp[(3) - (3)].orderSpec)); + (yyval.orderSpecs) = list; + } + break; + + case 148: +/* Line 1269 of yacc.c. */ +#line 2730 "querytransformparser.ypp" + { + OrderSpecTransfer::List list; + list.append((yyvsp[(1) - (1)].orderSpec)); + (yyval.orderSpecs) = list; + } + break; + + case 149: +/* Line 1269 of yacc.c. */ +#line 2737 "querytransformparser.ypp" + { + (yyval.orderSpec) = OrderSpecTransfer((yyvsp[(1) - (4)].expr), OrderBy::OrderSpec((yyvsp[(2) - (4)].enums.sortDirection), (yyvsp[(3) - (4)].enums.orderingEmptySequence))); + } + break; + + case 150: +/* Line 1269 of yacc.c. */ +#line 2742 "querytransformparser.ypp" + { + /* Where does the specification state the default value is ascending? + * + * It is implicit, in the first enumerated list in 3.8.3 Order By and Return Clauses: + * + * "If T1 and T2 are two tuples in the tuple stream, and V1 and V2 are the first pair + * of values encountered when evaluating their orderspecs from left to right for + * which one value is greater-than the other (as defined above), then: + * + * 1. If V1 is greater-than V2: If the orderspec specifies descending, + * then T1 precedes T2 in the tuple stream; otherwise, T2 precedes T1 in the tuple stream. + * 2. If V2 is greater-than V1: If the orderspec specifies descending, + * then T2 precedes T1 in the tuple stream; otherwise, T1 precedes T2 in the tuple stream." + * + * which means that if you don't specify anything, or you + * specify ascending, you get the same result. + */ + (yyval.enums.sortDirection) = OrderBy::OrderSpec::Ascending; + } + break; + + case 151: +/* Line 1269 of yacc.c. */ +#line 2763 "querytransformparser.ypp" + { + (yyval.enums.sortDirection) = OrderBy::OrderSpec::Ascending; + } + break; + + case 152: +/* Line 1269 of yacc.c. */ +#line 2768 "querytransformparser.ypp" + { + (yyval.enums.sortDirection) = OrderBy::OrderSpec::Descending; + } + break; + + case 153: +/* Line 1269 of yacc.c. */ +#line 2773 "querytransformparser.ypp" + { + (yyval.enums.orderingEmptySequence) = parseInfo->staticContext->orderingEmptySequence(); + } + break; + + case 156: +/* Line 1269 of yacc.c. */ +#line 2780 "querytransformparser.ypp" + { + if(parseInfo->isXSLT()) + resolveAndCheckCollation((yyvsp[(2) - (2)].sval), parseInfo, (yyloc)); + else + resolveAndCheckCollation((yyvsp[(2) - (2)].sval), parseInfo, (yyloc)); + } + break; + + case 157: +/* Line 1269 of yacc.c. */ +#line 2787 "querytransformparser.ypp" + { + /* We do nothing. We don't use collations, and we have this non-terminal + * in order to accept expressions. */ + } + break; + + case 158: +/* Line 1269 of yacc.c. */ +#line 2793 "querytransformparser.ypp" + { + parseInfo->orderStability.push(OrderBy::StableOrder); + } + break; + + case 159: +/* Line 1269 of yacc.c. */ +#line 2797 "querytransformparser.ypp" + { + parseInfo->orderStability.push(OrderBy::UnstableOrder); + } + break; + + case 162: +/* Line 1269 of yacc.c. */ +#line 2805 "querytransformparser.ypp" + { + pushVariable((yyvsp[(3) - (6)].qName), quantificationType((yyvsp[(4) - (6)].sequenceType)), (yyvsp[(6) - (6)].expr), + VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 163: +/* Line 1269 of yacc.c. */ +#line 2809 "querytransformparser.ypp" + {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} + break; + + case 164: +/* Line 1269 of yacc.c. */ +#line 2811 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new QuantifiedExpression((yyvsp[(8) - (9)].enums.slot), + QuantifiedExpression::Some, (yyvsp[(6) - (9)].expr), (yyvsp[(9) - (9)].expr)), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 165: +/* Line 1269 of yacc.c. */ +#line 2819 "querytransformparser.ypp" + { + (yyval.expr) = pushVariable((yyvsp[(3) - (6)].qName), quantificationType((yyvsp[(4) - (6)].sequenceType)), (yyvsp[(6) - (6)].expr), + VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 166: +/* Line 1269 of yacc.c. */ +#line 2823 "querytransformparser.ypp" + {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} + break; + + case 167: +/* Line 1269 of yacc.c. */ +#line 2825 "querytransformparser.ypp" + { + (yyval.expr) = create(new QuantifiedExpression((yyvsp[(8) - (9)].enums.slot), + QuantifiedExpression::Some, (yyvsp[(7) - (9)].expr), (yyvsp[(9) - (9)].expr)), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 169: +/* Line 1269 of yacc.c. */ +#line 2834 "querytransformparser.ypp" + { + pushVariable((yyvsp[(3) - (6)].qName), quantificationType((yyvsp[(4) - (6)].sequenceType)), (yyvsp[(6) - (6)].expr), + VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 170: +/* Line 1269 of yacc.c. */ +#line 2838 "querytransformparser.ypp" + {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} + break; + + case 171: +/* Line 1269 of yacc.c. */ +#line 2840 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new QuantifiedExpression((yyvsp[(8) - (9)].enums.slot), + QuantifiedExpression::Every, (yyvsp[(6) - (9)].expr), (yyvsp[(9) - (9)].expr)), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 172: +/* Line 1269 of yacc.c. */ +#line 2848 "querytransformparser.ypp" + { + (yyval.expr) = pushVariable((yyvsp[(3) - (6)].qName), quantificationType((yyvsp[(4) - (6)].sequenceType)), (yyvsp[(6) - (6)].expr), + VariableDeclaration::RangeVariable, (yyloc), parseInfo); + } + break; + + case 173: +/* Line 1269 of yacc.c. */ +#line 2852 "querytransformparser.ypp" + {(yyval.enums.slot) = parseInfo->staticContext->currentRangeSlot();} + break; + + case 174: +/* Line 1269 of yacc.c. */ +#line 2854 "querytransformparser.ypp" + { + (yyval.expr) = create(new QuantifiedExpression((yyvsp[(8) - (9)].enums.slot), + QuantifiedExpression::Every, (yyvsp[(7) - (9)].expr), (yyvsp[(9) - (9)].expr)), (yyloc), parseInfo); + parseInfo->finalizePushedVariable(); + } + break; + + case 176: +/* Line 1269 of yacc.c. */ +#line 2863 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + break; + + case 177: +/* Line 1269 of yacc.c. */ +#line 2890 "querytransformparser.ypp" + { + parseInfo->typeswitchSource.push((yyvsp[(3) - (4)].expr)); + } + break; + + case 178: +/* Line 1269 of yacc.c. */ +#line 2894 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + parseInfo->typeswitchSource.pop(); + (yyval.expr) = (yyvsp[(6) - (6)].expr); + } + break; + + case 179: +/* Line 1269 of yacc.c. */ +#line 2901 "querytransformparser.ypp" + { + if(!(yyvsp[(2) - (3)].qName).isNull()) + { + pushVariable((yyvsp[(2) - (3)].qName), (yyvsp[(3) - (3)].sequenceType), parseInfo->typeswitchSource.top(), + VariableDeclaration::ExpressionVariable, (yyloc), parseInfo, false); + } + } + break; + + case 180: +/* Line 1269 of yacc.c. */ +#line 2909 "querytransformparser.ypp" + { + /* The variable shouldn't be in-scope for other case branches. */ + if(!(yyvsp[(2) - (6)].qName).isNull()) + parseInfo->finalizePushedVariable(); + } + break; + + case 181: +/* Line 1269 of yacc.c. */ +#line 2915 "querytransformparser.ypp" + { + const Expression::Ptr instanceOf(create(new InstanceOf(parseInfo->typeswitchSource.top(), (yyvsp[(3) - (8)].sequenceType)), (yyloc), parseInfo)); + (yyval.expr) = create(new IfThenClause(instanceOf, (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].expr)), (yyloc), parseInfo); + } + break; + + case 184: +/* Line 1269 of yacc.c. */ +#line 2924 "querytransformparser.ypp" + { + (yyval.qName) = QXmlName(); + } + break; + + case 185: +/* Line 1269 of yacc.c. */ +#line 2929 "querytransformparser.ypp" + { + (yyval.qName) = (yyvsp[(2) - (3)].qName); + } + break; + + case 186: +/* Line 1269 of yacc.c. */ +#line 2934 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(3) - (3)].expr); + } + break; + + case 187: +/* Line 1269 of yacc.c. */ +#line 2938 "querytransformparser.ypp" + { + if(!(yyvsp[(3) - (3)].qName).isNull()) + { + pushVariable((yyvsp[(3) - (3)].qName), parseInfo->typeswitchSource.top()->staticType(), + parseInfo->typeswitchSource.top(), + VariableDeclaration::ExpressionVariable, (yyloc), parseInfo, false); + } + } + break; + + case 188: +/* Line 1269 of yacc.c. */ +#line 2947 "querytransformparser.ypp" + { + if(!(yyvsp[(3) - (6)].qName).isNull()) + parseInfo->finalizePushedVariable(); + (yyval.expr) = (yyvsp[(6) - (6)].expr); + } + break; + + case 189: +/* Line 1269 of yacc.c. */ +#line 2954 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new IfThenClause((yyvsp[(3) - (8)].expr), (yyvsp[(6) - (8)].expr), (yyvsp[(8) - (8)].expr)), (yyloc), parseInfo); + } + break; + + case 191: +/* Line 1269 of yacc.c. */ +#line 2961 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new OrExpression((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 193: +/* Line 1269 of yacc.c. */ +#line 2968 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new AndExpression((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 199: +/* Line 1269 of yacc.c. */ +#line 2980 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new RangeExpression((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 201: +/* Line 1269 of yacc.c. */ +#line 2987 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new ArithmeticExpression((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.mathOperator), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 202: +/* Line 1269 of yacc.c. */ +#line 2992 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::Add;} + break; + + case 203: +/* Line 1269 of yacc.c. */ +#line 2993 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::Substract;} + break; + + case 205: +/* Line 1269 of yacc.c. */ +#line 2997 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new ArithmeticExpression((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.mathOperator), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 206: +/* Line 1269 of yacc.c. */ +#line 3002 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::Multiply;} + break; + + case 207: +/* Line 1269 of yacc.c. */ +#line 3003 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::Div;} + break; + + case 208: +/* Line 1269 of yacc.c. */ +#line 3004 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::IDiv;} + break; + + case 209: +/* Line 1269 of yacc.c. */ +#line 3005 "querytransformparser.ypp" + {(yyval.enums.mathOperator) = AtomicMathematician::Mod;} + break; + + case 211: +/* Line 1269 of yacc.c. */ +#line 3009 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 + | QXmlQuery::XPath20 + | QXmlQuery::XmlSchema11IdentityConstraintField + | QXmlQuery::XmlSchema11IdentityConstraintSelector), + parseInfo, (yyloc)); + (yyval.expr) = create(new CombineNodes((yyvsp[(1) - (3)].expr), CombineNodes::Union, (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 213: +/* Line 1269 of yacc.c. */ +#line 3020 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new CombineNodes((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.combinedNodeOp), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 216: +/* Line 1269 of yacc.c. */ +#line 3029 "querytransformparser.ypp" + { + (yyval.enums.combinedNodeOp) = CombineNodes::Intersect; + } + break; + + case 217: +/* Line 1269 of yacc.c. */ +#line 3033 "querytransformparser.ypp" + { + (yyval.enums.combinedNodeOp) = CombineNodes::Except; + } + break; + + case 219: +/* Line 1269 of yacc.c. */ +#line 3039 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new InstanceOf((yyvsp[(1) - (4)].expr), + SequenceType::Ptr((yyvsp[(4) - (4)].sequenceType))), (yyloc), parseInfo); + } + break; + + case 221: +/* Line 1269 of yacc.c. */ +#line 3047 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new TreatAs((yyvsp[(1) - (4)].expr), (yyvsp[(4) - (4)].sequenceType)), (yyloc), parseInfo); + } + break; + + case 223: +/* Line 1269 of yacc.c. */ +#line 3054 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new CastableAs((yyvsp[(1) - (4)].expr), (yyvsp[(4) - (4)].sequenceType)), (yyloc), parseInfo); + } + break; + + case 225: +/* Line 1269 of yacc.c. */ +#line 3061 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new CastAs((yyvsp[(1) - (4)].expr), (yyvsp[(4) - (4)].sequenceType)), (yyloc), parseInfo); + } + break; + + case 227: +/* Line 1269 of yacc.c. */ +#line 3068 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new UnaryExpression((yyvsp[(1) - (2)].enums.mathOperator), (yyvsp[(2) - (2)].expr), parseInfo->staticContext), (yyloc), parseInfo); + } + break; + + case 228: +/* Line 1269 of yacc.c. */ +#line 3074 "querytransformparser.ypp" + { + (yyval.enums.mathOperator) = AtomicMathematician::Add; + } + break; + + case 229: +/* Line 1269 of yacc.c. */ +#line 3078 "querytransformparser.ypp" + { + (yyval.enums.mathOperator) = AtomicMathematician::Substract; + } + break; + + case 233: +/* Line 1269 of yacc.c. */ +#line 3087 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new GeneralComparison((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.valueOperator), (yyvsp[(3) - (3)].expr), parseInfo->isBackwardsCompat.top()), (yyloc), parseInfo); + } + break; + + case 234: +/* Line 1269 of yacc.c. */ +#line 3092 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorEqual;} + break; + + case 235: +/* Line 1269 of yacc.c. */ +#line 3093 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorNotEqual;} + break; + + case 236: +/* Line 1269 of yacc.c. */ +#line 3094 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterOrEqual;} + break; + + case 237: +/* Line 1269 of yacc.c. */ +#line 3095 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterThan;} + break; + + case 238: +/* Line 1269 of yacc.c. */ +#line 3096 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessOrEqual;} + break; + + case 239: +/* Line 1269 of yacc.c. */ +#line 3097 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessThan;} + break; + + case 240: +/* Line 1269 of yacc.c. */ +#line 3100 "querytransformparser.ypp" + { + (yyval.expr) = create(new ValueComparison((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.valueOperator), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 241: +/* Line 1269 of yacc.c. */ +#line 3104 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorEqual;} + break; + + case 242: +/* Line 1269 of yacc.c. */ +#line 3105 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorNotEqual;} + break; + + case 243: +/* Line 1269 of yacc.c. */ +#line 3106 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterOrEqual;} + break; + + case 244: +/* Line 1269 of yacc.c. */ +#line 3107 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorGreaterThan;} + break; + + case 245: +/* Line 1269 of yacc.c. */ +#line 3108 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessOrEqual;} + break; + + case 246: +/* Line 1269 of yacc.c. */ +#line 3109 "querytransformparser.ypp" + {(yyval.enums.valueOperator) = AtomicComparator::OperatorLessThan;} + break; + + case 247: +/* Line 1269 of yacc.c. */ +#line 3112 "querytransformparser.ypp" + { + (yyval.expr) = create(new NodeComparison((yyvsp[(1) - (3)].expr), (yyvsp[(2) - (3)].enums.nodeOperator), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 248: +/* Line 1269 of yacc.c. */ +#line 3116 "querytransformparser.ypp" + {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Is;} + break; + + case 249: +/* Line 1269 of yacc.c. */ +#line 3117 "querytransformparser.ypp" + {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Precedes;} + break; + + case 250: +/* Line 1269 of yacc.c. */ +#line 3118 "querytransformparser.ypp" + {(yyval.enums.nodeOperator) = QXmlNodeModelIndex::Follows;} + break; + + case 251: +/* Line 1269 of yacc.c. */ +#line 3121 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + parseInfo->staticContext->error(QtXmlPatterns::tr("The Schema Validation Feature is not supported. " + "Hence, %1-expressions may not be used.") + .arg(formatKeyword("validate")), + ReportContext::XQST0075, fromYYLTYPE((yyloc), parseInfo)); + /* + $$ = Validate::create($2, $1, parseInfo->staticContext); + */ + } + break; + + case 252: +/* Line 1269 of yacc.c. */ +#line 3134 "querytransformparser.ypp" + {(yyval.enums.validationMode) = Validate::Strict;} + break; + + case 253: +/* Line 1269 of yacc.c. */ +#line 3135 "querytransformparser.ypp" + {(yyval.enums.validationMode) = Validate::Strict;} + break; + + case 254: +/* Line 1269 of yacc.c. */ +#line 3136 "querytransformparser.ypp" + {(yyval.enums.validationMode) = Validate::Lax;} + break; + + case 255: +/* Line 1269 of yacc.c. */ +#line 3139 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + /* We don't support any pragmas, so we only do the + * necessary validation and use the fallback expression. */ + + if((yyvsp[(2) - (2)].expr)) + (yyval.expr) = (yyvsp[(2) - (2)].expr); + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("None of the pragma expressions are supported. " + "Therefore, a fallback expression " + "must be present"), + ReportContext::XQST0079, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 256: +/* Line 1269 of yacc.c. */ +#line 3156 "querytransformparser.ypp" + { + (yyval.expr).reset(); + } + break; + + case 257: +/* Line 1269 of yacc.c. */ +#line 3160 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (3)].expr); + } + break; + + case 260: +/* Line 1269 of yacc.c. */ +#line 3168 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 263: +/* Line 1269 of yacc.c. */ +#line 3176 "querytransformparser.ypp" + { + /* This is "/step". That is, fn:root(self::node()) treat as document-node()/RelativePathExpr. */ + (yyval.expr) = create(new Path(createRootExpression(parseInfo, (yyloc)), (yyvsp[(2) - (2)].expr)), (yyloc), parseInfo); + } + break; + + case 264: +/* Line 1269 of yacc.c. */ +#line 3182 "querytransformparser.ypp" + { + (yyval.expr) = createSlashSlashPath(createRootExpression(parseInfo, (yyloc)), (yyvsp[(2) - (2)].expr), (yyloc), parseInfo); + } + break; + + case 265: +/* Line 1269 of yacc.c. */ +#line 3186 "querytransformparser.ypp" + { + /* This is "/". That is, fn:root(self::node()) treat as document-node(). */ + (yyval.expr) = createRootExpression(parseInfo, (yyloc)); + } + break; + + case 268: +/* Line 1269 of yacc.c. */ +#line 3196 "querytransformparser.ypp" + { + (yyval.expr) = create(new Path((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yyvsp[(2) - (3)].enums.pathKind)), (yyloc), parseInfo); + } + break; + + case 269: +/* Line 1269 of yacc.c. */ +#line 3200 "querytransformparser.ypp" + { + const Expression::Ptr orderBy(createReturnOrderBy((yyvsp[(4) - (7)].orderSpecs), (yyvsp[(6) - (7)].expr), parseInfo->orderStability.pop(), (yyloc), parseInfo)); + + ReturnOrderBy *const rob = orderBy->as(); + const Expression::Ptr path(create(new Path((yyvsp[(1) - (7)].expr), orderBy, (yyvsp[(2) - (7)].enums.pathKind)), (yyloc), parseInfo)); + + (yyval.expr) = create(new OrderBy(rob->stability(), rob->orderSpecs(), path, rob), (yyloc), parseInfo); + } + break; + + case 270: +/* Line 1269 of yacc.c. */ +#line 3209 "querytransformparser.ypp" + { + (yyval.expr) = createSlashSlashPath((yyvsp[(1) - (3)].expr), (yyvsp[(3) - (3)].expr), (yyloc), parseInfo); + } + break; + + case 271: +/* Line 1269 of yacc.c. */ +#line 3214 "querytransformparser.ypp" + { + (yyval.expr) = NodeSortExpression::wrapAround((yyvsp[(1) - (1)].expr), parseInfo->staticContext); + } + break; + + case 273: +/* Line 1269 of yacc.c. */ +#line 3219 "querytransformparser.ypp" + { + (yyval.expr) = create(new CurrentItemStore((yyvsp[(2) - (2)].expr)), (yyloc), parseInfo); + } + break; + + case 274: +/* Line 1269 of yacc.c. */ +#line 3223 "querytransformparser.ypp" + { + const xsDouble version = (yyvsp[(1) - (1)].sval).toDouble(); + + parseInfo->isBackwardsCompat.push(version != 2); + + (yyval.enums.Double) = version; + } + break; + + case 275: +/* Line 1269 of yacc.c. */ +#line 3231 "querytransformparser.ypp" + { + if((yyvsp[(2) - (3)].enums.Double) < 2) + (yyval.expr) = createCompatStore((yyvsp[(3) - (3)].expr), (yyloc), parseInfo); + else + (yyval.expr) = (yyvsp[(3) - (3)].expr); + } + break; + + case 276: +/* Line 1269 of yacc.c. */ +#line 3238 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XSLT20, parseInfo, (yyloc)); + Q_ASSERT(!(yyvsp[(2) - (5)].sval).isEmpty()); + (yyval.expr) = create(new StaticBaseURIStore((yyvsp[(2) - (5)].sval), (yyvsp[(4) - (5)].expr)), (yyloc), parseInfo); +} + break; + + case 277: +/* Line 1269 of yacc.c. */ +#line 3245 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20), parseInfo, (yyloc)); + parseInfo->resolvers.push(parseInfo->staticContext->namespaceBindings()); + const NamespaceResolver::Ptr resolver(new DelegatingNamespaceResolver(parseInfo->staticContext->namespaceBindings())); + resolver->addBinding(QXmlName(parseInfo->staticContext->namePool()->allocateNamespace((yyvsp[(5) - (6)].sval)), + StandardLocalNames::empty, + parseInfo->staticContext->namePool()->allocatePrefix((yyvsp[(3) - (6)].sval)))); + parseInfo->staticContext->setNamespaceBindings(resolver); + } + break; + + case 278: +/* Line 1269 of yacc.c. */ +#line 3256 "querytransformparser.ypp" + { + parseInfo->staticContext->setNamespaceBindings(parseInfo->resolvers.pop()); + (yyval.expr) = (yyvsp[(8) - (9)].expr); + } + break; + + case 279: +/* Line 1269 of yacc.c. */ +#line 3261 "querytransformparser.ypp" + { + (yyval.expr) = create(new CallTemplate((yyvsp[(2) - (5)].qName), parseInfo->templateWithParams), (yyloc), parseInfo); + parseInfo->templateWithParametersHandled(); + parseInfo->templateCalls.append((yyval.expr)); + } + break; + + case 280: +/* Line 1269 of yacc.c. */ +#line 3268 "querytransformparser.ypp" + { + parseInfo->startParsingWithParam(); + } + break; + + case 281: +/* Line 1269 of yacc.c. */ +#line 3272 "querytransformparser.ypp" + { + parseInfo->endParsingWithParam(); + } + break; + + case 282: +/* Line 1269 of yacc.c. */ +#line 3277 "querytransformparser.ypp" + { + } + break; + + case 283: +/* Line 1269 of yacc.c. */ +#line 3280 "querytransformparser.ypp" + { + } + break; + + case 284: +/* Line 1269 of yacc.c. */ +#line 3283 "querytransformparser.ypp" + { + } + break; + + case 285: +/* Line 1269 of yacc.c. */ +#line 3287 "querytransformparser.ypp" + { + } + break; + + case 286: +/* Line 1269 of yacc.c. */ +#line 3290 "querytransformparser.ypp" + { + } + break; + + case 287: +/* Line 1269 of yacc.c. */ +#line 3294 "querytransformparser.ypp" + { + /* Note, this grammar rule is invoked for @c xsl:param @em and @c + * xsl:with-param. */ + const bool isParsingWithParam = parseInfo->isParsingWithParam(); + + /** + * @c xsl:param doesn't make life easy: + * + * If it only has @c name, it's default value is an empty + * string(hence has type @c xs:string), but the value that + * (maybe) is supplied can be anything, typically a node. + * + * Therefore, for that very common case we can't rely on + * the Expression's type, but have to force it to item()*. + * + * So if we're supplied the type item()*, we pass a null + * SequenceType. TemplateParameterReference recognizes this + * and has item()* as its static type, regardless of if the + * expression has a more specific type. + */ + SequenceType::Ptr type; + + if(!(yyvsp[(4) - (5)].sequenceType)->is(CommonSequenceTypes::ZeroOrMoreItems)) + type = (yyvsp[(4) - (5)].sequenceType); + + Expression::Ptr expr; + + /* The default value is an empty sequence. */ + if(!(yyvsp[(5) - (5)].expr) && ((type && (yyvsp[(4) - (5)].sequenceType)->cardinality().allowsEmpty()) + || isParsingWithParam)) + expr = create(new EmptySequence, (yyloc), parseInfo); + else + expr = (yyvsp[(5) - (5)].expr); + + /* We ensure we have some type, so CallTemplate, Template and friends + * are happy. */ + if(!isParsingWithParam && !type) + type = CommonSequenceTypes::ZeroOrMoreItems; + + if((yyvsp[(1) - (5)].enums.Bool)) + /* TODO, handle tunnel parameters. */; + else + { + if((!isParsingWithParam && VariableDeclaration::contains(parseInfo->templateParameters, (yyvsp[(3) - (5)].qName))) || + (isParsingWithParam && parseInfo->templateWithParams.contains((yyvsp[(3) - (5)].qName)))) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("Each name of a template parameter must be unique; %1 is duplicated.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(3) - (5)].qName))), + isParsingWithParam ? ReportContext::XTSE0670 : ReportContext::XTSE0580, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + if(isParsingWithParam) + parseInfo->templateWithParams[(yyvsp[(3) - (5)].qName)] = WithParam::Ptr(new WithParam((yyvsp[(3) - (5)].qName), (yyvsp[(4) - (5)].sequenceType), expr)); + else + { + Q_ASSERT(type); + pushVariable((yyvsp[(3) - (5)].qName), type, expr, VariableDeclaration::TemplateParameter, (yyloc), parseInfo); + parseInfo->templateParameters.append(parseInfo->variables.top()); + } + } + } + } + break; + + case 288: +/* Line 1269 of yacc.c. */ +#line 3359 "querytransformparser.ypp" + { + (yyval.enums.Bool) = false; + } + break; + + case 289: +/* Line 1269 of yacc.c. */ +#line 3363 "querytransformparser.ypp" + { + (yyval.enums.Bool) = true; + } + break; + + case 290: +/* Line 1269 of yacc.c. */ +#line 3368 "querytransformparser.ypp" + { + (yyval.expr) = Expression::Ptr(); + } + break; + + case 291: +/* Line 1269 of yacc.c. */ +#line 3372 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + break; + + case 292: +/* Line 1269 of yacc.c. */ +#line 3381 "querytransformparser.ypp" + { + (yyval.enums.pathKind) = Path::RegularPath; + } + break; + + case 293: +/* Line 1269 of yacc.c. */ +#line 3385 "querytransformparser.ypp" + { + (yyval.enums.pathKind) = Path::XSLTForEach; + } + break; + + case 294: +/* Line 1269 of yacc.c. */ +#line 3389 "querytransformparser.ypp" + { + (yyval.enums.pathKind) = Path::ForApplyTemplate; + } + break; + + case 296: +/* Line 1269 of yacc.c. */ +#line 3395 "querytransformparser.ypp" + { + (yyval.expr) = create(GenericPredicate::create((yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr), parseInfo->staticContext, fromYYLTYPE((yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 299: +/* Line 1269 of yacc.c. */ +#line 3403 "querytransformparser.ypp" + { + if((yyvsp[(1) - (1)].enums.axis) == QXmlNodeModelIndex::AxisAttribute) + parseInfo->nodeTestSource = BuiltinTypes::attribute; + } + break; + + case 300: +/* Line 1269 of yacc.c. */ +#line 3408 "querytransformparser.ypp" + { + if((yyvsp[(3) - (3)].itemType)) + { + /* A node test was explicitly specified. The un-abbreviated syntax was used. */ + (yyval.expr) = create(new AxisStep((yyvsp[(1) - (3)].enums.axis), (yyvsp[(3) - (3)].itemType)), (yyloc), parseInfo); + } + else + { + /* Quote from 3.2.1.1 Axes + * + * [Definition: Every axis has a principal node kind. If an axis + * can contain elements, then the principal node kind is element; + * otherwise, it is the kind of nodes that the axis can contain.] Thus: + * - For the attribute axis, the principal node kind is attribute. + * - For all other axes, the principal node kind is element. */ + + if((yyvsp[(1) - (3)].enums.axis) == QXmlNodeModelIndex::AxisAttribute) + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisAttribute, BuiltinTypes::attribute), (yyloc), parseInfo); + else + (yyval.expr) = create(new AxisStep((yyvsp[(1) - (3)].enums.axis), BuiltinTypes::element), (yyloc), parseInfo); + } + + parseInfo->restoreNodeTestSource(); + } + break; + + case 304: +/* Line 1269 of yacc.c. */ +#line 3438 "querytransformparser.ypp" + { + if((yyvsp[(1) - (2)].enums.axis) == QXmlNodeModelIndex::AxisNamespace) + { + /* We don't raise XPST0010 here because the namespace axis isn't an optional + * axis. It simply is not part of the XQuery grammar. */ + parseInfo->staticContext->error(QtXmlPatterns::tr("The %1-axis is unsupported in XQuery") + .arg(formatKeyword("namespace")), + ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + else + (yyval.enums.axis) = (yyvsp[(1) - (2)].enums.axis); + + switch((yyvsp[(1) - (2)].enums.axis)) + { + case QXmlNodeModelIndex::AxisAttribute: + { + allowedIn(QueryLanguages( QXmlQuery::XPath20 + | QXmlQuery::XQuery10 + | QXmlQuery::XmlSchema11IdentityConstraintField + | QXmlQuery::XSLT20), + parseInfo, (yyloc)); + break; + } + case QXmlNodeModelIndex::AxisChild: + { + allowedIn(QueryLanguages( QXmlQuery::XPath20 + | QXmlQuery::XQuery10 + | QXmlQuery::XmlSchema11IdentityConstraintField + | QXmlQuery::XmlSchema11IdentityConstraintSelector + | QXmlQuery::XSLT20), + parseInfo, (yyloc)); + break; + } + default: + { + allowedIn(QueryLanguages( QXmlQuery::XPath20 + | QXmlQuery::XQuery10 + | QXmlQuery::XSLT20), + parseInfo, (yyloc)); + } + } + } + break; + + case 305: +/* Line 1269 of yacc.c. */ +#line 3481 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAncestorOrSelf ;} + break; + + case 306: +/* Line 1269 of yacc.c. */ +#line 3482 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAncestor ;} + break; + + case 307: +/* Line 1269 of yacc.c. */ +#line 3483 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisAttribute ;} + break; + + case 308: +/* Line 1269 of yacc.c. */ +#line 3484 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisChild ;} + break; + + case 309: +/* Line 1269 of yacc.c. */ +#line 3485 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisDescendantOrSelf;} + break; + + case 310: +/* Line 1269 of yacc.c. */ +#line 3486 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisDescendant ;} + break; + + case 311: +/* Line 1269 of yacc.c. */ +#line 3487 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisFollowing ;} + break; + + case 312: +/* Line 1269 of yacc.c. */ +#line 3488 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisPreceding ;} + break; + + case 313: +/* Line 1269 of yacc.c. */ +#line 3489 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisFollowingSibling;} + break; + + case 314: +/* Line 1269 of yacc.c. */ +#line 3490 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisPrecedingSibling;} + break; + + case 315: +/* Line 1269 of yacc.c. */ +#line 3491 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisParent ;} + break; + + case 316: +/* Line 1269 of yacc.c. */ +#line 3492 "querytransformparser.ypp" + {(yyval.enums.axis) = QXmlNodeModelIndex::AxisSelf ;} + break; + + case 317: +/* Line 1269 of yacc.c. */ +#line 3495 "querytransformparser.ypp" + { + parseInfo->nodeTestSource = BuiltinTypes::attribute; + } + break; + + case 318: +/* Line 1269 of yacc.c. */ +#line 3499 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XSLT20 | QXmlQuery::XmlSchema11IdentityConstraintField), parseInfo, (yyloc)); + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisAttribute, (yyvsp[(3) - (3)].itemType)), (yyloc), parseInfo); + + parseInfo->restoreNodeTestSource(); + } + break; + + case 319: +/* Line 1269 of yacc.c. */ +#line 3506 "querytransformparser.ypp" + { + ItemType::Ptr nodeTest; + + if(parseInfo->isParsingPattern && *(yyvsp[(1) - (1)].itemType) == *BuiltinTypes::node) + nodeTest = BuiltinTypes::xsltNodeTest; + else + nodeTest = (yyvsp[(1) - (1)].itemType); + + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisChild, nodeTest), (yyloc), parseInfo); + } + break; + + case 320: +/* Line 1269 of yacc.c. */ +#line 3517 "querytransformparser.ypp" + { + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisAttribute, (yyvsp[(1) - (1)].itemType)), (yyloc), parseInfo); + } + break; + + case 322: +/* Line 1269 of yacc.c. */ +#line 3524 "querytransformparser.ypp" + { + (yyval.expr) = create(new AxisStep(QXmlNodeModelIndex::AxisParent, BuiltinTypes::node), (yyloc), parseInfo); + } + break; + + case 324: +/* Line 1269 of yacc.c. */ +#line 3530 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + } + break; + + case 325: +/* Line 1269 of yacc.c. */ +#line 3535 "querytransformparser.ypp" + { + (yyval.itemType) = QNameTest::create(parseInfo->nodeTestSource, (yyvsp[(1) - (1)].qName)); + } + break; + + case 327: +/* Line 1269 of yacc.c. */ +#line 3541 "querytransformparser.ypp" + { + (yyval.itemType) = parseInfo->nodeTestSource; + } + break; + + case 328: +/* Line 1269 of yacc.c. */ +#line 3545 "querytransformparser.ypp" + { + const NamePool::Ptr np(parseInfo->staticContext->namePool()); + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + const QXmlName::NamespaceCode ns(QNameConstructor::namespaceForPrefix(np->allocatePrefix((yyvsp[(1) - (1)].sval)), parseInfo->staticContext, &ryy)); + + (yyval.itemType) = NamespaceNameTest::create(parseInfo->nodeTestSource, ns); + } + break; + + case 329: +/* Line 1269 of yacc.c. */ +#line 3554 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + const QXmlName::LocalNameCode c = parseInfo->staticContext->namePool()->allocateLocalName((yyvsp[(1) - (1)].sval)); + (yyval.itemType) = LocalNameTest::create(parseInfo->nodeTestSource, c); + } + break; + + case 331: +/* Line 1269 of yacc.c. */ +#line 3562 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(GenericPredicate::create((yyvsp[(1) - (4)].expr), (yyvsp[(3) - (4)].expr), parseInfo->staticContext, fromYYLTYPE((yylsp[(4) - (4)]), parseInfo)), (yyloc), parseInfo); + } + break; + + case 339: +/* Line 1269 of yacc.c. */ +#line 3575 "querytransformparser.ypp" + { + (yyval.expr) = create(new ApplyTemplate(parseInfo->modeFor((yyvsp[(2) - (5)].qName)), + parseInfo->templateWithParams, + parseInfo->modeFor(QXmlName(StandardNamespaces::InternalXSLT, + StandardLocalNames::Default))), + (yylsp[(1) - (5)]), parseInfo); + parseInfo->templateWithParametersHandled(); + } + break; + + case 341: +/* Line 1269 of yacc.c. */ +#line 3586 "querytransformparser.ypp" + { + (yyval.expr) = create(new Literal(AtomicString::fromValue((yyvsp[(1) - (1)].sval))), (yyloc), parseInfo); + } + break; + + case 342: +/* Line 1269 of yacc.c. */ +#line 3591 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = createNumericLiteral((yyvsp[(1) - (1)].sval), (yyloc), parseInfo); + } + break; + + case 343: +/* Line 1269 of yacc.c. */ +#line 3596 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = createNumericLiteral((yyvsp[(1) - (1)].sval), (yyloc), parseInfo); + } + break; + + case 344: +/* Line 1269 of yacc.c. */ +#line 3602 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = resolveVariable((yyvsp[(2) - (2)].qName), (yyloc), parseInfo, false); + } + break; + + case 345: +/* Line 1269 of yacc.c. */ +#line 3608 "querytransformparser.ypp" + { + /* See: http://www.w3.org/TR/xpath20/#id-variables */ + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(QString(), (yyvsp[(1) - (1)].sval)); + } + break; + + case 346: +/* Line 1269 of yacc.c. */ +#line 3613 "querytransformparser.ypp" + { + (yyval.qName) = (yyvsp[(1) - (1)].qName); + } + break; + + case 347: +/* Line 1269 of yacc.c. */ +#line 3618 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = (yyvsp[(2) - (3)].expr); + } + break; + + case 348: +/* Line 1269 of yacc.c. */ +#line 3623 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + (yyval.expr) = create(new EmptySequence, (yyloc), parseInfo); + } + break; + + case 349: +/* Line 1269 of yacc.c. */ +#line 3629 "querytransformparser.ypp" + { + (yyval.expr) = create(new ContextItem(), (yyloc), parseInfo); + } + break; + + case 350: +/* Line 1269 of yacc.c. */ +#line 3634 "querytransformparser.ypp" + { + (yyval.expr) = (yyvsp[(2) - (2)].expr); + } + break; + + case 351: +/* Line 1269 of yacc.c. */ +#line 3639 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + if(XPathHelper::isReservedNamespace((yyvsp[(1) - (4)].qName).namespaceURI()) || (yyvsp[(1) - (4)].qName).namespaceURI() == StandardNamespaces::InternalXSLT) + { /* We got a call to a builtin function. */ + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + const Expression::Ptr + func(parseInfo->staticContext-> + functionSignatures()->createFunctionCall((yyvsp[(1) - (4)].qName), (yyvsp[(3) - (4)].expressionList), parseInfo->staticContext, &ryy)); + + if(func) + (yyval.expr) = create(func, (yyloc), parseInfo); + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("No function by name %1 is available.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(1) - (4)].qName))), + ReportContext::XPST0017, fromYYLTYPE((yyloc), parseInfo)); + } + } + else /* It's a call to a function created with 'declare function'.*/ + { + (yyval.expr) = create(new UserFunctionCallsite((yyvsp[(1) - (4)].qName), (yyvsp[(3) - (4)].expressionList).count()), (yyloc), parseInfo); + + (yyval.expr)->setOperands((yyvsp[(3) - (4)].expressionList)); + parseInfo->userFunctionCallsites.append((yyval.expr)); + } + } + break; + + case 352: +/* Line 1269 of yacc.c. */ +#line 3668 "querytransformparser.ypp" + { + (yyval.expressionList) = Expression::List(); + } + break; + + case 353: +/* Line 1269 of yacc.c. */ +#line 3673 "querytransformparser.ypp" + { + Expression::List list; + list.append((yyvsp[(1) - (1)].expr)); + (yyval.expressionList) = list; + } + break; + + case 355: +/* Line 1269 of yacc.c. */ +#line 3682 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc)); + } + break; + + case 360: +/* Line 1269 of yacc.c. */ +#line 3726 "querytransformparser.ypp" + { + (yyval.enums.tokenizerPosition) = parseInfo->tokenizer->commenceScanOnly(); + parseInfo->scanOnlyStack.push(true); + } + break; + + case 361: +/* Line 1269 of yacc.c. */ +#line 3735 "querytransformparser.ypp" + { + ++parseInfo->elementConstructorDepth; + Expression::List constructors; + + parseInfo->resolvers.push(parseInfo->staticContext->namespaceBindings()); + + /* Fix up attributes and namespace declarations. */ + const NamespaceResolver::Ptr resolver(new DelegatingNamespaceResolver(parseInfo->staticContext->namespaceBindings())); + const NamePool::Ptr namePool(parseInfo->staticContext->namePool()); + const int len = (yyvsp[(4) - (4)].attributeHolders).size(); + QSet usedDeclarations; + + /* Whether xmlns="" has been encountered. */ + bool hasDefaultDeclaration = false; + + /* For each attribute & namespace declaration, do: */ + for(int i = 0; i < len; ++i) + { + QString strLocalName; + QString strPrefix; + + XPathHelper::splitQName((yyvsp[(4) - (4)].attributeHolders).at(i).first, strPrefix, strLocalName); + const QXmlName::PrefixCode prefix = namePool->allocatePrefix(strPrefix); + + /* This can seem a bit weird. However, this name is ending up in a QXmlName + * which consider its prefix a... prefix. So, a namespace binding name can in some cases + * be a local name, but that's just as the initial syntactical construct. */ + const QXmlName::LocalNameCode localName = namePool->allocatePrefix(strLocalName); + + /* Not that localName is "foo" in "xmlns:foo" and that prefix is "xmlns". */ + + if(prefix == StandardPrefixes::xmlns || + (prefix == StandardPrefixes::empty && localName == StandardPrefixes::xmlns)) + { + if(localName == StandardPrefixes::xmlns) + hasDefaultDeclaration = true; + + /* We have a namespace declaration. */ + + const Expression::Ptr nsExpr((yyvsp[(4) - (4)].attributeHolders).at(i).second); + + const QString strNamespace(nsExpr->is(Expression::IDEmptySequence) ? QString() : nsExpr->as()->item().stringValue()); + + const QXmlName::NamespaceCode ns = namePool->allocateNamespace(strNamespace); + + if(ns == StandardNamespaces::empty) + { + if(localName != StandardPrefixes::xmlns) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The namespace URI cannot be the empty string when binding to a prefix, %1.") + .arg(formatURI(strPrefix)), + ReportContext::XQST0085, fromYYLTYPE((yyloc), parseInfo)); + } + } + else if(!AnyURI::isValid(strNamespace)) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is an invalid namespace URI.").arg(formatURI(strNamespace)), + ReportContext::XQST0022, fromYYLTYPE((yyloc), parseInfo)); + } + + if(prefix == StandardPrefixes::xmlns && localName == StandardPrefixes::xmlns) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("It is not possible to bind to the prefix %1") + .arg(formatKeyword("xmlns")), + ReportContext::XQST0070, fromYYLTYPE((yyloc), parseInfo)); + } + + if(ns == StandardNamespaces::xml && localName != StandardPrefixes::xml) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("Namespace %1 can only be bound to %2 (and it is, in either case, pre-declared).") + .arg(formatURI(namePool->stringForNamespace(StandardNamespaces::xml))) + .arg(formatKeyword("xml")), + ReportContext::XQST0070, fromYYLTYPE((yyloc), parseInfo)); + } + + if(localName == StandardPrefixes::xml && ns != StandardNamespaces::xml) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("Prefix %1 can only be bound to %2 (and it is, in either case, pre-declared).") + .arg(formatKeyword("xml")) + .arg(formatURI(namePool->stringForNamespace(StandardNamespaces::xml))), + ReportContext::XQST0070, fromYYLTYPE((yyloc), parseInfo)); + } + + QXmlName nb; + + if(localName == StandardPrefixes::xmlns) + nb = QXmlName(ns, StandardLocalNames::empty); + else + nb = QXmlName(ns, StandardLocalNames::empty, localName); + + if(usedDeclarations.contains(nb.prefix())) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("Two namespace declaration attributes have the same name: %1.") + .arg(formatKeyword(namePool->stringForPrefix(nb.prefix()))), + ReportContext::XQST0071, fromYYLTYPE((yyloc), parseInfo)); + + } + else + usedDeclarations.insert(nb.prefix()); + + /* If the user has bound the XML namespace correctly, we in either + * case don't want to output it. + * + * We only have to check the namespace parts since the above checks has ensured + * consistency in the prefix parts. */ + if(ns != StandardNamespaces::xml) + { + /* We don't want default namespace declarations when the + * default namespace already is empty. */ + if(!(ns == StandardNamespaces::empty && + localName == StandardNamespaces::xmlns && + resolver->lookupNamespaceURI(StandardPrefixes::empty) == StandardNamespaces::empty)) + { + constructors.append(create(new NamespaceConstructor(nb), (yyloc), parseInfo)); + resolver->addBinding(nb); + } + } + } + } + + if(parseInfo->elementConstructorDepth == 1 && !hasDefaultDeclaration) + { + /* TODO But mostly this isn't needed, since the default element + * namespace is empty? How does this at all work? */ + const QXmlName def(resolver->lookupNamespaceURI(StandardPrefixes::empty), StandardLocalNames::empty); + constructors.append(create(new NamespaceConstructor(def), (yyloc), parseInfo)); + } + + parseInfo->staticContext->setNamespaceBindings(resolver); + (yyval.expressionList) = constructors; + + /* Resolve the name of the element, now that the namespace attributes are read. */ + { + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + const QXmlName ele = QNameConstructor::expandQName((yyvsp[(2) - (4)].sval), parseInfo->staticContext, resolver, &ryy); + parseInfo->tagStack.push(ele); + } + + parseInfo->tokenizer->resumeTokenizationFrom((yyvsp[(3) - (4)].enums.tokenizerPosition)); + } + break; + + case 362: +/* Line 1269 of yacc.c. */ +#line 3881 "querytransformparser.ypp" + { + /* We add the content constructor after the attribute constructors. This might result + * in nested ExpressionSequences, but it will be optimized away later on. */ + + Expression::List attributes((yyvsp[(5) - (8)].expressionList)); + const NamePool::Ptr namePool(parseInfo->staticContext->namePool()); + const int len = (yyvsp[(7) - (8)].attributeHolders).size(); + QSet declaredAttributes; + declaredAttributes.reserve(len); + + /* For each namespace, resolve its name(now that we have resolved the namespace declarations) and + * turn it into an attribute constructor. */ + for(int i = 0; i < len; ++i) + { + QString strLocalName; + QString strPrefix; + + XPathHelper::splitQName((yyvsp[(7) - (8)].attributeHolders).at(i).first, strPrefix, strLocalName); + const QXmlName::PrefixCode prefix = namePool->allocatePrefix(strPrefix); + const QXmlName::LocalNameCode localName = namePool->allocateLocalName(strLocalName); + + if(prefix == StandardPrefixes::xmlns || + (prefix == StandardPrefixes::empty && localName == StandardLocalNames::xmlns)) + { + const Expression::ID id = (yyvsp[(7) - (8)].attributeHolders).at(i).second->id(); + + if(id == Expression::IDStringValue || id == Expression::IDEmptySequence) + { + /* It's a namespace declaration, and we've already handled those above. */ + continue; + } + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The namespace URI must be a constant and cannot " + "use enclosed expressions."), + ReportContext::XQST0022, fromYYLTYPE((yyloc), parseInfo)); + } + + } + else + { + const ReflectYYLTYPE ryy((yyloc), parseInfo); + const QXmlName att = QNameConstructor::expandQName((yyvsp[(7) - (8)].attributeHolders).at(i).first, parseInfo->staticContext, + parseInfo->staticContext->namespaceBindings(), + &ryy, true); + if(declaredAttributes.contains(att)) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("An attribute by name %1 has already appeared on this element.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), att)), + ReportContext::XQST0040, fromYYLTYPE((yyloc), parseInfo)); + + } + else + declaredAttributes.insert(att); + + /* wrapLiteral() needs the SourceLocationReflection of the AttributeConstructor, but + * it's unknown inside the arguments to its constructor. Hence we have to do this workaround of setting + * it twice. + * + * The AttributeConstructor's arguments are just dummies. */ + const Expression::Ptr ctor(create(new AttributeConstructor((yyvsp[(7) - (8)].attributeHolders).at(i).second, (yyvsp[(7) - (8)].attributeHolders).at(i).second), (yyloc), parseInfo)); + + Expression::List ops; + ops.append(wrapLiteral(toItem(QNameValue::fromValue(namePool, att)), parseInfo->staticContext, ctor.data())); + ops.append((yyvsp[(7) - (8)].attributeHolders).at(i).second); + ctor->setOperands(ops); + + attributes.append(ctor); + } + } + + Expression::Ptr contentOp; + + if(attributes.isEmpty()) + contentOp = (yyvsp[(8) - (8)].expr); + else + { + attributes.append((yyvsp[(8) - (8)].expr)); + contentOp = create(new ExpressionSequence(attributes), (yyloc), parseInfo); + } + + const Expression::Ptr name(create(new Literal(toItem(QNameValue::fromValue(parseInfo->staticContext->namePool(), parseInfo->tagStack.top()))), (yyloc), parseInfo)); + (yyval.expr) = create(new ElementConstructor(name, contentOp, parseInfo->isXSLT()), (yyloc), parseInfo); + + /* Restore the old context. We don't want the namespaces + * to be in-scope for expressions appearing after the + * element they appeared on. */ + parseInfo->staticContext->setNamespaceBindings(parseInfo->resolvers.pop()); + parseInfo->tagStack.pop(); + + --parseInfo->elementConstructorDepth; + } + break; + + case 363: +/* Line 1269 of yacc.c. */ +#line 3977 "querytransformparser.ypp" + { + (yyval.expr) = create(new EmptySequence(), (yyloc), parseInfo); + } + break; + + case 364: +/* Line 1269 of yacc.c. */ +#line 3981 "querytransformparser.ypp" + { + if(!(yyvsp[(4) - (5)].qName).isLexicallyEqual(parseInfo->tagStack.top())) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("A direct element constructor is not " + "well-formed. %1 is ended with %2.") + .arg(formatKeyword(parseInfo->staticContext->namePool()->toLexical(parseInfo->tagStack.top())), + formatKeyword(parseInfo->staticContext->namePool()->toLexical((yyvsp[(4) - (5)].qName)))), + ReportContext::XPST0003, fromYYLTYPE((yyloc), parseInfo)); + } + + if((yyvsp[(2) - (5)].expressionList).isEmpty()) + (yyval.expr) = create(new EmptySequence(), (yyloc), parseInfo); + else if((yyvsp[(2) - (5)].expressionList).size() == 1) + (yyval.expr) = (yyvsp[(2) - (5)].expressionList).first(); + else + (yyval.expr) = create(new ExpressionSequence((yyvsp[(2) - (5)].expressionList)), (yyloc), parseInfo); + } + break; + + case 365: +/* Line 1269 of yacc.c. */ +#line 4000 "querytransformparser.ypp" + { + (yyval.attributeHolders) = AttributeHolderVector(); + } + break; + + case 366: +/* Line 1269 of yacc.c. */ +#line 4004 "querytransformparser.ypp" + { + (yyvsp[(1) - (2)].attributeHolders).append((yyvsp[(2) - (2)].attributeHolder)); + (yyval.attributeHolders) = (yyvsp[(1) - (2)].attributeHolders); + } + break; + + case 367: +/* Line 1269 of yacc.c. */ +#line 4010 "querytransformparser.ypp" + { + (yyval.attributeHolder) = qMakePair((yyvsp[(1) - (3)].sval), (yyvsp[(3) - (3)].expr)); + } + break; + + case 368: +/* Line 1269 of yacc.c. */ +#line 4015 "querytransformparser.ypp" + { + (yyval.expr) = createDirAttributeValue((yyvsp[(2) - (3)].expressionList), parseInfo, (yyloc)); + } + break; + + case 369: +/* Line 1269 of yacc.c. */ +#line 4020 "querytransformparser.ypp" + { + (yyval.expr) = createDirAttributeValue((yyvsp[(2) - (3)].expressionList), parseInfo, (yyloc)); + } + break; + + case 370: +/* Line 1269 of yacc.c. */ +#line 4025 "querytransformparser.ypp" + { + (yyval.expressionList) = Expression::List(); + } + break; + + case 371: +/* Line 1269 of yacc.c. */ +#line 4029 "querytransformparser.ypp" + { + Expression::Ptr content((yyvsp[(1) - (2)].expr)); + + if(parseInfo->isBackwardsCompat.top()) + content = create(GenericPredicate::createFirstItem(content), (yyloc), parseInfo); + + (yyvsp[(2) - (2)].expressionList).prepend(createSimpleContent(content, (yyloc), parseInfo)); + (yyval.expressionList) = (yyvsp[(2) - (2)].expressionList); + } + break; + + case 372: +/* Line 1269 of yacc.c. */ +#line 4039 "querytransformparser.ypp" + { + (yyvsp[(2) - (2)].expressionList).prepend(create(new Literal(AtomicString::fromValue((yyvsp[(1) - (2)].sval))), (yyloc), parseInfo)); + (yyval.expressionList) = (yyvsp[(2) - (2)].expressionList); + } + break; + + case 373: +/* Line 1269 of yacc.c. */ +#line 4045 "querytransformparser.ypp" + { + (yyval.expressionList) = Expression::List(); + parseInfo->isPreviousEnclosedExpr = false; + } + break; + + case 374: +/* Line 1269 of yacc.c. */ +#line 4050 "querytransformparser.ypp" + { + (yyvsp[(1) - (2)].expressionList).append((yyvsp[(2) - (2)].expr)); + (yyval.expressionList) = (yyvsp[(1) - (2)].expressionList); + parseInfo->isPreviousEnclosedExpr = false; + } + break; + + case 375: +/* Line 1269 of yacc.c. */ +#line 4056 "querytransformparser.ypp" + { + if(parseInfo->staticContext->boundarySpacePolicy() == StaticContext::BSPStrip && + XPathHelper::isWhitespaceOnly((yyvsp[(2) - (2)].sval))) + { + (yyval.expressionList) = (yyvsp[(1) - (2)].expressionList); + } + else + { + (yyvsp[(1) - (2)].expressionList).append(create(new TextNodeConstructor(create(new Literal(AtomicString::fromValue((yyvsp[(2) - (2)].sval))), (yyloc), parseInfo)), (yyloc), parseInfo)); + (yyval.expressionList) = (yyvsp[(1) - (2)].expressionList); + parseInfo->isPreviousEnclosedExpr = false; + } + } + break; + + case 376: +/* Line 1269 of yacc.c. */ +#line 4070 "querytransformparser.ypp" + { + (yyvsp[(1) - (2)].expressionList).append(create(new TextNodeConstructor(create(new Literal(AtomicString::fromValue((yyvsp[(2) - (2)].sval))), (yyloc), parseInfo)), (yyloc), parseInfo)); + (yyval.expressionList) = (yyvsp[(1) - (2)].expressionList); + parseInfo->isPreviousEnclosedExpr = false; + } + break; + + case 377: +/* Line 1269 of yacc.c. */ +#line 4076 "querytransformparser.ypp" + { + /* We insert a text node constructor that send an empty text node between + * the two enclosed expressions, in order to ensure that no space is inserted. + * + * However, we only do it when we have no node constructors. */ + if(parseInfo->isPreviousEnclosedExpr && + BuiltinTypes::xsAnyAtomicType->xdtTypeMatches((yyvsp[(2) - (2)].expr)->staticType()->itemType()) && + BuiltinTypes::xsAnyAtomicType->xdtTypeMatches((yyvsp[(1) - (2)].expressionList).last()->staticType()->itemType())) + (yyvsp[(1) - (2)].expressionList).append(create(new TextNodeConstructor(create(new Literal(AtomicString::fromValue(QString())), (yyloc), parseInfo)), (yyloc), parseInfo)); + else + parseInfo->isPreviousEnclosedExpr = true; + + (yyvsp[(1) - (2)].expressionList).append(createCopyOf((yyvsp[(2) - (2)].expr), parseInfo, (yyloc))); + (yyval.expressionList) = (yyvsp[(1) - (2)].expressionList); + } + break; + + case 378: +/* Line 1269 of yacc.c. */ +#line 4093 "querytransformparser.ypp" + { + (yyval.expr) = create(new CommentConstructor(create(new Literal(AtomicString::fromValue((yyvsp[(2) - (2)].sval))), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 379: +/* Line 1269 of yacc.c. */ +#line 4098 "querytransformparser.ypp" + { + const ReflectYYLTYPE ryy((yyloc), parseInfo); + NCNameConstructor::validateTargetName((yyvsp[(2) - (3)].sval), + parseInfo->staticContext, &ryy); + + (yyval.expr) = create(new ProcessingInstructionConstructor( + create(new Literal(AtomicString::fromValue((yyvsp[(2) - (3)].sval))), (yyloc), parseInfo), + create(new Literal(AtomicString::fromValue((yyvsp[(3) - (3)].sval))), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 387: +/* Line 1269 of yacc.c. */ +#line 4119 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (3)].enums.Bool)); + + (yyval.expr) = create(new DocumentConstructor((yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); + } + break; + + case 388: +/* Line 1269 of yacc.c. */ +#line 4126 "querytransformparser.ypp" + { + /* This value is incremented before the action below is executed. */ + ++parseInfo->elementConstructorDepth; + } + break; + + case 389: +/* Line 1269 of yacc.c. */ +#line 4131 "querytransformparser.ypp" + { + Q_ASSERT(5); + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (5)].enums.Bool)); + + Expression::Ptr effExpr; + + if((yyvsp[(5) - (5)].expr)) + effExpr = createCopyOf((yyvsp[(5) - (5)].expr), parseInfo, (yyloc)); + else + effExpr = create(new EmptySequence(), (yyloc), parseInfo); + + const QXmlName::NamespaceCode ns = parseInfo->resolvers.top()->lookupNamespaceURI(StandardPrefixes::empty); + + /* Ensure the default namespace gets counted as an in-scope binding, if such a one exists. If we're + * a child of another constructor, it has already been done. */ + if(parseInfo->elementConstructorDepth == 1 && ns != StandardNamespaces::empty) + { + Expression::List exprList; + + /* We append the namespace constructor before the body, in order to + * comply with QAbstractXmlPushHandler's contract. */ + const QXmlName def(parseInfo->resolvers.top()->lookupNamespaceURI(StandardPrefixes::empty), StandardLocalNames::empty); + exprList.append(create(new NamespaceConstructor(def), (yyloc), parseInfo)); + + exprList.append(effExpr); + + effExpr = create(new ExpressionSequence(exprList), (yyloc), parseInfo); + } + + --parseInfo->elementConstructorDepth; + (yyval.expr) = create(new ElementConstructor((yyvsp[(3) - (5)].expr), effExpr, parseInfo->isXSLT()), (yyloc), parseInfo); + } + break; + + case 390: +/* Line 1269 of yacc.c. */ +#line 4165 "querytransformparser.ypp" + { + (yyval.enums.Bool) = false; + } + break; + + case 391: +/* Line 1269 of yacc.c. */ +#line 4169 "querytransformparser.ypp" + { + (yyval.enums.Bool) = true; + } + break; + + case 392: +/* Line 1269 of yacc.c. */ +#line 4177 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (4)].enums.Bool)); + + const Expression::Ptr name(create(new AttributeNameValidator((yyvsp[(3) - (4)].expr)), (yyloc), parseInfo)); + + if((yyvsp[(4) - (4)].expr)) + (yyval.expr) = create(new AttributeConstructor(name, createSimpleContent((yyvsp[(4) - (4)].expr), (yyloc), parseInfo)), (yyloc), parseInfo); + else + (yyval.expr) = create(new AttributeConstructor(name, create(new EmptySequence(), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 393: +/* Line 1269 of yacc.c. */ +#line 4189 "querytransformparser.ypp" + { + (yyval.expr) = create(new TextNodeConstructor(createSimpleContent((yyvsp[(3) - (3)].expr), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 394: +/* Line 1269 of yacc.c. */ +#line 4194 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (3)].enums.Bool)); + + (yyval.expr) = create(new CommentConstructor(createSimpleContent((yyvsp[(3) - (3)].expr), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 395: +/* Line 1269 of yacc.c. */ +#line 4201 "querytransformparser.ypp" + { + allowedIn(QXmlQuery::XQuery10, parseInfo, (yyloc), (yyvsp[(2) - (3)].expr)); + + if((yyvsp[(3) - (3)].expr)) + { + (yyval.expr) = create(new ProcessingInstructionConstructor((yyvsp[(2) - (3)].expr), createSimpleContent((yyvsp[(3) - (3)].expr), (yyloc), parseInfo)), (yyloc), parseInfo); + } + else + (yyval.expr) = create(new ProcessingInstructionConstructor((yyvsp[(2) - (3)].expr), create(new EmptySequence(), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 396: +/* Line 1269 of yacc.c. */ +#line 4212 "querytransformparser.ypp" + { + parseInfo->nodeTestSource = BuiltinTypes::attribute; + } + break; + + case 397: +/* Line 1269 of yacc.c. */ +#line 4216 "querytransformparser.ypp" + { + parseInfo->restoreNodeTestSource(); + } + break; + + case 398: +/* Line 1269 of yacc.c. */ +#line 4219 "querytransformparser.ypp" + { + (yyval.expr) = create(new Literal(toItem(QNameValue::fromValue(parseInfo->staticContext->namePool(), (yyvsp[(2) - (3)].qName)))), (yyloc), parseInfo); + } + break; + + case 400: +/* Line 1269 of yacc.c. */ +#line 4225 "querytransformparser.ypp" + { + (yyval.expr) = create(new Literal(toItem(QNameValue::fromValue(parseInfo->staticContext->namePool(), (yyvsp[(1) - (1)].qName)))), (yyloc), parseInfo); + } + break; + + case 402: +/* Line 1269 of yacc.c. */ +#line 4231 "querytransformparser.ypp" + { + if(BuiltinTypes::xsQName->xdtTypeMatches((yyvsp[(1) - (1)].expr)->staticType()->itemType())) + (yyval.expr) = (yyvsp[(1) - (1)].expr); + else + { + (yyval.expr) = create(new QNameConstructor((yyvsp[(1) - (1)].expr), + parseInfo->staticContext->namespaceBindings()), + (yyloc), parseInfo); + } + } + break; + + case 403: +/* Line 1269 of yacc.c. */ +#line 4246 "querytransformparser.ypp" + { + (yyval.expr) = create(new NCNameConstructor(create(new Literal(AtomicString::fromValue((yyvsp[(1) - (1)].sval))), (yyloc), parseInfo)), (yyloc), parseInfo); + } + break; + + case 404: +/* Line 1269 of yacc.c. */ +#line 4250 "querytransformparser.ypp" + { + (yyval.expr) = create(new NCNameConstructor((yyvsp[(1) - (1)].expr)), (yyloc), parseInfo); + } + break; + + case 405: +/* Line 1269 of yacc.c. */ +#line 4259 "querytransformparser.ypp" + { + (yyval.expr) = create(new ComputedNamespaceConstructor((yyvsp[(2) - (3)].expr), (yyvsp[(3) - (3)].expr)), (yyloc), parseInfo); +} + break; + + case 406: +/* Line 1269 of yacc.c. */ +#line 4264 "querytransformparser.ypp" + { + (yyval.sequenceType) = makeGenericSequenceType((yyvsp[(1) - (1)].itemType), Cardinality::exactlyOne()); + } + break; + + case 407: +/* Line 1269 of yacc.c. */ +#line 4268 "querytransformparser.ypp" + { + (yyval.sequenceType) = makeGenericSequenceType((yyvsp[(1) - (2)].itemType), Cardinality::zeroOrOne()); + } + break; + + case 408: +/* Line 1269 of yacc.c. */ +#line 4273 "querytransformparser.ypp" + { + (yyval.sequenceType) = CommonSequenceTypes::ZeroOrMoreItems; + } + break; + + case 409: +/* Line 1269 of yacc.c. */ +#line 4277 "querytransformparser.ypp" + { + (yyval.sequenceType) = (yyvsp[(2) - (2)].sequenceType); + } + break; + + case 410: +/* Line 1269 of yacc.c. */ +#line 4282 "querytransformparser.ypp" + { + (yyval.sequenceType) = makeGenericSequenceType((yyvsp[(1) - (2)].itemType), (yyvsp[(2) - (2)].cardinality)); + } + break; + + case 411: +/* Line 1269 of yacc.c. */ +#line 4287 "querytransformparser.ypp" + { + (yyval.sequenceType) = CommonSequenceTypes::Empty; + } + break; + + case 412: +/* Line 1269 of yacc.c. */ +#line 4291 "querytransformparser.ypp" + {(yyval.cardinality) = Cardinality::exactlyOne();} + break; + + case 413: +/* Line 1269 of yacc.c. */ +#line 4292 "querytransformparser.ypp" + {(yyval.cardinality) = Cardinality::oneOrMore();} + break; + + case 414: +/* Line 1269 of yacc.c. */ +#line 4293 "querytransformparser.ypp" + {(yyval.cardinality) = Cardinality::zeroOrMore();} + break; + + case 415: +/* Line 1269 of yacc.c. */ +#line 4294 "querytransformparser.ypp" + {(yyval.cardinality) = Cardinality::zeroOrOne();} + break; + + case 419: +/* Line 1269 of yacc.c. */ +#line 4300 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::item; + } + break; + + case 420: +/* Line 1269 of yacc.c. */ +#line 4305 "querytransformparser.ypp" + { + const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType((yyvsp[(1) - (1)].qName))); + + if(!t) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The name %1 does not refer to any schema type.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(1) - (1)].qName))), ReportContext::XPST0051, fromYYLTYPE((yyloc), parseInfo)); + } + else if(BuiltinTypes::xsAnyAtomicType->wxsTypeMatches(t)) + (yyval.itemType) = AtomicType::Ptr(t); + else + { + /* Try to give an intelligent message. */ + if(t->isComplexType()) + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is an complex type. Casting to complex " + "types is not possible. However, casting " + "to atomic types such as %2 works.") + .arg(formatType(parseInfo->staticContext->namePool(), t)) + .arg(formatType(parseInfo->staticContext->namePool(), BuiltinTypes::xsInteger)), + ReportContext::XPST0051, fromYYLTYPE((yyloc), parseInfo)); + } + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is not an atomic type. Casting " + "is only possible to atomic types.") + .arg(formatType(parseInfo->staticContext->namePool(), t)), + ReportContext::XPST0051, fromYYLTYPE((yyloc), parseInfo)); + } + } + } + break; + + case 428: +/* Line 1269 of yacc.c. */ +#line 4349 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::node; + } + break; + + case 429: +/* Line 1269 of yacc.c. */ +#line 4354 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::document; + } + break; + + case 430: +/* Line 1269 of yacc.c. */ +#line 4359 "querytransformparser.ypp" + { + // TODO support for document element testing + (yyval.itemType) = BuiltinTypes::document; + } + break; + + case 433: +/* Line 1269 of yacc.c. */ +#line 4368 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::text; + } + break; + + case 434: +/* Line 1269 of yacc.c. */ +#line 4373 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::comment; + } + break; + + case 435: +/* Line 1269 of yacc.c. */ +#line 4378 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::pi; + } + break; + + case 436: +/* Line 1269 of yacc.c. */ +#line 4383 "querytransformparser.ypp" + { + (yyval.itemType) = LocalNameTest::create(BuiltinTypes::pi, parseInfo->staticContext->namePool()->allocateLocalName((yyvsp[(3) - (4)].sval))); + } + break; + + case 437: +/* Line 1269 of yacc.c. */ +#line 4388 "querytransformparser.ypp" + { + if(QXmlUtils::isNCName((yyvsp[(3) - (4)].sval))) + { + (yyval.itemType) = LocalNameTest::create(BuiltinTypes::pi, parseInfo->staticContext->namePool()->allocateLocalName((yyvsp[(3) - (4)].sval))); + } + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is not a valid name for a " + "processing-instruction.") + .arg(formatKeyword((yyvsp[(3) - (4)].sval))), + ReportContext::XPTY0004, + fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 440: +/* Line 1269 of yacc.c. */ +#line 4407 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::attribute; + } + break; + + case 441: +/* Line 1269 of yacc.c. */ +#line 4412 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::attribute; + } + break; + + case 442: +/* Line 1269 of yacc.c. */ +#line 4417 "querytransformparser.ypp" + { + (yyval.itemType) = QNameTest::create(BuiltinTypes::attribute, (yyvsp[(3) - (4)].qName)); + } + break; + + case 443: +/* Line 1269 of yacc.c. */ +#line 4421 "querytransformparser.ypp" + { + const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType((yyvsp[(5) - (6)].qName))); + + if(t) + (yyval.itemType) = BuiltinTypes::attribute; + else + { + parseInfo->staticContext->error(unknownType().arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(5) - (6)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 444: +/* Line 1269 of yacc.c. */ +#line 4433 "querytransformparser.ypp" + { + const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType((yyvsp[(5) - (6)].qName))); + + if(t) + (yyval.itemType) = BuiltinTypes::attribute; + else + { + parseInfo->staticContext->error(unknownType().arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(5) - (6)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 445: +/* Line 1269 of yacc.c. */ +#line 4446 "querytransformparser.ypp" + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is not in the in-scope attribute " + "declarations. Note that the schema import " + "feature is not supported.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(3) - (4)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + (yyval.itemType).reset(); + } + break; + + case 446: +/* Line 1269 of yacc.c. */ +#line 4456 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::element; + } + break; + + case 447: +/* Line 1269 of yacc.c. */ +#line 4461 "querytransformparser.ypp" + { + (yyval.itemType) = BuiltinTypes::element; + } + break; + + case 448: +/* Line 1269 of yacc.c. */ +#line 4466 "querytransformparser.ypp" + { + (yyval.itemType) = QNameTest::create(BuiltinTypes::element, (yyvsp[(3) - (4)].qName)); + } + break; + + case 449: +/* Line 1269 of yacc.c. */ +#line 4471 "querytransformparser.ypp" + { + const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType((yyvsp[(5) - (7)].qName))); + + if(t) + (yyval.itemType) = BuiltinTypes::element; + else + { + parseInfo->staticContext->error(unknownType() + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(5) - (7)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 450: +/* Line 1269 of yacc.c. */ +#line 4485 "querytransformparser.ypp" + { + const SchemaType::Ptr t(parseInfo->staticContext->schemaDefinitions()->createSchemaType((yyvsp[(5) - (7)].qName))); + + if(t) + (yyval.itemType) = BuiltinTypes::element; + else + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is an unknown schema type.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(5) - (7)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + } + } + break; + + case 453: +/* Line 1269 of yacc.c. */ +#line 4502 "querytransformparser.ypp" + { + parseInfo->staticContext->error(QtXmlPatterns::tr("%1 is not in the in-scope attribute " + "declarations. Note that the schema import " + "feature is not supported.") + .arg(formatKeyword(parseInfo->staticContext->namePool(), (yyvsp[(3) - (4)].qName))), + ReportContext::XPST0008, fromYYLTYPE((yyloc), parseInfo)); + (yyval.itemType).reset(); + } + break; + + case 455: +/* Line 1269 of yacc.c. */ +#line 4514 "querytransformparser.ypp" + { + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(StandardNamespaces::empty, (yyvsp[(1) - (1)].sval)); + } + break; + + case 457: +/* Line 1269 of yacc.c. */ +#line 4526 "querytransformparser.ypp" + { + if(parseInfo->nodeTestSource == BuiltinTypes::element) + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(parseInfo->staticContext->namespaceBindings()->lookupNamespaceURI(StandardPrefixes::empty), (yyvsp[(1) - (1)].sval)); + else + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(StandardNamespaces::empty, (yyvsp[(1) - (1)].sval)); + } + break; + + case 462: +/* Line 1269 of yacc.c. */ +#line 4540 "querytransformparser.ypp" + { + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(parseInfo->staticContext->defaultFunctionNamespace(), (yyvsp[(1) - (1)].sval)); + } + break; + + case 463: +/* Line 1269 of yacc.c. */ +#line 4544 "querytransformparser.ypp" + { + (yyval.qName) = parseInfo->staticContext->namePool()->allocateQName(StandardNamespaces::InternalXSLT, (yyvsp[(2) - (2)].sval)); + } + break; + + case 466: +/* Line 1269 of yacc.c. */ +#line 4552 "querytransformparser.ypp" + { + parseInfo->staticContext->error(QtXmlPatterns::tr("The name of an extension expression must be in " + "a namespace."), + ReportContext::XPST0081, fromYYLTYPE((yyloc), parseInfo)); + } + break; + + case 469: +/* Line 1269 of yacc.c. */ +#line 4562 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + } + break; + + case 470: +/* Line 1269 of yacc.c. */ +#line 4566 "querytransformparser.ypp" + { + allowedIn(QueryLanguages(QXmlQuery::XQuery10 | QXmlQuery::XPath20), parseInfo, (yyloc)); + } + break; + + case 471: +/* Line 1269 of yacc.c. */ +#line 4571 "querytransformparser.ypp" + { + + const ReflectYYLTYPE ryy((yyloc), parseInfo); + + (yyval.qName) = QNameConstructor:: + expandQName((yyvsp[(1) - (1)].sval), parseInfo->staticContext, + parseInfo->staticContext->namespaceBindings(), &ryy); + + } + break; + + case 472: +/* Line 1269 of yacc.c. */ +#line 4583 "querytransformparser.ypp" + { + (yyval.qName) = parseInfo->staticContext->namePool()->fromClarkName((yyvsp[(1) - (1)].sval)); + } + break; + + +/* Line 1269 of yacc.c. */ +#line 7763 "qquerytransformparser.cpp" + default: break; + } + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + *++yylsp = yyloc; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (&yylloc, parseInfo, YY_("syntax error")); +#else + { + YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); + if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) + { + YYSIZE_T yyalloc = 2 * yysize; + if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) + yyalloc = YYSTACK_ALLOC_MAXIMUM; + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yyalloc); + if (yymsg) + yymsg_alloc = yyalloc; + else + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + } + } + + if (0 < yysize && yysize <= yymsg_alloc) + { + (void) yysyntax_error (yymsg, yystate, yychar); + yyerror (&yylloc, parseInfo, yymsg); + } + else + { + yyerror (&yylloc, parseInfo, YY_("syntax error")); + if (yysize != 0) + goto yyexhaustedlab; + } + } +#endif + } + + yyerror_range[0] = yylloc; + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, &yylloc, parseInfo); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + yyerror_range[0] = yylsp[1-yylen]; + /* Do not reclaim the symbols of the rule which action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + yyerror_range[0] = *yylsp; + yydestruct ("Error: popping", + yystos[yystate], yyvsp, yylsp, parseInfo); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + *++yyvsp = yylval; + + yyerror_range[1] = yylloc; + /* Using YYLLOC is tempting, but would change the location of + the lookahead. YYLOC is available though. */ + YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2); + *++yylsp = yyloc; + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (&yylloc, parseInfo, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, &yylloc, parseInfo); + /* Do not reclaim the symbols of the rule which action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, yylsp, parseInfo); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + /* Make sure YYID is used. */ + return YYID (yyresult); +} + + +/* Line 1486 of yacc.c. */ +#line 4587 "querytransformparser.ypp" + + +QString Tokenizer::tokenToString(const Token &token) +{ + switch(token.type) + { + case NCNAME: + /* Fallthrough. */ + case QNAME: + /* Fallthrough. */ + case NUMBER: + /* Fallthrough. */ + case XPATH2_NUMBER: + return token.value; + case STRING_LITERAL: + return QLatin1Char('"') + token.value + QLatin1Char('"'); + default: + { + const QString raw(QString::fromLatin1(yytname[YYTRANSLATE(token.type)])); + + /* Remove the quotes. */ + if(raw.at(0) == QLatin1Char('"') && raw.length() > 1) + return raw.mid(1, raw.length() - 2); + else + return raw; + } + } +} + +} /* namespace Patternist */ + +QT_END_NAMESPACE + +// vim: et:ts=4:sw=4:sts=4:syntax=yacc +