// This file was generated by qlalr - DO NOT EDIT! | |
/**************************************************************************** | |
** | |
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). | |
** All rights reserved. | |
** Contact: Nokia Corporation (qt-info@nokia.com) | |
** | |
** This file is part of the Qt Linguist of the Qt Toolkit. | |
** | |
** $QT_BEGIN_LICENSE:LGPL$ | |
** GNU Lesser General Public License Usage | |
** 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. | |
** | |
** GNU General Public License Usage | |
** Alternatively, this file may be used under the terms of the GNU General | |
** Public License version 3.0 as published by the Free Software Foundation | |
** and appearing in the file LICENSE.GPL included in the packaging of this | |
** file. Please review the following information to ensure the GNU General | |
** Public License version 3.0 requirements will be met: | |
** http://www.gnu.org/copyleft/gpl.html. | |
** | |
** Other Usage | |
** Alternatively, this file may be used in accordance with the terms and | |
** conditions contained in a signed written agreement between you and Nokia. | |
** | |
** | |
** | |
** | |
** | |
** $QT_END_LICENSE$ | |
** | |
****************************************************************************/ | |
#define Q_SCRIPT_REGEXPLITERAL_RULE1 7 | |
#define Q_SCRIPT_REGEXPLITERAL_RULE2 8 | |
#include <translator.h> | |
#include <QtCore/QCoreApplication> | |
#include <QtCore/qdebug.h> | |
#include <QtCore/qnumeric.h> | |
#include <QtCore/qstring.h> | |
#include <QtCore/qtextcodec.h> | |
#include <QtCore/qvariant.h> | |
#include <iostream> | |
#include <ctype.h> | |
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
QT_BEGIN_NAMESPACE | |
class LU { | |
Q_DECLARE_TR_FUNCTIONS(LUpdate) | |
}; | |
class QScriptGrammar | |
{ | |
public: | |
enum { | |
EOF_SYMBOL = 0, | |
T_AND = 1, | |
T_AND_AND = 2, | |
T_AND_EQ = 3, | |
T_AUTOMATIC_SEMICOLON = 62, | |
T_BREAK = 4, | |
T_CASE = 5, | |
T_CATCH = 6, | |
T_COLON = 7, | |
T_COMMA = 8, | |
T_CONST = 81, | |
T_CONTINUE = 9, | |
T_DEBUGGER = 82, | |
T_DEFAULT = 10, | |
T_DELETE = 11, | |
T_DIVIDE_ = 12, | |
T_DIVIDE_EQ = 13, | |
T_DO = 14, | |
T_DOT = 15, | |
T_ELSE = 16, | |
T_EQ = 17, | |
T_EQ_EQ = 18, | |
T_EQ_EQ_EQ = 19, | |
T_FALSE = 80, | |
T_FINALLY = 20, | |
T_FOR = 21, | |
T_FUNCTION = 22, | |
T_GE = 23, | |
T_GT = 24, | |
T_GT_GT = 25, | |
T_GT_GT_EQ = 26, | |
T_GT_GT_GT = 27, | |
T_GT_GT_GT_EQ = 28, | |
T_IDENTIFIER = 29, | |
T_IF = 30, | |
T_IN = 31, | |
T_INSTANCEOF = 32, | |
T_LBRACE = 33, | |
T_LBRACKET = 34, | |
T_LE = 35, | |
T_LPAREN = 36, | |
T_LT = 37, | |
T_LT_LT = 38, | |
T_LT_LT_EQ = 39, | |
T_MINUS = 40, | |
T_MINUS_EQ = 41, | |
T_MINUS_MINUS = 42, | |
T_NEW = 43, | |
T_NOT = 44, | |
T_NOT_EQ = 45, | |
T_NOT_EQ_EQ = 46, | |
T_NULL = 78, | |
T_NUMERIC_LITERAL = 47, | |
T_OR = 48, | |
T_OR_EQ = 49, | |
T_OR_OR = 50, | |
T_PLUS = 51, | |
T_PLUS_EQ = 52, | |
T_PLUS_PLUS = 53, | |
T_QUESTION = 54, | |
T_RBRACE = 55, | |
T_RBRACKET = 56, | |
T_REMAINDER = 57, | |
T_REMAINDER_EQ = 58, | |
T_RESERVED_WORD = 83, | |
T_RETURN = 59, | |
T_RPAREN = 60, | |
T_SEMICOLON = 61, | |
T_STAR = 63, | |
T_STAR_EQ = 64, | |
T_STRING_LITERAL = 65, | |
T_SWITCH = 66, | |
T_THIS = 67, | |
T_THROW = 68, | |
T_TILDE = 69, | |
T_TRUE = 79, | |
T_TRY = 70, | |
T_TYPEOF = 71, | |
T_VAR = 72, | |
T_VOID = 73, | |
T_WHILE = 74, | |
T_WITH = 75, | |
T_XOR = 76, | |
T_XOR_EQ = 77, | |
ACCEPT_STATE = 236, | |
RULE_COUNT = 267, | |
STATE_COUNT = 465, | |
TERMINAL_COUNT = 84, | |
NON_TERMINAL_COUNT = 88, | |
GOTO_INDEX_OFFSET = 465, | |
GOTO_INFO_OFFSET = 1374, | |
GOTO_CHECK_OFFSET = 1374 | |
}; | |
static const char *const spell []; | |
static const int lhs []; | |
static const int rhs []; | |
static const int goto_default []; | |
static const int action_default []; | |
static const int action_index []; | |
static const int action_info []; | |
static const int action_check []; | |
static inline int nt_action (int state, int nt) | |
{ | |
const int *const goto_index = &action_index [GOTO_INDEX_OFFSET]; | |
const int *const goto_check = &action_check [GOTO_CHECK_OFFSET]; | |
const int yyn = goto_index [state] + nt; | |
if (yyn < 0 || goto_check [yyn] != nt) | |
return goto_default [nt]; | |
const int *const goto_info = &action_info [GOTO_INFO_OFFSET]; | |
return goto_info [yyn]; | |
} | |
static inline int t_action (int state, int token) | |
{ | |
const int yyn = action_index [state] + token; | |
if (yyn < 0 || action_check [yyn] != token) | |
return - action_default [state]; | |
return action_info [yyn]; | |
} | |
}; | |
const char *const QScriptGrammar::spell [] = { | |
"end of file", "&", "&&", "&=", "break", "case", "catch", ":", ";", "continue", | |
"default", "delete", "/", "/=", "do", ".", "else", "=", "==", "===", | |
"finally", "for", "function", ">=", ">", ">>", ">>=", ">>>", ">>>=", "identifier", | |
"if", "in", "instanceof", "{", "[", "<=", "(", "<", "<<", "<<=", | |
"-", "-=", "--", "new", "!", "!=", "!==", "numeric literal", "|", "|=", | |
"||", "+", "+=", "++", "?", "}", "]", "%", "%=", "return", | |
")", ";", 0, "*", "*=", "string literal", "switch", "this", "throw", "~", | |
"try", "typeof", "var", "void", "while", "with", "^", "^=", "null", "true", | |
"false", "const", "debugger", "reserved word"}; | |
const int QScriptGrammar::lhs [] = { | |
85, 85, 85, 85, 85, 85, 85, 85, 85, 85, | |
85, 85, 85, 85, 87, 87, 91, 91, 86, 86, | |
92, 92, 93, 93, 93, 93, 94, 94, 94, 94, | |
94, 94, 94, 94, 94, 94, 94, 94, 94, 94, | |
94, 94, 94, 94, 94, 94, 94, 94, 94, 94, | |
94, 94, 94, 94, 94, 94, 94, 95, 95, 96, | |
96, 96, 96, 96, 99, 99, 100, 100, 100, 100, | |
98, 98, 101, 101, 102, 102, 103, 103, 103, 104, | |
104, 104, 104, 104, 104, 104, 104, 104, 104, 105, | |
105, 105, 105, 106, 106, 106, 107, 107, 107, 107, | |
108, 108, 108, 108, 108, 108, 108, 109, 109, 109, | |
109, 109, 109, 110, 110, 110, 110, 110, 111, 111, | |
111, 111, 111, 112, 112, 113, 113, 114, 114, 115, | |
115, 116, 116, 117, 117, 118, 118, 119, 119, 120, | |
120, 121, 121, 122, 122, 123, 123, 90, 90, 124, | |
124, 125, 125, 125, 125, 125, 125, 125, 125, 125, | |
125, 125, 125, 89, 89, 126, 126, 127, 127, 128, | |
128, 129, 129, 129, 129, 129, 129, 129, 129, 129, | |
129, 129, 129, 129, 129, 129, 130, 146, 146, 145, | |
145, 131, 131, 147, 147, 148, 148, 150, 150, 149, | |
151, 154, 152, 152, 155, 153, 153, 132, 133, 133, | |
134, 134, 135, 135, 135, 135, 135, 135, 135, 136, | |
136, 136, 136, 137, 137, 137, 137, 138, 138, 139, | |
141, 156, 156, 159, 159, 157, 157, 160, 158, 140, | |
142, 142, 143, 143, 143, 161, 162, 144, 163, 97, | |
167, 167, 164, 164, 165, 165, 168, 84, 169, 169, | |
170, 170, 166, 166, 88, 88, 171}; | |
const int QScriptGrammar:: rhs[] = { | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 3, | |
3, 5, 3, 3, 2, 4, 1, 2, 0, 1, | |
3, 5, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 4, 3, 3, 1, 2, 2, 2, 4, 3, | |
2, 3, 1, 3, 1, 1, 1, 2, 2, 1, | |
2, 2, 2, 2, 2, 2, 2, 2, 2, 1, | |
3, 3, 3, 1, 3, 3, 1, 3, 3, 3, | |
1, 3, 3, 3, 3, 3, 3, 1, 3, 3, | |
3, 3, 3, 1, 3, 3, 3, 3, 1, 3, | |
3, 3, 3, 1, 3, 1, 3, 1, 3, 1, | |
3, 1, 3, 1, 3, 1, 3, 1, 3, 1, | |
3, 1, 3, 1, 5, 1, 5, 1, 3, 1, | |
3, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 3, 0, 1, 1, 3, 0, | |
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | |
1, 1, 1, 1, 1, 1, 3, 1, 2, 0, | |
1, 3, 3, 1, 1, 1, 3, 1, 3, 2, | |
2, 2, 0, 1, 2, 0, 1, 1, 2, 2, | |
7, 5, 7, 7, 5, 9, 10, 7, 8, 2, | |
2, 3, 3, 2, 2, 3, 3, 3, 3, 5, | |
5, 3, 5, 1, 2, 0, 1, 4, 3, 3, | |
3, 3, 3, 3, 4, 5, 2, 1, 8, 8, | |
1, 3, 0, 1, 0, 1, 1, 1, 1, 2, | |
1, 1, 0, 1, 0, 1, 2}; | |
const int QScriptGrammar::action_default [] = { | |
0, 97, 164, 128, 136, 132, 172, 179, 76, 148, | |
178, 186, 174, 124, 0, 175, 262, 61, 176, 177, | |
182, 77, 140, 144, 65, 94, 75, 80, 60, 0, | |
114, 180, 101, 259, 258, 261, 183, 0, 194, 0, | |
248, 0, 8, 9, 0, 5, 0, 263, 2, 0, | |
265, 19, 0, 0, 0, 0, 0, 3, 6, 0, | |
0, 166, 208, 7, 0, 1, 0, 0, 4, 0, | |
0, 195, 0, 0, 0, 184, 185, 90, 0, 173, | |
181, 0, 0, 77, 96, 263, 2, 265, 79, 78, | |
0, 0, 0, 92, 93, 91, 0, 264, 253, 254, | |
0, 251, 0, 252, 0, 255, 256, 0, 257, 250, | |
260, 0, 266, 0, 26, 27, 28, 29, 30, 31, | |
32, 33, 34, 35, 36, 37, 38, 39, 40, 23, | |
41, 42, 43, 44, 45, 25, 46, 47, 24, 48, | |
49, 50, 51, 52, 53, 54, 55, 56, 57, 0, | |
21, 0, 0, 0, 22, 13, 95, 0, 125, 0, | |
0, 0, 0, 115, 0, 0, 0, 0, 0, 0, | |
105, 0, 0, 0, 99, 100, 98, 103, 107, 106, | |
104, 102, 117, 116, 118, 0, 133, 0, 129, 68, | |
0, 0, 0, 70, 59, 58, 0, 0, 69, 165, | |
0, 73, 71, 0, 72, 74, 209, 210, 0, 161, | |
154, 152, 159, 160, 158, 157, 163, 156, 155, 153, | |
162, 149, 0, 137, 0, 0, 141, 0, 0, 145, | |
67, 0, 0, 63, 0, 62, 267, 224, 0, 225, | |
226, 227, 220, 0, 221, 222, 223, 81, 0, 0, | |
0, 0, 0, 213, 214, 170, 168, 130, 138, 134, | |
150, 126, 171, 0, 77, 142, 146, 119, 108, 0, | |
0, 127, 0, 0, 0, 0, 120, 0, 0, 0, | |
0, 0, 112, 110, 113, 111, 109, 122, 121, 123, | |
0, 135, 0, 131, 0, 169, 77, 0, 151, 166, | |
167, 0, 166, 0, 0, 216, 0, 0, 0, 218, | |
0, 139, 0, 0, 143, 0, 0, 147, 206, 0, | |
198, 207, 201, 0, 205, 0, 166, 199, 0, 166, | |
0, 0, 217, 0, 0, 0, 219, 264, 253, 0, | |
0, 255, 0, 249, 0, 240, 0, 0, 0, 212, | |
0, 211, 188, 191, 0, 27, 30, 31, 248, 34, | |
35, 5, 39, 40, 2, 41, 44, 3, 6, 166, | |
7, 48, 1, 50, 4, 52, 53, 54, 55, 56, | |
57, 189, 187, 65, 66, 64, 0, 228, 229, 0, | |
0, 0, 231, 236, 234, 237, 0, 0, 235, 236, | |
0, 232, 0, 233, 190, 239, 0, 190, 238, 0, | |
241, 242, 0, 190, 243, 244, 0, 0, 245, 0, | |
0, 0, 246, 247, 83, 82, 0, 0, 0, 215, | |
0, 0, 0, 230, 0, 20, 0, 17, 19, 11, | |
0, 16, 12, 18, 15, 10, 0, 14, 87, 85, | |
89, 86, 84, 88, 203, 196, 0, 204, 200, 0, | |
202, 192, 0, 193, 197}; | |
const int QScriptGrammar::goto_default [] = { | |
29, 28, 436, 434, 113, 14, 2, 435, 112, 111, | |
114, 193, 24, 17, 189, 26, 8, 200, 21, 27, | |
77, 25, 1, 32, 30, 267, 13, 261, 3, 257, | |
5, 259, 4, 258, 22, 265, 23, 266, 9, 260, | |
256, 297, 386, 262, 263, 35, 6, 79, 12, 15, | |
18, 19, 10, 7, 31, 80, 20, 36, 75, 76, | |
11, 354, 353, 78, 456, 455, 319, 320, 458, 322, | |
457, 321, 392, 396, 399, 395, 394, 414, 415, 16, | |
100, 107, 96, 99, 106, 108, 33, 0}; | |
const int QScriptGrammar::action_index [] = { | |
1210, 59, -84, 71, 41, -1, -84, -84, 148, -84, | |
-84, -84, -84, 201, 130, -84, -84, -84, -84, -84, | |
-84, 343, 67, 62, 122, 109, -84, -84, -84, 85, | |
273, -84, 184, -84, 1210, -84, -84, 119, -84, 112, | |
-84, 521, -84, -84, 1130, -84, 45, 54, 58, 38, | |
1290, 50, 521, 521, 521, 376, 521, -84, -84, 521, | |
521, 521, -84, -84, 25, -84, 521, 521, -84, 43, | |
521, -84, 521, 18, 15, -84, -84, -84, 24, -84, | |
-84, 521, 521, 64, 153, 27, -84, 1050, -84, -84, | |
521, 521, 521, -84, -84, -84, 28, -84, 37, 55, | |
19, -84, 33, -84, 34, 1210, -84, 16, 1210, -84, | |
-84, 39, 52, -3, -84, -84, -84, -84, -84, -84, | |
-84, -84, -84, -84, -84, -84, -84, -84, -84, -84, | |
-84, -84, -84, -84, -84, -84, -84, -84, -84, -84, | |
-84, -84, -84, -84, -84, -84, -84, -84, -84, 521, | |
-84, 1050, 125, 521, -84, -84, 155, 521, 189, 521, | |
521, 521, 521, 248, 521, 521, 521, 521, 521, 521, | |
243, 521, 521, 521, 75, 82, 94, 177, 184, 184, | |
184, 184, 263, 283, 298, 521, 44, 521, 77, -84, | |
970, 521, 817, -84, -84, -84, 95, 521, -84, -84, | |
93, -84, -84, 521, -84, -84, -84, -84, 521, -84, | |
-84, -84, -84, -84, -84, -84, -84, -84, -84, -84, | |
-84, -84, 521, 41, 521, 521, 68, 66, 521, -84, | |
-84, 970, 521, -84, 103, -84, -84, -84, 63, -84, | |
-84, -84, -84, 69, -84, -84, -84, -84, -27, 12, | |
521, 92, 100, -84, -84, 890, -84, 31, -13, -45, | |
-84, 210, 32, -28, 387, 20, 73, 304, 117, -5, | |
521, 212, 521, 521, 521, 521, 213, 521, 521, 521, | |
521, 521, 151, 150, 176, 158, 168, 304, 304, 228, | |
521, -72, 521, 4, 521, -84, 306, 521, -84, 521, | |
8, -50, 521, -48, 1130, -84, 521, 80, 1130, -84, | |
521, -33, 521, 521, 5, 48, 521, -84, 17, 88, | |
11, -84, -84, 521, -84, -29, 521, -84, -41, 521, | |
-39, 1130, -84, 521, 87, 1130, -84, -8, -2, -35, | |
10, 1210, -16, -84, 1130, -84, 521, 86, 1130, -14, | |
1130, -84, -84, 1130, -36, 107, -21, 165, 3, 521, | |
1130, 6, 14, 61, 7, -19, 448, -4, -6, 671, | |
29, 13, 23, 521, 30, -10, 521, 9, 521, -30, | |
-18, -84, -84, 164, -84, -84, 46, -84, -84, 521, | |
111, -24, -84, 36, -84, 40, 99, 521, -84, 21, | |
22, -84, -11, -84, 1130, -84, 106, 1130, -84, 178, | |
-84, -84, 98, 1130, 57, -84, 56, 60, -84, 51, | |
26, 35, -84, -84, -84, -84, 521, 97, 1130, -84, | |
521, 90, 1130, -84, 79, 76, 744, -84, 49, -84, | |
594, -84, -84, -84, -84, -84, 83, -84, -84, -84, | |
-84, -84, -84, -84, 42, -84, 162, -84, -84, 521, | |
-84, -84, 53, -84, -84, | |
-61, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -4, -88, -88, 22, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -51, -88, -88, -88, -88, -88, | |
-88, 105, -88, -88, -12, -88, -88, -88, -88, -88, | |
-7, -88, 35, 132, 62, 154, 79, -88, -88, 100, | |
75, 36, -88, -88, -88, -88, 37, 70, -88, -1, | |
86, -88, 92, -88, -88, -88, -88, -88, -88, -88, | |
-88, 90, 95, -88, -88, -88, -88, -88, -88, -88, | |
87, 82, 74, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -47, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, 28, | |
-88, 20, -88, 19, -88, -88, -88, 39, -88, 42, | |
43, 106, 61, -88, 63, 55, 52, 53, 91, 125, | |
-88, 120, 123, 118, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, 116, -88, 59, -88, -88, | |
16, 18, 15, -88, -88, -88, -88, 21, -88, -88, | |
-88, -88, -88, 24, -88, -88, -88, -88, 38, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, 97, -88, 115, 25, -88, -88, 26, -88, | |
-88, 111, 14, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
23, -88, -88, -88, -88, 108, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
160, -88, 171, 163, 145, 179, -88, 135, 45, 41, | |
66, 80, -88, -88, -88, -88, -88, -88, -88, -88, | |
172, -88, 156, -88, 142, -88, -88, 144, -88, 122, | |
-88, -88, 114, -88, -23, -88, 48, -88, 29, -88, | |
224, -88, 157, 175, -88, -88, 182, -88, -88, -88, | |
-88, -88, -88, 183, -88, -21, 134, -88, -88, 49, | |
-88, 3, -88, 44, -88, 2, -88, -88, -37, -88, | |
-88, -31, -88, -88, 10, -88, 47, -88, 17, -88, | |
27, -88, -88, 13, -88, -88, -88, -88, -88, 117, | |
6, -88, -88, -88, -88, -88, 154, -88, -88, 1, | |
-88, -88, -88, 7, -88, -35, 137, -88, 141, -88, | |
-88, -88, -88, -6, -88, -88, -88, -88, -88, 78, | |
-88, -88, -88, -88, -88, -69, -88, 11, -88, -59, | |
-88, -88, -88, -88, 83, -88, -88, 56, -88, -88, | |
-88, -88, -88, -40, -58, -88, -88, -29, -88, -88, | |
-88, -45, -88, -88, -88, -88, -3, -88, -42, -88, | |
-5, -88, -32, -88, -88, -88, 9, -88, 8, -88, | |
-2, -88, -88, -88, -88, -88, -88, -88, -88, -88, | |
-88, -88, -88, -88, -88, -88, -88, -88, -88, 12, | |
-88, -88, -56, -88, -88}; | |
const int QScriptGrammar::action_info [] = { | |
318, -25, 350, -45, 292, 270, 426, 310, -194, 393, | |
-32, 302, 304, -37, 344, 290, 197, 346, 430, 382, | |
329, 331, 310, 413, 318, 340, 397, 101, 338, 404, | |
-49, 292, 270, 299, 323, 290, -24, -51, -195, 343, | |
294, 397, 333, 341, 403, 397, 149, 249, 250, 389, | |
255, 430, 155, 454, 426, 316, 97, 437, 437, 459, | |
151, 389, 103, 102, 98, 344, 101, 105, 413, 222, | |
222, 109, 157, 228, 346, 187, 413, 417, 157, 104, | |
420, 255, 454, 337, 443, 236, 421, 438, 197, 185, | |
97, 197, 419, 413, 197, 197, 325, -263, 197, 81, | |
197, 203, 0, 197, 416, 197, 88, 388, 387, 400, | |
82, 197, 224, 407, 197, 81, 225, 89, 417, 197, | |
187, 90, 81, 312, 241, 240, 82, 313, 0, 0, | |
246, 245, 153, 82, 81, 439, 238, 231, 197, 0, | |
308, 243, 171, 447, 172, 82, 348, 335, 238, 326, | |
432, 198, 252, 204, 401, 173, 232, 428, 192, 235, | |
0, 254, 253, 190, 0, 90, 91, 90, 239, 237, | |
462, 391, 92, 244, 242, 171, 171, 172, 172, 231, | |
239, 237, 191, 171, 192, 172, 197, 0, 173, 173, | |
0, 207, 206, 171, 243, 172, 173, 0, 232, 0, | |
192, 171, 171, 172, 172, 0, 173, 159, 160, 171, | |
91, 172, 91, 0, 173, 173, 92, 0, 92, 159, | |
160, 0, 173, 463, 461, 0, 244, 242, 272, 273, | |
272, 273, 0, 0, 161, 162, 277, 278, 0, 411, | |
410, 0, 0, 0, 0, 279, 161, 162, 280, 0, | |
281, 277, 278, 0, 0, 274, 275, 274, 275, 0, | |
279, 0, 0, 280, 0, 281, 0, 0, 171, 0, | |
172, 164, 165, 0, 0, 0, 0, 0, 0, 166, | |
167, 173, 0, 168, 0, 169, 164, 165, 0, 0, | |
0, 0, 0, 0, 166, 167, 164, 165, 168, 0, | |
169, 0, 0, 0, 166, 167, 164, 165, 168, 209, | |
169, 0, 0, 0, 166, 167, 0, 0, 168, 210, | |
169, 164, 165, 211, 0, 0, 0, 277, 278, 166, | |
167, 0, 212, 168, 213, 169, 279, 0, 0, 280, | |
0, 281, 0, 0, 0, 214, 209, 215, 88, 0, | |
0, 0, 0, 0, 0, 216, 210, 0, 217, 89, | |
211, 0, 0, 0, 218, 0, 0, 0, 0, 212, | |
219, 213, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 214, 220, 215, 88, 0, 0, 42, 43, | |
209, 0, 216, 0, 0, 217, 89, 0, 85, 0, | |
210, 218, 0, 0, 211, 86, 0, 219, 0, 87, | |
51, 0, 52, 212, 0, 213, 0, 0, 306, 55, | |
220, 0, 0, 58, 0, 0, 214, 0, 215, 88, | |
0, 0, 0, 0, 0, 0, 216, 0, 0, 217, | |
89, 63, 0, 65, 0, 218, 0, 0, 0, 0, | |
0, 219, 0, 0, 57, 68, 45, 0, 0, 0, | |
42, 43, 0, 0, 220, 0, 0, 0, 0, 0, | |
85, 0, 0, 0, 0, 0, 0, 86, 0, 0, | |
0, 87, 51, 0, 52, 0, 0, 0, 0, 0, | |
0, 55, 0, 0, 0, 58, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 63, 0, 65, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 57, 68, 45, 0, | |
0, 0, 41, 42, 43, 0, 0, 0, 0, 0, | |
0, 0, 0, 85, 0, 0, 0, 0, 0, 0, | |
86, 0, 0, 0, 87, 51, 0, 52, 0, 0, | |
0, 53, 0, 54, 55, 56, 0, 0, 58, 0, | |
0, 0, 59, 0, 60, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 63, 0, 65, 0, | |
67, 0, 70, 0, 72, 0, 0, 0, 0, 57, | |
68, 45, 0, 0, 0, 41, 42, 43, 0, 0, | |
0, 0, 0, 0, 0, 0, 85, 0, 0, 0, | |
0, 0, 0, 86, 0, 0, 0, 87, 51, 0, | |
52, 0, 0, 0, 53, 0, 54, 55, 56, 0, | |
0, 58, 0, 0, 0, 59, 0, 60, 0, 0, | |
442, 0, 0, 0, 0, 0, 0, 0, 0, 63, | |
0, 65, 0, 67, 0, 70, 0, 72, 0, 0, | |
0, 0, 57, 68, 45, 0, 0, 0, -47, 0, | |
0, 0, 41, 42, 43, 0, 0, 0, 0, 0, | |
0, 0, 0, 85, 0, 0, 0, 0, 0, 0, | |
86, 0, 0, 0, 87, 51, 0, 52, 0, 0, | |
0, 53, 0, 54, 55, 56, 0, 0, 58, 0, | |
0, 0, 59, 0, 60, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 63, 0, 65, 0, | |
67, 0, 70, 0, 72, 0, 0, 0, 0, 57, | |
68, 45, 0, 0, 0, 41, 42, 43, 0, 0, | |
0, 0, 0, 0, 0, 0, 85, 0, 0, 0, | |
0, 0, 0, 86, 0, 0, 0, 87, 51, 0, | |
52, 0, 0, 0, 53, 0, 54, 55, 56, 0, | |
0, 58, 0, 0, 0, 59, 0, 60, 0, 0, | |
445, 0, 0, 0, 0, 0, 0, 0, 0, 63, | |
0, 65, 0, 67, 0, 70, 0, 72, 0, 0, | |
0, 0, 57, 68, 45, 0, 0, 0, 41, 42, | |
43, 0, 0, 0, 0, 0, 0, 0, 0, 85, | |
0, 0, 0, 0, 0, 0, 86, 0, 0, 0, | |
87, 51, 0, 52, 0, 0, 0, 53, 0, 54, | |
55, 56, 0, 0, 58, 0, 0, 0, 59, 0, | |
60, 0, 0, 0, 0, 0, 0, 202, 0, 0, | |
0, 0, 63, 0, 65, 0, 67, 0, 70, 0, | |
72, 0, 0, 0, 0, 57, 68, 45, 0, 0, | |
0, 41, 42, 43, 0, 0, 0, 0, 0, 0, | |
0, 0, 85, 0, 0, 0, 0, 0, 0, 86, | |
0, 0, 0, 87, 51, 0, 52, 0, 0, 0, | |
53, 0, 54, 55, 56, 0, 0, 58, 0, 0, | |
0, 59, 0, 60, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 63, 0, 65, 0, 67, | |
0, 70, 269, 72, 0, 0, 0, 0, 57, 68, | |
45, 0, 0, 0, 115, 116, 117, 0, 0, 119, | |
121, 122, 0, 0, 123, 0, 124, 0, 0, 0, | |
126, 127, 128, 0, 0, 0, 0, 0, 0, 195, | |
130, 131, 132, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 133, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 137, | |
0, 0, 0, 0, 0, 0, 139, 140, 141, 0, | |
143, 144, 145, 146, 147, 148, 0, 0, 134, 142, | |
125, 118, 120, 136, 115, 116, 117, 0, 0, 119, | |
121, 122, 0, 0, 123, 0, 124, 0, 0, 0, | |
126, 127, 128, 0, 0, 0, 0, 0, 0, 129, | |
130, 131, 132, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 133, 0, 0, 0, 135, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 137, | |
0, 0, 0, 0, 0, 138, 139, 140, 141, 0, | |
143, 144, 145, 146, 147, 148, 0, 0, 134, 142, | |
125, 118, 120, 136, 37, 0, 0, 0, 0, 39, | |
0, 41, 42, 43, 44, 0, 0, 0, 0, 0, | |
0, 46, 85, 0, 0, 0, 0, 0, 0, 48, | |
49, 0, 0, 50, 51, 0, 52, 0, 0, 0, | |
53, 0, 54, 55, 56, 0, 0, 58, 0, 0, | |
0, 59, 0, 60, 0, 0, 0, 0, 0, 61, | |
0, 62, 0, 0, 0, 63, 64, 65, 66, 67, | |
69, 70, 71, 72, 73, 74, 0, 0, 57, 68, | |
45, 38, 40, 0, 37, 0, 0, 0, 0, 39, | |
0, 41, 42, 43, 44, 0, 0, 0, 0, 0, | |
0, 46, 47, 0, 0, 0, 0, 0, 0, 48, | |
49, 0, 0, 50, 51, 0, 52, 0, 0, 0, | |
53, 0, 54, 55, 56, 0, 0, 58, 0, 0, | |
0, 59, 0, 60, 0, 0, 0, 0, 0, 61, | |
0, 62, 0, 0, 0, 63, 64, 65, 66, 67, | |
69, 70, 71, 72, 73, 74, 0, 0, 57, 68, | |
45, 38, 40, 0, 355, 116, 117, 0, 0, 357, | |
121, 359, 42, 43, 360, 0, 124, 0, 0, 0, | |
126, 362, 363, 0, 0, 0, 0, 0, 0, 364, | |
365, 131, 132, 50, 51, 0, 52, 0, 0, 0, | |
53, 0, 54, 366, 56, 0, 0, 368, 0, 0, | |
0, 59, 0, 60, 0, -190, 0, 0, 0, 369, | |
0, 62, 0, 0, 0, 370, 371, 372, 373, 67, | |
375, 376, 377, 378, 379, 380, 0, 0, 367, 374, | |
361, 356, 358, 136, | |
431, 422, 427, 429, 441, 352, 300, 398, 385, 464, | |
440, 412, 409, 433, 402, 444, 406, 423, 460, 234, | |
418, 201, 305, 196, 34, 154, 194, 199, 251, 152, | |
205, 227, 229, 248, 150, 110, 230, 208, 352, 110, | |
446, 300, 409, 339, 221, 412, 327, 336, 332, 334, | |
342, 248, 347, 307, 300, 345, 0, 83, 381, 83, | |
83, 83, 349, 83, 284, 158, 163, 182, 283, 0, | |
83, 83, 351, 83, 309, 178, 179, 83, 177, 83, | |
83, 83, 449, 390, 83, 184, 170, 188, 83, 285, | |
453, 330, 83, 83, 95, 452, 0, 83, 83, 450, | |
83, 352, 94, 286, 83, 83, 424, 93, 83, 83, | |
83, 84, 425, 83, 180, 83, 156, 408, 83, 300, | |
451, 194, 233, 83, 83, 247, 264, 300, 352, 223, | |
183, 268, 0, 83, 83, 83, 83, 247, 83, 300, | |
176, 83, 174, 83, 405, 175, 186, 0, 181, 226, | |
83, 0, 448, 83, 0, 83, 303, 424, 282, 83, | |
296, 425, 296, 83, 301, 268, 383, 268, 268, 384, | |
288, 0, 0, 0, 83, 83, 328, 0, 83, 268, | |
268, 83, 295, 268, 298, 293, 268, 271, 287, 83, | |
83, 0, 314, 296, 268, 268, 276, 83, 268, 0, | |
296, 296, 268, 291, 289, 268, 268, 0, 0, 0, | |
0, 0, 0, 0, 0, 315, 0, 0, 0, 0, | |
0, 0, 317, 324, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 83, 0, 0, 0, 0, 268, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 311, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | |
0, 0}; | |
const int QScriptGrammar::action_check [] = { | |
29, 7, 16, 7, 76, 1, 36, 2, 29, 33, | |
7, 61, 60, 7, 7, 48, 8, 36, 36, 55, | |
61, 60, 2, 33, 29, 60, 5, 29, 36, 7, | |
7, 76, 1, 61, 17, 48, 7, 7, 29, 55, | |
8, 5, 31, 33, 55, 5, 7, 74, 36, 36, | |
36, 36, 55, 29, 36, 7, 29, 8, 8, 17, | |
8, 36, 29, 8, 36, 7, 29, 33, 33, 2, | |
2, 55, 1, 7, 36, 76, 33, 20, 1, 60, | |
29, 36, 29, 29, 8, 0, 60, 8, 8, 48, | |
29, 8, 36, 33, 8, 8, 8, 36, 8, 40, | |
8, 8, -1, 8, 6, 8, 42, 61, 62, 10, | |
51, 8, 50, 7, 8, 40, 54, 53, 20, 8, | |
76, 12, 40, 50, 61, 62, 51, 54, -1, -1, | |
61, 62, 7, 51, 40, 56, 29, 15, 8, -1, | |
60, 29, 25, 60, 27, 51, 60, 60, 29, 61, | |
60, 56, 60, 60, 55, 38, 34, 60, 36, 56, | |
-1, 61, 62, 15, -1, 12, 57, 12, 61, 62, | |
8, 60, 63, 61, 62, 25, 25, 27, 27, 15, | |
61, 62, 34, 25, 36, 27, 8, -1, 38, 38, | |
-1, 61, 62, 25, 29, 27, 38, -1, 34, -1, | |
36, 25, 25, 27, 27, -1, 38, 18, 19, 25, | |
57, 27, 57, -1, 38, 38, 63, -1, 63, 18, | |
19, -1, 38, 61, 62, -1, 61, 62, 18, 19, | |
18, 19, -1, -1, 45, 46, 23, 24, -1, 61, | |
62, -1, -1, -1, -1, 32, 45, 46, 35, -1, | |
37, 23, 24, -1, -1, 45, 46, 45, 46, -1, | |
32, -1, -1, 35, -1, 37, -1, -1, 25, -1, | |
27, 23, 24, -1, -1, -1, -1, -1, -1, 31, | |
32, 38, -1, 35, -1, 37, 23, 24, -1, -1, | |
-1, -1, -1, -1, 31, 32, 23, 24, 35, -1, | |
37, -1, -1, -1, 31, 32, 23, 24, 35, 3, | |
37, -1, -1, -1, 31, 32, -1, -1, 35, 13, | |
37, 23, 24, 17, -1, -1, -1, 23, 24, 31, | |
32, -1, 26, 35, 28, 37, 32, -1, -1, 35, | |
-1, 37, -1, -1, -1, 39, 3, 41, 42, -1, | |
-1, -1, -1, -1, -1, 49, 13, -1, 52, 53, | |
17, -1, -1, -1, 58, -1, -1, -1, -1, 26, | |
64, 28, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, 39, 77, 41, 42, -1, -1, 12, 13, | |
3, -1, 49, -1, -1, 52, 53, -1, 22, -1, | |
13, 58, -1, -1, 17, 29, -1, 64, -1, 33, | |
34, -1, 36, 26, -1, 28, -1, -1, 31, 43, | |
77, -1, -1, 47, -1, -1, 39, -1, 41, 42, | |
-1, -1, -1, -1, -1, -1, 49, -1, -1, 52, | |
53, 65, -1, 67, -1, 58, -1, -1, -1, -1, | |
-1, 64, -1, -1, 78, 79, 80, -1, -1, -1, | |
12, 13, -1, -1, 77, -1, -1, -1, -1, -1, | |
22, -1, -1, -1, -1, -1, -1, 29, -1, -1, | |
-1, 33, 34, -1, 36, -1, -1, -1, -1, -1, | |
-1, 43, -1, -1, -1, 47, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, 65, -1, 67, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, 78, 79, 80, -1, | |
-1, -1, 11, 12, 13, -1, -1, -1, -1, -1, | |
-1, -1, -1, 22, -1, -1, -1, -1, -1, -1, | |
29, -1, -1, -1, 33, 34, -1, 36, -1, -1, | |
-1, 40, -1, 42, 43, 44, -1, -1, 47, -1, | |
-1, -1, 51, -1, 53, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, 65, -1, 67, -1, | |
69, -1, 71, -1, 73, -1, -1, -1, -1, 78, | |
79, 80, -1, -1, -1, 11, 12, 13, -1, -1, | |
-1, -1, -1, -1, -1, -1, 22, -1, -1, -1, | |
-1, -1, -1, 29, -1, -1, -1, 33, 34, -1, | |
36, -1, -1, -1, 40, -1, 42, 43, 44, -1, | |
-1, 47, -1, -1, -1, 51, -1, 53, -1, -1, | |
56, -1, -1, -1, -1, -1, -1, -1, -1, 65, | |
-1, 67, -1, 69, -1, 71, -1, 73, -1, -1, | |
-1, -1, 78, 79, 80, -1, -1, -1, 7, -1, | |
-1, -1, 11, 12, 13, -1, -1, -1, -1, -1, | |
-1, -1, -1, 22, -1, -1, -1, -1, -1, -1, | |
29, -1, -1, -1, 33, 34, -1, 36, -1, -1, | |
-1, 40, -1, 42, 43, 44, -1, -1, 47, -1, | |
-1, -1, 51, -1, 53, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, 65, -1, 67, -1, | |
69, -1, 71, -1, 73, -1, -1, -1, -1, 78, | |
79, 80, -1, -1, -1, 11, 12, 13, -1, -1, | |
-1, -1, -1, -1, -1, -1, 22, -1, -1, -1, | |
-1, -1, -1, 29, -1, -1, -1, 33, 34, -1, | |
36, -1, -1, -1, 40, -1, 42, 43, 44, -1, | |
-1, 47, -1, -1, -1, 51, -1, 53, -1, -1, | |
56, -1, -1, -1, -1, -1, -1, -1, -1, 65, | |
-1, 67, -1, 69, -1, 71, -1, 73, -1, -1, | |
-1, -1, 78, 79, 80, -1, -1, -1, 11, 12, | |
13, -1, -1, -1, -1, -1, -1, -1, -1, 22, | |
-1, -1, -1, -1, -1, -1, 29, -1, -1, -1, | |
33, 34, -1, 36, -1, -1, -1, 40, -1, 42, | |
43, 44, -1, -1, 47, -1, -1, -1, 51, -1, | |
53, -1, -1, -1, -1, -1, -1, 60, -1, -1, | |
-1, -1, 65, -1, 67, -1, 69, -1, 71, -1, | |
73, -1, -1, -1, -1, 78, 79, 80, -1, -1, | |
-1, 11, 12, 13, -1, -1, -1, -1, -1, -1, | |
-1, -1, 22, -1, -1, -1, -1, -1, -1, 29, | |
-1, -1, -1, 33, 34, -1, 36, -1, -1, -1, | |
40, -1, 42, 43, 44, -1, -1, 47, -1, -1, | |
-1, 51, -1, 53, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, 65, -1, 67, -1, 69, | |
-1, 71, 72, 73, -1, -1, -1, -1, 78, 79, | |
80, -1, -1, -1, 4, 5, 6, -1, -1, 9, | |
10, 11, -1, -1, 14, -1, 16, -1, -1, -1, | |
20, 21, 22, -1, -1, -1, -1, -1, -1, 29, | |
30, 31, 32, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, 43, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, 59, | |
-1, -1, -1, -1, -1, -1, 66, 67, 68, -1, | |
70, 71, 72, 73, 74, 75, -1, -1, 78, 79, | |
80, 81, 82, 83, 4, 5, 6, -1, -1, 9, | |
10, 11, -1, -1, 14, -1, 16, -1, -1, -1, | |
20, 21, 22, -1, -1, -1, -1, -1, -1, 29, | |
30, 31, 32, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, 43, -1, -1, -1, 47, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, 59, | |
-1, -1, -1, -1, -1, 65, 66, 67, 68, -1, | |
70, 71, 72, 73, 74, 75, -1, -1, 78, 79, | |
80, 81, 82, 83, 4, -1, -1, -1, -1, 9, | |
-1, 11, 12, 13, 14, -1, -1, -1, -1, -1, | |
-1, 21, 22, -1, -1, -1, -1, -1, -1, 29, | |
30, -1, -1, 33, 34, -1, 36, -1, -1, -1, | |
40, -1, 42, 43, 44, -1, -1, 47, -1, -1, | |
-1, 51, -1, 53, -1, -1, -1, -1, -1, 59, | |
-1, 61, -1, -1, -1, 65, 66, 67, 68, 69, | |
70, 71, 72, 73, 74, 75, -1, -1, 78, 79, | |
80, 81, 82, -1, 4, -1, -1, -1, -1, 9, | |
-1, 11, 12, 13, 14, -1, -1, -1, -1, -1, | |
-1, 21, 22, -1, -1, -1, -1, -1, -1, 29, | |
30, -1, -1, 33, 34, -1, 36, -1, -1, -1, | |
40, -1, 42, 43, 44, -1, -1, 47, -1, -1, | |
-1, 51, -1, 53, -1, -1, -1, -1, -1, 59, | |
-1, 61, -1, -1, -1, 65, 66, 67, 68, 69, | |
70, 71, 72, 73, 74, 75, -1, -1, 78, 79, | |
80, 81, 82, -1, 4, 5, 6, -1, -1, 9, | |
10, 11, 12, 13, 14, -1, 16, -1, -1, -1, | |
20, 21, 22, -1, -1, -1, -1, -1, -1, 29, | |
30, 31, 32, 33, 34, -1, 36, -1, -1, -1, | |
40, -1, 42, 43, 44, -1, -1, 47, -1, -1, | |
-1, 51, -1, 53, -1, 55, -1, -1, -1, 59, | |
-1, 61, -1, -1, -1, 65, 66, 67, 68, 69, | |
70, 71, 72, 73, 74, 75, -1, -1, 78, 79, | |
80, 81, 82, 83, | |
5, 46, 5, 45, 6, 45, 5, 76, 14, 65, | |
2, 46, 5, 45, 73, 6, 5, 46, 6, 5, | |
78, 6, 45, 5, 85, 6, 10, 6, 5, 9, | |
6, 6, 6, 45, 6, 86, 14, 41, 45, 86, | |
5, 5, 5, 80, 6, 46, 67, 45, 45, 5, | |
81, 45, 5, 5, 5, 45, -1, 18, 45, 18, | |
18, 18, 45, 18, 23, 26, 24, 24, 23, -1, | |
18, 18, 45, 18, 45, 23, 23, 18, 23, 18, | |
18, 18, 20, 5, 18, 24, 23, 28, 18, 23, | |
20, 42, 18, 18, 20, 20, -1, 18, 18, 20, | |
18, 45, 20, 23, 18, 18, 20, 20, 18, 18, | |
18, 21, 20, 18, 23, 18, 21, 61, 18, 5, | |
20, 10, 11, 18, 18, 20, 18, 5, 45, 32, | |
24, 23, -1, 18, 18, 18, 18, 20, 18, 5, | |
22, 18, 22, 18, 61, 22, 30, -1, 23, 34, | |
18, -1, 20, 18, -1, 18, 42, 20, 23, 18, | |
18, 20, 18, 18, 42, 23, 12, 23, 23, 15, | |
25, -1, -1, -1, 18, 18, 42, -1, 18, 23, | |
23, 18, 40, 23, 40, 29, 23, 27, 25, 18, | |
18, -1, 35, 18, 23, 23, 25, 18, 23, -1, | |
18, 18, 23, 31, 25, 23, 23, -1, -1, -1, | |
-1, -1, -1, -1, -1, 40, -1, -1, -1, -1, | |
-1, -1, 40, 40, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, 18, -1, -1, -1, -1, 23, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, 33, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, | |
-1, -1}; | |
static void recordMessage( | |
Translator *tor, const QString &context, const QString &text, const QString &comment, | |
const QString &extracomment, const QString &msgid, const TranslatorMessage::ExtraData &extra, | |
bool plural, const QString &fileName, int lineNo) | |
{ | |
TranslatorMessage msg( | |
context, text, comment, QString(), | |
fileName, lineNo, QStringList(), | |
TranslatorMessage::Unfinished, plural); | |
msg.setExtraComment(extracomment.simplified()); | |
msg.setId(msgid); | |
msg.setExtras(extra); | |
tor->extend(msg); | |
} | |
namespace QScript | |
{ | |
class CommentProcessor | |
{ | |
public: | |
virtual ~CommentProcessor() {} | |
virtual void processComment(const QChar *chars, int length) = 0; | |
}; | |
class Lexer | |
{ | |
public: | |
Lexer(CommentProcessor *); | |
~Lexer(); | |
void setCode(const QString &c, const QString &fileName, int lineno); | |
int lex(); | |
QString fileName() const { return yyfilename; } | |
int currentLineNo() const { return yylineno; } | |
int currentColumnNo() const { return yycolumn; } | |
int startLineNo() const { return startlineno; } | |
int startColumnNo() const { return startcolumn; } | |
int endLineNo() const { return currentLineNo(); } | |
int endColumnNo() const | |
{ int col = currentColumnNo(); return (col > 0) ? col - 1 : col; } | |
bool prevTerminator() const { return terminator; } | |
enum State { Start, | |
Identifier, | |
InIdentifier, | |
InSingleLineComment, | |
InMultiLineComment, | |
InNum, | |
InNum0, | |
InHex, | |
InOctal, | |
InDecimal, | |
InExponentIndicator, | |
InExponent, | |
Hex, | |
Octal, | |
Number, | |
String, | |
Eof, | |
InString, | |
InEscapeSequence, | |
InHexEscape, | |
InUnicodeEscape, | |
Other, | |
Bad }; | |
enum Error { | |
NoError, | |
IllegalCharacter, | |
UnclosedStringLiteral, | |
IllegalEscapeSequence, | |
IllegalUnicodeEscapeSequence, | |
UnclosedComment, | |
IllegalExponentIndicator, | |
IllegalIdentifier | |
}; | |
enum ParenthesesState { | |
IgnoreParentheses, | |
CountParentheses, | |
BalancedParentheses | |
}; | |
enum RegExpBodyPrefix { | |
NoPrefix, | |
EqualPrefix | |
}; | |
bool scanRegExp(RegExpBodyPrefix prefix = NoPrefix); | |
QString pattern; | |
int flags; | |
State lexerState() const | |
{ return state; } | |
QString errorMessage() const | |
{ return errmsg; } | |
void setErrorMessage(const QString &err) | |
{ errmsg = err; } | |
void setErrorMessage(const char *err) | |
{ setErrorMessage(QString::fromLatin1(err)); } | |
Error error() const | |
{ return err; } | |
void clearError() | |
{ err = NoError; } | |
private: | |
QString yyfilename; | |
int yylineno; | |
bool done; | |
char *buffer8; | |
QChar *buffer16; | |
uint size8, size16; | |
uint pos8, pos16; | |
bool terminator; | |
bool restrKeyword; | |
// encountered delimiter like "'" and "}" on last run | |
bool delimited; | |
int stackToken; | |
State state; | |
void setDone(State s); | |
uint pos; | |
void shift(uint p); | |
int lookupKeyword(const char *); | |
bool isWhiteSpace() const; | |
bool isLineTerminator() const; | |
bool isHexDigit(ushort c) const; | |
bool isOctalDigit(ushort c) const; | |
int matchPunctuator(ushort c1, ushort c2, | |
ushort c3, ushort c4); | |
ushort singleEscape(ushort c) const; | |
ushort convertOctal(ushort c1, ushort c2, | |
ushort c3) const; | |
public: | |
static unsigned char convertHex(ushort c1); | |
static unsigned char convertHex(ushort c1, ushort c2); | |
static QChar convertUnicode(ushort c1, ushort c2, | |
ushort c3, ushort c4); | |
static bool isIdentLetter(ushort c); | |
static bool isDecimalDigit(ushort c); | |
inline int ival() const { return qsyylval.toInt(); } | |
inline double dval() const { return qsyylval.toDouble(); } | |
inline QString ustr() const { return qsyylval.toString(); } | |
inline QVariant val() const { return qsyylval; } | |
const QChar *characterBuffer() const { return buffer16; } | |
int characterCount() const { return pos16; } | |
private: | |
void record8(ushort c); | |
void record16(QChar c); | |
void recordStartPos(); | |
int findReservedWord(const QChar *buffer, int size) const; | |
void syncProhibitAutomaticSemicolon(); | |
void processComment(const QChar *, int); | |
const QChar *code; | |
uint length; | |
int yycolumn; | |
int startlineno; | |
int startcolumn; | |
int bol; // begin of line | |
QVariant qsyylval; | |
// current and following unicode characters | |
ushort current, next1, next2, next3; | |
struct keyword { | |
const char *name; | |
int token; | |
}; | |
QString errmsg; | |
Error err; | |
bool wantRx; | |
bool check_reserved; | |
ParenthesesState parenthesesState; | |
int parenthesesCount; | |
bool prohibitAutomaticSemicolon; | |
CommentProcessor *commentProcessor; | |
}; | |
} // namespace QScript | |
extern double qstrtod(const char *s00, char const **se, bool *ok); | |
#define shiftWindowsLineBreak() if(current == '\r' && next1 == '\n') shift(1); | |
namespace QScript { | |
static int toDigit(char c) | |
{ | |
if ((c >= '0') && (c <= '9')) | |
return c - '0'; | |
else if ((c >= 'a') && (c <= 'z')) | |
return 10 + c - 'a'; | |
else if ((c >= 'A') && (c <= 'Z')) | |
return 10 + c - 'A'; | |
return -1; | |
} | |
double integerFromString(const char *buf, int size, int radix) | |
{ | |
if (size == 0) | |
return qSNaN(); | |
double sign = 1.0; | |
int i = 0; | |
if (buf[0] == '+') { | |
++i; | |
} else if (buf[0] == '-') { | |
sign = -1.0; | |
++i; | |
} | |
if (((size-i) >= 2) && (buf[i] == '0')) { | |
if (((buf[i+1] == 'x') || (buf[i+1] == 'X')) | |
&& (radix < 34)) { | |
if ((radix != 0) && (radix != 16)) | |
return 0; | |
radix = 16; | |
i += 2; | |
} else { | |
if (radix == 0) { | |
radix = 8; | |
++i; | |
} | |
} | |
} else if (radix == 0) { | |
radix = 10; | |
} | |
int j = i; | |
for ( ; i < size; ++i) { | |
int d = toDigit(buf[i]); | |
if ((d == -1) || (d >= radix)) | |
break; | |
} | |
double result; | |
if (j == i) { | |
if (!qstrcmp(buf, "Infinity")) | |
result = qInf(); | |
else | |
result = qSNaN(); | |
} else { | |
result = 0; | |
double multiplier = 1; | |
for (--i ; i >= j; --i, multiplier *= radix) | |
result += toDigit(buf[i]) * multiplier; | |
} | |
result *= sign; | |
return result; | |
} | |
} // namespace QScript | |
QScript::Lexer::Lexer(QScript::CommentProcessor *proc) | |
: | |
yylineno(0), | |
size8(128), size16(128), restrKeyword(false), | |
stackToken(-1), pos(0), | |
code(0), length(0), | |
bol(true), | |
current(0), next1(0), next2(0), next3(0), | |
err(NoError), | |
check_reserved(true), | |
parenthesesState(IgnoreParentheses), | |
prohibitAutomaticSemicolon(false), | |
commentProcessor(proc) | |
{ | |
// allocate space for read buffers | |
buffer8 = new char[size8]; | |
buffer16 = new QChar[size16]; | |
flags = 0; | |
} | |
QScript::Lexer::~Lexer() | |
{ | |
delete [] buffer8; | |
delete [] buffer16; | |
} | |
void QScript::Lexer::setCode(const QString &c, const QString &fileName, int lineno) | |
{ | |
errmsg = QString(); | |
yyfilename = fileName; | |
yylineno = lineno; | |
yycolumn = 1; | |
restrKeyword = false; | |
delimited = false; | |
stackToken = -1; | |
pos = 0; | |
code = c.unicode(); | |
length = c.length(); | |
bol = true; | |
// read first characters | |
current = (length > 0) ? code[0].unicode() : 0; | |
next1 = (length > 1) ? code[1].unicode() : 0; | |
next2 = (length > 2) ? code[2].unicode() : 0; | |
next3 = (length > 3) ? code[3].unicode() : 0; | |
} | |
void QScript::Lexer::shift(uint p) | |
{ | |
while (p--) { | |
++pos; | |
++yycolumn; | |
current = next1; | |
next1 = next2; | |
next2 = next3; | |
next3 = (pos + 3 < length) ? code[pos+3].unicode() : 0; | |
} | |
} | |
void QScript::Lexer::setDone(State s) | |
{ | |
state = s; | |
done = true; | |
} | |
int QScript::Lexer::findReservedWord(const QChar *c, int size) const | |
{ | |
switch (size) { | |
case 2: { | |
if (c[0] == QLatin1Char('d') && c[1] == QLatin1Char('o')) | |
return QScriptGrammar::T_DO; | |
else if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('f')) | |
return QScriptGrammar::T_IF; | |
else if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n')) | |
return QScriptGrammar::T_IN; | |
} break; | |
case 3: { | |
if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('o') && c[2] == QLatin1Char('r')) | |
return QScriptGrammar::T_FOR; | |
else if (c[0] == QLatin1Char('n') && c[1] == QLatin1Char('e') && c[2] == QLatin1Char('w')) | |
return QScriptGrammar::T_NEW; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('r') && c[2] == QLatin1Char('y')) | |
return QScriptGrammar::T_TRY; | |
else if (c[0] == QLatin1Char('v') && c[1] == QLatin1Char('a') && c[2] == QLatin1Char('r')) | |
return QScriptGrammar::T_VAR; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n') && c[2] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 4: { | |
if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('a') | |
&& c[2] == QLatin1Char('s') && c[3] == QLatin1Char('e')) | |
return QScriptGrammar::T_CASE; | |
else if (c[0] == QLatin1Char('e') && c[1] == QLatin1Char('l') | |
&& c[2] == QLatin1Char('s') && c[3] == QLatin1Char('e')) | |
return QScriptGrammar::T_ELSE; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('i') && c[3] == QLatin1Char('s')) | |
return QScriptGrammar::T_THIS; | |
else if (c[0] == QLatin1Char('v') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('i') && c[3] == QLatin1Char('d')) | |
return QScriptGrammar::T_VOID; | |
else if (c[0] == QLatin1Char('w') && c[1] == QLatin1Char('i') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('h')) | |
return QScriptGrammar::T_WITH; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('r') | |
&& c[2] == QLatin1Char('u') && c[3] == QLatin1Char('e')) | |
return QScriptGrammar::T_TRUE; | |
else if (c[0] == QLatin1Char('n') && c[1] == QLatin1Char('u') | |
&& c[2] == QLatin1Char('l') && c[3] == QLatin1Char('l')) | |
return QScriptGrammar::T_NULL; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('e') && c[1] == QLatin1Char('n') | |
&& c[2] == QLatin1Char('u') && c[3] == QLatin1Char('m')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('b') && c[1] == QLatin1Char('y') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('l') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('g')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('a') && c[3] == QLatin1Char('r')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('g') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('o')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 5: { | |
if (c[0] == QLatin1Char('b') && c[1] == QLatin1Char('r') | |
&& c[2] == QLatin1Char('e') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('k')) | |
return QScriptGrammar::T_BREAK; | |
else if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('a') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('c') | |
&& c[4] == QLatin1Char('h')) | |
return QScriptGrammar::T_CATCH; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('r') && c[3] == QLatin1Char('o') | |
&& c[4] == QLatin1Char('w')) | |
return QScriptGrammar::T_THROW; | |
else if (c[0] == QLatin1Char('w') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('i') && c[3] == QLatin1Char('l') | |
&& c[4] == QLatin1Char('e')) | |
return QScriptGrammar::T_WHILE; | |
else if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('s') | |
&& c[4] == QLatin1Char('t')) | |
return QScriptGrammar::T_CONST; | |
else if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('a') | |
&& c[2] == QLatin1Char('l') && c[3] == QLatin1Char('s') | |
&& c[4] == QLatin1Char('e')) | |
return QScriptGrammar::T_FALSE; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('o') && c[3] == QLatin1Char('r') | |
&& c[4] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('u') | |
&& c[2] == QLatin1Char('p') && c[3] == QLatin1Char('e') | |
&& c[4] == QLatin1Char('r')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('i') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('l')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('l') | |
&& c[2] == QLatin1Char('a') && c[3] == QLatin1Char('s') | |
&& c[4] == QLatin1Char('s')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('l') | |
&& c[2] == QLatin1Char('o') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 6: { | |
if (c[0] == QLatin1Char('d') && c[1] == QLatin1Char('e') | |
&& c[2] == QLatin1Char('l') && c[3] == QLatin1Char('e') | |
&& c[4] == QLatin1Char('t') && c[5] == QLatin1Char('e')) | |
return QScriptGrammar::T_DELETE; | |
else if (c[0] == QLatin1Char('r') && c[1] == QLatin1Char('e') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('u') | |
&& c[4] == QLatin1Char('r') && c[5] == QLatin1Char('n')) | |
return QScriptGrammar::T_RETURN; | |
else if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('w') | |
&& c[2] == QLatin1Char('i') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('c') && c[5] == QLatin1Char('h')) | |
return QScriptGrammar::T_SWITCH; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('y') | |
&& c[2] == QLatin1Char('p') && c[3] == QLatin1Char('e') | |
&& c[4] == QLatin1Char('o') && c[5] == QLatin1Char('f')) | |
return QScriptGrammar::T_TYPEOF; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('e') && c[1] == QLatin1Char('x') | |
&& c[2] == QLatin1Char('p') && c[3] == QLatin1Char('o') | |
&& c[4] == QLatin1Char('r') && c[5] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('t') | |
&& c[2] == QLatin1Char('a') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('i') && c[5] == QLatin1Char('c')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('d') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('u') && c[3] == QLatin1Char('b') | |
&& c[4] == QLatin1Char('l') && c[5] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('m') | |
&& c[2] == QLatin1Char('p') && c[3] == QLatin1Char('o') | |
&& c[4] == QLatin1Char('r') && c[5] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('p') && c[1] == QLatin1Char('u') | |
&& c[2] == QLatin1Char('b') && c[3] == QLatin1Char('l') | |
&& c[4] == QLatin1Char('i') && c[5] == QLatin1Char('c')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('n') && c[1] == QLatin1Char('a') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('i') | |
&& c[4] == QLatin1Char('v') && c[5] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('h') | |
&& c[2] == QLatin1Char('r') && c[3] == QLatin1Char('o') | |
&& c[4] == QLatin1Char('w') && c[5] == QLatin1Char('s')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 7: { | |
if (c[0] == QLatin1Char('d') && c[1] == QLatin1Char('e') | |
&& c[2] == QLatin1Char('f') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('u') && c[5] == QLatin1Char('l') | |
&& c[6] == QLatin1Char('t')) | |
return QScriptGrammar::T_DEFAULT; | |
else if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('i') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('l') && c[5] == QLatin1Char('l') | |
&& c[6] == QLatin1Char('y')) | |
return QScriptGrammar::T_FINALLY; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('b') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('o') && c[3] == QLatin1Char('l') | |
&& c[4] == QLatin1Char('e') && c[5] == QLatin1Char('a') | |
&& c[6] == QLatin1Char('n')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('e') && c[1] == QLatin1Char('x') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('e') | |
&& c[4] == QLatin1Char('n') && c[5] == QLatin1Char('d') | |
&& c[6] == QLatin1Char('s')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('p') && c[1] == QLatin1Char('a') | |
&& c[2] == QLatin1Char('c') && c[3] == QLatin1Char('k') | |
&& c[4] == QLatin1Char('a') && c[5] == QLatin1Char('g') | |
&& c[6] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('p') && c[1] == QLatin1Char('r') | |
&& c[2] == QLatin1Char('i') && c[3] == QLatin1Char('v') | |
&& c[4] == QLatin1Char('a') && c[5] == QLatin1Char('t') | |
&& c[6] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 8: { | |
if (c[0] == QLatin1Char('c') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('i') && c[5] == QLatin1Char('n') | |
&& c[6] == QLatin1Char('u') && c[7] == QLatin1Char('e')) | |
return QScriptGrammar::T_CONTINUE; | |
else if (c[0] == QLatin1Char('f') && c[1] == QLatin1Char('u') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('c') | |
&& c[4] == QLatin1Char('t') && c[5] == QLatin1Char('i') | |
&& c[6] == QLatin1Char('o') && c[7] == QLatin1Char('n')) | |
return QScriptGrammar::T_FUNCTION; | |
else if (c[0] == QLatin1Char('d') && c[1] == QLatin1Char('e') | |
&& c[2] == QLatin1Char('b') && c[3] == QLatin1Char('u') | |
&& c[4] == QLatin1Char('g') && c[5] == QLatin1Char('g') | |
&& c[6] == QLatin1Char('e') && c[7] == QLatin1Char('r')) | |
return QScriptGrammar::T_DEBUGGER; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('a') && c[1] == QLatin1Char('b') | |
&& c[2] == QLatin1Char('s') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('r') && c[5] == QLatin1Char('a') | |
&& c[6] == QLatin1Char('c') && c[7] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('v') && c[1] == QLatin1Char('o') | |
&& c[2] == QLatin1Char('l') && c[3] == QLatin1Char('a') | |
&& c[4] == QLatin1Char('t') && c[5] == QLatin1Char('i') | |
&& c[6] == QLatin1Char('l') && c[7] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 9: { | |
if (check_reserved) { | |
if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n') | |
&& c[2] == QLatin1Char('t') && c[3] == QLatin1Char('e') | |
&& c[4] == QLatin1Char('r') && c[5] == QLatin1Char('f') | |
&& c[6] == QLatin1Char('a') && c[7] == QLatin1Char('c') | |
&& c[8] == QLatin1Char('e')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('t') && c[1] == QLatin1Char('r') | |
&& c[2] == QLatin1Char('a') && c[3] == QLatin1Char('n') | |
&& c[4] == QLatin1Char('s') && c[5] == QLatin1Char('i') | |
&& c[6] == QLatin1Char('e') && c[7] == QLatin1Char('n') | |
&& c[8] == QLatin1Char('t')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
else if (c[0] == QLatin1Char('p') && c[1] == QLatin1Char('r') | |
&& c[2] == QLatin1Char('o') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('e') && c[5] == QLatin1Char('c') | |
&& c[6] == QLatin1Char('t') && c[7] == QLatin1Char('e') | |
&& c[8] == QLatin1Char('d')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 10: { | |
if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('n') | |
&& c[2] == QLatin1Char('s') && c[3] == QLatin1Char('t') | |
&& c[4] == QLatin1Char('a') && c[5] == QLatin1Char('n') | |
&& c[6] == QLatin1Char('c') && c[7] == QLatin1Char('e') | |
&& c[8] == QLatin1Char('o') && c[9] == QLatin1Char('f')) | |
return QScriptGrammar::T_INSTANCEOF; | |
else if (check_reserved) { | |
if (c[0] == QLatin1Char('i') && c[1] == QLatin1Char('m') | |
&& c[2] == QLatin1Char('p') && c[3] == QLatin1Char('l') | |
&& c[4] == QLatin1Char('e') && c[5] == QLatin1Char('m') | |
&& c[6] == QLatin1Char('e') && c[7] == QLatin1Char('n') | |
&& c[8] == QLatin1Char('t') && c[9] == QLatin1Char('s')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
case 12: { | |
if (check_reserved) { | |
if (c[0] == QLatin1Char('s') && c[1] == QLatin1Char('y') | |
&& c[2] == QLatin1Char('n') && c[3] == QLatin1Char('c') | |
&& c[4] == QLatin1Char('h') && c[5] == QLatin1Char('r') | |
&& c[6] == QLatin1Char('o') && c[7] == QLatin1Char('n') | |
&& c[8] == QLatin1Char('i') && c[9] == QLatin1Char('z') | |
&& c[10] == QLatin1Char('e') && c[11] == QLatin1Char('d')) | |
return QScriptGrammar::T_RESERVED_WORD; | |
} | |
} break; | |
} // switch | |
return -1; | |
} | |
int QScript::Lexer::lex() | |
{ | |
int token = 0; | |
state = Start; | |
ushort stringType = 0; // either single or double quotes | |
pos8 = pos16 = 0; | |
done = false; | |
terminator = false; | |
// did we push a token on the stack previously ? | |
// (after an automatic semicolon insertion) | |
if (stackToken >= 0) { | |
setDone(Other); | |
token = stackToken; | |
stackToken = -1; | |
} | |
while (!done) { | |
switch (state) { | |
case Start: | |
if (isWhiteSpace()) { | |
// do nothing | |
} else if (current == '/' && next1 == '/') { | |
recordStartPos(); | |
shift(1); | |
Q_ASSERT(pos16 == 0); | |
state = InSingleLineComment; | |
} else if (current == '/' && next1 == '*') { | |
recordStartPos(); | |
shift(1); | |
Q_ASSERT(pos16 == 0); | |
state = InMultiLineComment; | |
} else if (current == 0) { | |
syncProhibitAutomaticSemicolon(); | |
if (!terminator && !delimited && !prohibitAutomaticSemicolon) { | |
// automatic semicolon insertion if program incomplete | |
token = QScriptGrammar::T_SEMICOLON; | |
stackToken = 0; | |
setDone(Other); | |
} else { | |
setDone(Eof); | |
} | |
} else if (isLineTerminator()) { | |
shiftWindowsLineBreak(); | |
yylineno++; | |
yycolumn = 0; | |
bol = true; | |
terminator = true; | |
syncProhibitAutomaticSemicolon(); | |
if (restrKeyword) { | |
token = QScriptGrammar::T_SEMICOLON; | |
setDone(Other); | |
} | |
} else if (current == '"' || current == '\'') { | |
recordStartPos(); | |
state = InString; | |
stringType = current; | |
} else if (isIdentLetter(current)) { | |
recordStartPos(); | |
record16(current); | |
state = InIdentifier; | |
} else if (current == '0') { | |
recordStartPos(); | |
record8(current); | |
state = InNum0; | |
} else if (isDecimalDigit(current)) { | |
recordStartPos(); | |
record8(current); | |
state = InNum; | |
} else if (current == '.' && isDecimalDigit(next1)) { | |
recordStartPos(); | |
record8(current); | |
state = InDecimal; | |
} else { | |
recordStartPos(); | |
token = matchPunctuator(current, next1, next2, next3); | |
if (token != -1) { | |
if (terminator && !delimited && !prohibitAutomaticSemicolon | |
&& (token == QScriptGrammar::T_PLUS_PLUS | |
|| token == QScriptGrammar::T_MINUS_MINUS)) { | |
// automatic semicolon insertion | |
stackToken = token; | |
token = QScriptGrammar::T_SEMICOLON; | |
} | |
setDone(Other); | |
} | |
else { | |
setDone(Bad); | |
err = IllegalCharacter; | |
errmsg = LU::tr("Illegal character"); | |
} | |
} | |
break; | |
case InString: | |
if (current == stringType) { | |
shift(1); | |
setDone(String); | |
} else if (current == 0 || isLineTerminator()) { | |
setDone(Bad); | |
err = UnclosedStringLiteral; | |
errmsg = LU::tr("Unclosed string at end of line"); | |
} else if (current == '\\') { | |
state = InEscapeSequence; | |
} else { | |
record16(current); | |
} | |
break; | |
// Escape Sequences inside of strings | |
case InEscapeSequence: | |
if (isOctalDigit(current)) { | |
if (current >= '0' && current <= '3' && | |
isOctalDigit(next1) && isOctalDigit(next2)) { | |
record16(convertOctal(current, next1, next2)); | |
shift(2); | |
state = InString; | |
} else if (isOctalDigit(current) && | |
isOctalDigit(next1)) { | |
record16(convertOctal('0', current, next1)); | |
shift(1); | |
state = InString; | |
} else if (isOctalDigit(current)) { | |
record16(convertOctal('0', '0', current)); | |
state = InString; | |
} else { | |
setDone(Bad); | |
err = IllegalEscapeSequence; | |
errmsg = LU::tr("Illegal escape sequence"); | |
} | |
} else if (current == 'x') | |
state = InHexEscape; | |
else if (current == 'u') | |
state = InUnicodeEscape; | |
else { | |
record16(singleEscape(current)); | |
state = InString; | |
} | |
break; | |
case InHexEscape: | |
if (isHexDigit(current) && isHexDigit(next1)) { | |
state = InString; | |
record16(QLatin1Char(convertHex(current, next1))); | |
shift(1); | |
} else if (current == stringType) { | |
record16(QLatin1Char('x')); | |
shift(1); | |
setDone(String); | |
} else { | |
record16(QLatin1Char('x')); | |
record16(current); | |
state = InString; | |
} | |
break; | |
case InUnicodeEscape: | |
if (isHexDigit(current) && isHexDigit(next1) && | |
isHexDigit(next2) && isHexDigit(next3)) { | |
record16(convertUnicode(current, next1, next2, next3)); | |
shift(3); | |
state = InString; | |
} else if (current == stringType) { | |
record16(QLatin1Char('u')); | |
shift(1); | |
setDone(String); | |
} else { | |
setDone(Bad); | |
err = IllegalUnicodeEscapeSequence; | |
errmsg = LU::tr("Illegal unicode escape sequence"); | |
} | |
break; | |
case InSingleLineComment: | |
if (isLineTerminator()) { | |
record16(current); // include newline | |
processComment(buffer16, pos16); | |
shiftWindowsLineBreak(); | |
yylineno++; | |
yycolumn = 0; | |
pos16 = 0; | |
terminator = true; | |
bol = true; | |
if (restrKeyword) { | |
token = QScriptGrammar::T_SEMICOLON; | |
setDone(Other); | |
} else | |
state = Start; | |
} else if (current == 0) { | |
setDone(Eof); | |
} else { | |
record16(current); | |
} | |
break; | |
case InMultiLineComment: | |
if (current == 0) { | |
setDone(Bad); | |
err = UnclosedComment; | |
errmsg = LU::tr("Unclosed comment at end of file"); | |
} else if (isLineTerminator()) { | |
shiftWindowsLineBreak(); | |
yylineno++; | |
} else if (current == '*' && next1 == '/') { | |
processComment(buffer16, pos16); | |
pos16 = 0; | |
state = Start; | |
shift(1); | |
} else { | |
record16(current); | |
} | |
break; | |
case InIdentifier: | |
if (isIdentLetter(current) || isDecimalDigit(current)) { | |
record16(current); | |
break; | |
} | |
setDone(Identifier); | |
break; | |
case InNum0: | |
if (current == 'x' || current == 'X') { | |
record8(current); | |
state = InHex; | |
} else if (current == '.') { | |
record8(current); | |
state = InDecimal; | |
} else if (current == 'e' || current == 'E') { | |
record8(current); | |
state = InExponentIndicator; | |
} else if (isOctalDigit(current)) { | |
record8(current); | |
state = InOctal; | |
} else if (isDecimalDigit(current)) { | |
record8(current); | |
state = InDecimal; | |
} else { | |
setDone(Number); | |
} | |
break; | |
case InHex: | |
if (isHexDigit(current)) | |
record8(current); | |
else | |
setDone(Hex); | |
break; | |
case InOctal: | |
if (isOctalDigit(current)) { | |
record8(current); | |
} else if (isDecimalDigit(current)) { | |
record8(current); | |
state = InDecimal; | |
} else { | |
setDone(Octal); | |
} | |
break; | |
case InNum: | |
if (isDecimalDigit(current)) { | |
record8(current); | |
} else if (current == '.') { | |
record8(current); | |
state = InDecimal; | |
} else if (current == 'e' || current == 'E') { | |
record8(current); | |
state = InExponentIndicator; | |
} else { | |
setDone(Number); | |
} | |
break; | |
case InDecimal: | |
if (isDecimalDigit(current)) { | |
record8(current); | |
} else if (current == 'e' || current == 'E') { | |
record8(current); | |
state = InExponentIndicator; | |
} else { | |
setDone(Number); | |
} | |
break; | |
case InExponentIndicator: | |
if (current == '+' || current == '-') { | |
record8(current); | |
} else if (isDecimalDigit(current)) { | |
record8(current); | |
state = InExponent; | |
} else { | |
setDone(Bad); | |
err = IllegalExponentIndicator; | |
errmsg = LU::tr("Illegal syntax for exponential number"); | |
} | |
break; | |
case InExponent: | |
if (isDecimalDigit(current)) { | |
record8(current); | |
} else { | |
setDone(Number); | |
} | |
break; | |
default: | |
Q_ASSERT_X(0, "Lexer::lex", "Unhandled state in switch statement"); | |
} | |
// move on to the next character | |
if (!done) | |
shift(1); | |
if (state != Start && state != InSingleLineComment) | |
bol = false; | |
} | |
// no identifiers allowed directly after numeric literal, e.g. "3in" is bad | |
if ((state == Number || state == Octal || state == Hex) | |
&& isIdentLetter(current)) { | |
state = Bad; | |
err = IllegalIdentifier; | |
errmsg = LU::tr("Identifier cannot start with numeric literal"); | |
} | |
// terminate string | |
buffer8[pos8] = '\0'; | |
double dval = 0; | |
if (state == Number) { | |
dval = qstrtod(buffer8, 0, 0); | |
} else if (state == Hex) { // scan hex numbers | |
dval = QScript::integerFromString(buffer8, pos8, 16); | |
state = Number; | |
} else if (state == Octal) { // scan octal number | |
dval = QScript::integerFromString(buffer8, pos8, 8); | |
state = Number; | |
} | |
restrKeyword = false; | |
delimited = false; | |
switch (parenthesesState) { | |
case IgnoreParentheses: | |
break; | |
case CountParentheses: | |
if (token == QScriptGrammar::T_RPAREN) { | |
--parenthesesCount; | |
if (parenthesesCount == 0) | |
parenthesesState = BalancedParentheses; | |
} else if (token == QScriptGrammar::T_LPAREN) { | |
++parenthesesCount; | |
} | |
break; | |
case BalancedParentheses: | |
parenthesesState = IgnoreParentheses; | |
break; | |
} | |
switch (state) { | |
case Eof: | |
return 0; | |
case Other: | |
if(token == QScriptGrammar::T_RBRACE || token == QScriptGrammar::T_SEMICOLON) | |
delimited = true; | |
return token; | |
case Identifier: | |
if ((token = findReservedWord(buffer16, pos16)) < 0) { | |
/* TODO: close leak on parse error. same holds true for String */ | |
qsyylval = QString(buffer16, pos16); | |
return QScriptGrammar::T_IDENTIFIER; | |
} | |
if (token == QScriptGrammar::T_CONTINUE || token == QScriptGrammar::T_BREAK | |
|| token == QScriptGrammar::T_RETURN || token == QScriptGrammar::T_THROW) { | |
restrKeyword = true; | |
} else if (token == QScriptGrammar::T_IF || token == QScriptGrammar::T_FOR | |
|| token == QScriptGrammar::T_WHILE || token == QScriptGrammar::T_WITH) { | |
parenthesesState = CountParentheses; | |
parenthesesCount = 0; | |
} else if (token == QScriptGrammar::T_DO) { | |
parenthesesState = BalancedParentheses; | |
} | |
return token; | |
case String: | |
qsyylval = QString(buffer16, pos16); | |
return QScriptGrammar::T_STRING_LITERAL; | |
case Number: | |
qsyylval = dval; | |
return QScriptGrammar::T_NUMERIC_LITERAL; | |
case Bad: | |
return -1; | |
default: | |
Q_ASSERT(!"unhandled numeration value in switch"); | |
return -1; | |
} | |
} | |
bool QScript::Lexer::isWhiteSpace() const | |
{ | |
return (current == ' ' || current == '\t' || | |
current == 0x0b || current == 0x0c); | |
} | |
bool QScript::Lexer::isLineTerminator() const | |
{ | |
return (current == '\n' || current == '\r'); | |
} | |
bool QScript::Lexer::isIdentLetter(ushort c) | |
{ | |
/* TODO: allow other legitimate unicode chars */ | |
return ((c >= 'a' && c <= 'z') | |
|| (c >= 'A' && c <= 'Z') | |
|| c == '$' | |
|| c == '_'); | |
} | |
bool QScript::Lexer::isDecimalDigit(ushort c) | |
{ | |
return (c >= '0' && c <= '9'); | |
} | |
bool QScript::Lexer::isHexDigit(ushort c) const | |
{ | |
return ((c >= '0' && c <= '9') | |
|| (c >= 'a' && c <= 'f') | |
|| (c >= 'A' && c <= 'F')); | |
} | |
bool QScript::Lexer::isOctalDigit(ushort c) const | |
{ | |
return (c >= '0' && c <= '7'); | |
} | |
int QScript::Lexer::matchPunctuator(ushort c1, ushort c2, | |
ushort c3, ushort c4) | |
{ | |
if (c1 == '>' && c2 == '>' && c3 == '>' && c4 == '=') { | |
shift(4); | |
return QScriptGrammar::T_GT_GT_GT_EQ; | |
} else if (c1 == '=' && c2 == '=' && c3 == '=') { | |
shift(3); | |
return QScriptGrammar::T_EQ_EQ_EQ; | |
} else if (c1 == '!' && c2 == '=' && c3 == '=') { | |
shift(3); | |
return QScriptGrammar::T_NOT_EQ_EQ; | |
} else if (c1 == '>' && c2 == '>' && c3 == '>') { | |
shift(3); | |
return QScriptGrammar::T_GT_GT_GT; | |
} else if (c1 == '<' && c2 == '<' && c3 == '=') { | |
shift(3); | |
return QScriptGrammar::T_LT_LT_EQ; | |
} else if (c1 == '>' && c2 == '>' && c3 == '=') { | |
shift(3); | |
return QScriptGrammar::T_GT_GT_EQ; | |
} else if (c1 == '<' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_LE; | |
} else if (c1 == '>' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_GE; | |
} else if (c1 == '!' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_NOT_EQ; | |
} else if (c1 == '+' && c2 == '+') { | |
shift(2); | |
return QScriptGrammar::T_PLUS_PLUS; | |
} else if (c1 == '-' && c2 == '-') { | |
shift(2); | |
return QScriptGrammar::T_MINUS_MINUS; | |
} else if (c1 == '=' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_EQ_EQ; | |
} else if (c1 == '+' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_PLUS_EQ; | |
} else if (c1 == '-' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_MINUS_EQ; | |
} else if (c1 == '*' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_STAR_EQ; | |
} else if (c1 == '/' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_DIVIDE_EQ; | |
} else if (c1 == '&' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_AND_EQ; | |
} else if (c1 == '^' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_XOR_EQ; | |
} else if (c1 == '%' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_REMAINDER_EQ; | |
} else if (c1 == '|' && c2 == '=') { | |
shift(2); | |
return QScriptGrammar::T_OR_EQ; | |
} else if (c1 == '<' && c2 == '<') { | |
shift(2); | |
return QScriptGrammar::T_LT_LT; | |
} else if (c1 == '>' && c2 == '>') { | |
shift(2); | |
return QScriptGrammar::T_GT_GT; | |
} else if (c1 == '&' && c2 == '&') { | |
shift(2); | |
return QScriptGrammar::T_AND_AND; | |
} else if (c1 == '|' && c2 == '|') { | |
shift(2); | |
return QScriptGrammar::T_OR_OR; | |
} | |
switch(c1) { | |
case '=': shift(1); return QScriptGrammar::T_EQ; | |
case '>': shift(1); return QScriptGrammar::T_GT; | |
case '<': shift(1); return QScriptGrammar::T_LT; | |
case ',': shift(1); return QScriptGrammar::T_COMMA; | |
case '!': shift(1); return QScriptGrammar::T_NOT; | |
case '~': shift(1); return QScriptGrammar::T_TILDE; | |
case '?': shift(1); return QScriptGrammar::T_QUESTION; | |
case ':': shift(1); return QScriptGrammar::T_COLON; | |
case '.': shift(1); return QScriptGrammar::T_DOT; | |
case '+': shift(1); return QScriptGrammar::T_PLUS; | |
case '-': shift(1); return QScriptGrammar::T_MINUS; | |
case '*': shift(1); return QScriptGrammar::T_STAR; | |
case '/': shift(1); return QScriptGrammar::T_DIVIDE_; | |
case '&': shift(1); return QScriptGrammar::T_AND; | |
case '|': shift(1); return QScriptGrammar::T_OR; | |
case '^': shift(1); return QScriptGrammar::T_XOR; | |
case '%': shift(1); return QScriptGrammar::T_REMAINDER; | |
case '(': shift(1); return QScriptGrammar::T_LPAREN; | |
case ')': shift(1); return QScriptGrammar::T_RPAREN; | |
case '{': shift(1); return QScriptGrammar::T_LBRACE; | |
case '}': shift(1); return QScriptGrammar::T_RBRACE; | |
case '[': shift(1); return QScriptGrammar::T_LBRACKET; | |
case ']': shift(1); return QScriptGrammar::T_RBRACKET; | |
case ';': shift(1); return QScriptGrammar::T_SEMICOLON; | |
default: return -1; | |
} | |
} | |
ushort QScript::Lexer::singleEscape(ushort c) const | |
{ | |
switch(c) { | |
case 'b': | |
return 0x08; | |
case 't': | |
return 0x09; | |
case 'n': | |
return 0x0A; | |
case 'v': | |
return 0x0B; | |
case 'f': | |
return 0x0C; | |
case 'r': | |
return 0x0D; | |
case '"': | |
return 0x22; | |
case '\'': | |
return 0x27; | |
case '\\': | |
return 0x5C; | |
default: | |
return c; | |
} | |
} | |
ushort QScript::Lexer::convertOctal(ushort c1, ushort c2, | |
ushort c3) const | |
{ | |
return ((c1 - '0') * 64 + (c2 - '0') * 8 + c3 - '0'); | |
} | |
unsigned char QScript::Lexer::convertHex(ushort c) | |
{ | |
if (c >= '0' && c <= '9') | |
return (c - '0'); | |
else if (c >= 'a' && c <= 'f') | |
return (c - 'a' + 10); | |
else | |
return (c - 'A' + 10); | |
} | |
unsigned char QScript::Lexer::convertHex(ushort c1, ushort c2) | |
{ | |
return ((convertHex(c1) << 4) + convertHex(c2)); | |
} | |
QChar QScript::Lexer::convertUnicode(ushort c1, ushort c2, | |
ushort c3, ushort c4) | |
{ | |
return QChar((convertHex(c3) << 4) + convertHex(c4), | |
(convertHex(c1) << 4) + convertHex(c2)); | |
} | |
void QScript::Lexer::record8(ushort c) | |
{ | |
Q_ASSERT(c <= 0xff); | |
// enlarge buffer if full | |
if (pos8 >= size8 - 1) { | |
char *tmp = new char[2 * size8]; | |
memcpy(tmp, buffer8, size8 * sizeof(char)); | |
delete [] buffer8; | |
buffer8 = tmp; | |
size8 *= 2; | |
} | |
buffer8[pos8++] = (char) c; | |
} | |
void QScript::Lexer::record16(QChar c) | |
{ | |
// enlarge buffer if full | |
if (pos16 >= size16 - 1) { | |
QChar *tmp = new QChar[2 * size16]; | |
memcpy(tmp, buffer16, size16 * sizeof(QChar)); | |
delete [] buffer16; | |
buffer16 = tmp; | |
size16 *= 2; | |
} | |
buffer16[pos16++] = c; | |
} | |
void QScript::Lexer::recordStartPos() | |
{ | |
startlineno = yylineno; | |
startcolumn = yycolumn; | |
} | |
bool QScript::Lexer::scanRegExp(RegExpBodyPrefix prefix) | |
{ | |
pos16 = 0; | |
bool lastWasEscape = false; | |
if (prefix == EqualPrefix) | |
record16(QLatin1Char('=')); | |
while (1) { | |
if (isLineTerminator() || current == 0) { | |
errmsg = LU::tr("Unterminated regular expression literal"); | |
return false; | |
} | |
else if (current != '/' || lastWasEscape == true) | |
{ | |
record16(current); | |
lastWasEscape = !lastWasEscape && (current == '\\'); | |
} | |
else { | |
pattern = QString(buffer16, pos16); | |
pos16 = 0; | |
shift(1); | |
break; | |
} | |
shift(1); | |
} | |
flags = 0; | |
while (isIdentLetter(current)) { | |
record16(current); | |
shift(1); | |
} | |
return true; | |
} | |
void QScript::Lexer::syncProhibitAutomaticSemicolon() | |
{ | |
if (parenthesesState == BalancedParentheses) { | |
// we have seen something like "if (foo)", which means we should | |
// never insert an automatic semicolon at this point, since it would | |
// then be expanded into an empty statement (ECMA-262 7.9.1) | |
prohibitAutomaticSemicolon = true; | |
parenthesesState = IgnoreParentheses; | |
} else { | |
prohibitAutomaticSemicolon = false; | |
} | |
} | |
void QScript::Lexer::processComment(const QChar *chars, int length) | |
{ | |
commentProcessor->processComment(chars, length); | |
} | |
class Translator; | |
class QScriptParser: protected QScriptGrammar, public QScript::CommentProcessor | |
{ | |
public: | |
QVariant val; | |
struct Location { | |
int startLine; | |
int startColumn; | |
int endLine; | |
int endColumn; | |
}; | |
public: | |
QScriptParser(); | |
~QScriptParser(); | |
void setLexer(QScript::Lexer *); | |
bool parse(Translator *translator); | |
QString fileName() const | |
{ return lexer->fileName(); } | |
inline QString errorMessage() const | |
{ return error_message; } | |
inline int errorLineNumber() const | |
{ return error_lineno; } | |
inline int errorColumnNumber() const | |
{ return error_column; } | |
protected: | |
inline void reallocateStack(); | |
inline QVariant &sym(int index) | |
{ return sym_stack [tos + index - 1]; } | |
inline Location &loc(int index) | |
{ return location_stack [tos + index - 2]; } | |
std::ostream &yyMsg(int line = 0); | |
virtual void processComment(const QChar *, int); | |
protected: | |
int tos; | |
int stack_size; | |
QVector<QVariant> sym_stack; | |
int *state_stack; | |
Location *location_stack; | |
QString error_message; | |
int error_lineno; | |
int error_column; | |
private: | |
QScript::Lexer *lexer; | |
QString extracomment; | |
QString msgid; | |
QString sourcetext; | |
TranslatorMessage::ExtraData extra; | |
}; | |
inline void QScriptParser::reallocateStack() | |
{ | |
if (! stack_size) | |
stack_size = 128; | |
else | |
stack_size <<= 1; | |
sym_stack.resize(stack_size); | |
state_stack = reinterpret_cast<int*> (qRealloc(state_stack, stack_size * sizeof(int))); | |
location_stack = reinterpret_cast<Location*> (qRealloc(location_stack, stack_size * sizeof(Location))); | |
} | |
inline static bool automatic(QScript::Lexer *lexer, int token) | |
{ | |
return (token == QScriptGrammar::T_RBRACE) | |
|| (token == 0) | |
|| lexer->prevTerminator(); | |
} | |
QScriptParser::QScriptParser(): | |
tos(0), | |
stack_size(0), | |
sym_stack(0), | |
state_stack(0), | |
location_stack(0), | |
lexer(0) | |
{ | |
} | |
QScriptParser::~QScriptParser() | |
{ | |
if (stack_size) { | |
qFree(state_stack); | |
qFree(location_stack); | |
} | |
} | |
static inline QScriptParser::Location location(QScript::Lexer *lexer) | |
{ | |
QScriptParser::Location loc; | |
loc.startLine = lexer->startLineNo(); | |
loc.startColumn = lexer->startColumnNo(); | |
loc.endLine = lexer->endLineNo(); | |
loc.endColumn = lexer->endColumnNo(); | |
return loc; | |
} | |
void QScriptParser::setLexer(QScript::Lexer *lex) | |
{ | |
lexer = lex; | |
} | |
bool QScriptParser::parse(Translator *translator) | |
{ | |
Q_ASSERT(lexer != 0); | |
const int INITIAL_STATE = 0; | |
int yytoken = -1; | |
int saved_yytoken = -1; | |
int identLineNo = -1; | |
reallocateStack(); | |
tos = 0; | |
state_stack[++tos] = INITIAL_STATE; | |
while (true) | |
{ | |
const int state = state_stack [tos]; | |
if (yytoken == -1 && - TERMINAL_COUNT != action_index [state]) | |
{ | |
if (saved_yytoken == -1) | |
{ | |
yytoken = lexer->lex(); | |
location_stack [tos] = location(lexer); | |
} | |
else | |
{ | |
yytoken = saved_yytoken; | |
saved_yytoken = -1; | |
} | |
} | |
int act = t_action (state, yytoken); | |
if (act == ACCEPT_STATE) | |
return true; | |
else if (act > 0) | |
{ | |
if (++tos == stack_size) | |
reallocateStack(); | |
sym_stack [tos] = lexer->val (); | |
state_stack [tos] = act; | |
location_stack [tos] = location(lexer); | |
yytoken = -1; | |
} | |
else if (act < 0) | |
{ | |
int r = - act - 1; | |
tos -= rhs [r]; | |
act = state_stack [tos++]; | |
switch (r) { | |
case 1: { | |
sym(1) = sym(1).toByteArray(); | |
identLineNo = lexer->startLineNo(); | |
} break; | |
case 7: { | |
bool rx = lexer->scanRegExp(QScript::Lexer::NoPrefix); | |
if (!rx) { | |
error_message = lexer->errorMessage(); | |
error_lineno = lexer->startLineNo(); | |
error_column = lexer->startColumnNo(); | |
return false; | |
} | |
} break; | |
case 8: { | |
bool rx = lexer->scanRegExp(QScript::Lexer::EqualPrefix); | |
if (!rx) { | |
error_message = lexer->errorMessage(); | |
error_lineno = lexer->startLineNo(); | |
error_column = lexer->startColumnNo(); | |
return false; | |
} | |
} break; | |
case 66: { | |
QString name = sym(1).toString(); | |
if ((name == QLatin1String("qsTranslate")) || (name == QLatin1String("QT_TRANSLATE_NOOP"))) { | |
if (!sourcetext.isEmpty()) | |
yyMsg(identLineNo) << qPrintable(LU::tr("//% cannot be used with %1(). Ignoring\n").arg(name)); | |
QVariantList args = sym(2).toList(); | |
if (args.size() < 2) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1() requires at least two arguments.\n").arg(name)); | |
} else { | |
if ((args.at(0).type() != QVariant::String) | |
|| (args.at(1).type() != QVariant::String)) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1(): both arguments must be literal strings.\n").arg(name)); | |
} else { | |
QString context = args.at(0).toString(); | |
QString text = args.at(1).toString(); | |
QString comment = args.value(2).toString(); | |
bool plural = (args.size() > 4); | |
recordMessage(translator, context, text, comment, extracomment, | |
msgid, extra, plural, fileName(), identLineNo); | |
} | |
} | |
sourcetext.clear(); | |
extracomment.clear(); | |
msgid.clear(); | |
extra.clear(); | |
} else if ((name == QLatin1String("qsTr")) || (name == QLatin1String("QT_TR_NOOP"))) { | |
if (!sourcetext.isEmpty()) | |
yyMsg(identLineNo) << qPrintable(LU::tr("//% cannot be used with %1(). Ignoring\n").arg(name)); | |
QVariantList args = sym(2).toList(); | |
if (args.size() < 1) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1() requires at least one argument.\n").arg(name)); | |
} else { | |
if (args.at(0).type() != QVariant::String) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1(): text to translate must be a literal string.\n").arg(name)); | |
} else { | |
QString context = QFileInfo(fileName()).baseName(); | |
QString text = args.at(0).toString(); | |
QString comment = args.value(1).toString(); | |
bool plural = (args.size() > 2); | |
recordMessage(translator, context, text, comment, extracomment, | |
msgid, extra, plural, fileName(), identLineNo); | |
} | |
} | |
sourcetext.clear(); | |
extracomment.clear(); | |
msgid.clear(); | |
extra.clear(); | |
} else if ((name == QLatin1String("qsTrId")) || (name == QLatin1String("QT_TRID_NOOP"))) { | |
if (!msgid.isEmpty()) | |
yyMsg(identLineNo) << qPrintable(LU::tr("//= cannot be used with %1(). Ignoring\n").arg(name)); | |
QVariantList args = sym(2).toList(); | |
if (args.size() < 1) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1() requires at least one argument.\n").arg(name)); | |
} else { | |
if (args.at(0).type() != QVariant::String) { | |
yyMsg(identLineNo) << qPrintable(LU::tr("%1(): identifier must be a literal string.\n").arg(name)); | |
} else { | |
msgid = args.at(0).toString(); | |
bool plural = (args.size() > 1); | |
recordMessage(translator, QString(), sourcetext, QString(), extracomment, | |
msgid, extra, plural, fileName(), identLineNo); | |
} | |
} | |
sourcetext.clear(); | |
extracomment.clear(); | |
msgid.clear(); | |
extra.clear(); | |
} | |
} break; | |
case 70: { | |
sym(1) = QVariantList(); | |
} break; | |
case 71: { | |
sym(1) = sym(2); | |
} break; | |
case 72: { | |
sym(1) = QVariantList() << sym(1); | |
} break; | |
case 73: { | |
sym(1) = sym(1).toList() << sym(3); | |
} break; | |
case 94: { | |
if ((sym(1).type() == QVariant::String) || (sym(3).type() == QVariant::String)) | |
sym(1) = sym(1).toString() + sym(3).toString(); | |
else | |
sym(1) = QVariant(); | |
} break; | |
case 171: | |
case 172: | |
case 173: | |
case 174: | |
case 175: | |
case 176: | |
case 177: | |
case 178: | |
case 179: | |
case 180: | |
case 181: | |
case 182: | |
case 183: | |
case 184: | |
case 185: | |
if (!sourcetext.isEmpty() || !extracomment.isEmpty() || !msgid.isEmpty() || !extra.isEmpty()) { | |
yyMsg() << qPrintable(LU::tr("Discarding unconsumed meta data\n")); | |
sourcetext.clear(); | |
extracomment.clear(); | |
msgid.clear(); | |
extra.clear(); | |
} | |
break; | |
} // switch | |
state_stack [tos] = nt_action (act, lhs [r] - TERMINAL_COUNT); | |
if (rhs[r] > 1) { | |
location_stack[tos - 1].endLine = location_stack[tos + rhs[r] - 2].endLine; | |
location_stack[tos - 1].endColumn = location_stack[tos + rhs[r] - 2].endColumn; | |
location_stack[tos] = location_stack[tos + rhs[r] - 1]; | |
} | |
} | |
else | |
{ | |
if (saved_yytoken == -1 && automatic (lexer, yytoken) && t_action (state, T_AUTOMATIC_SEMICOLON) > 0) | |
{ | |
saved_yytoken = yytoken; | |
yytoken = T_SEMICOLON; | |
continue; | |
} | |
else if ((state == INITIAL_STATE) && (yytoken == 0)) { | |
// accept empty input | |
yytoken = T_SEMICOLON; | |
continue; | |
} | |
int ers = state; | |
int shifts = 0; | |
int reduces = 0; | |
int expected_tokens [3]; | |
for (int tk = 0; tk < TERMINAL_COUNT; ++tk) | |
{ | |
int k = t_action (ers, tk); | |
if (! k) | |
continue; | |
else if (k < 0) | |
++reduces; | |
else if (spell [tk]) | |
{ | |
if (shifts < 3) | |
expected_tokens [shifts] = tk; | |
++shifts; | |
} | |
} | |
error_message.clear (); | |
if (shifts && shifts < 3) | |
{ | |
bool first = true; | |
for (int s = 0; s < shifts; ++s) | |
{ | |
if (first) | |
//: Beginning of the string that contains | |
//: comma-separated list of expected tokens | |
error_message += LU::tr("Expected "); | |
else | |
error_message += QLatin1String (", "); | |
first = false; | |
error_message += QLatin1String("`"); | |
error_message += QLatin1String (spell [expected_tokens [s]]); | |
error_message += QLatin1String("'"); | |
} | |
} | |
if (error_message.isEmpty()) | |
error_message = lexer->errorMessage(); | |
error_lineno = lexer->startLineNo(); | |
error_column = lexer->startColumnNo(); | |
return false; | |
} | |
} | |
return false; | |
} | |
std::ostream &QScriptParser::yyMsg(int line) | |
{ | |
return std::cerr << qPrintable(fileName()) << ':' << (line ? line : lexer->startLineNo()) << ": "; | |
} | |
void QScriptParser::processComment(const QChar *chars, int length) | |
{ | |
if (!length) | |
return; | |
// Try to match the logic of the C++ parser. | |
if (*chars == QLatin1Char(':') && chars[1].isSpace()) { | |
extracomment += QString(chars+2, length-2); | |
} else if (*chars == QLatin1Char('=') && chars[1].isSpace()) { | |
msgid = QString(chars+2, length-2).simplified(); | |
} else if (*chars == QLatin1Char('~') && chars[1].isSpace()) { | |
QString text = QString(chars+2, length-2).trimmed(); | |
int k = text.indexOf(QLatin1Char(' ')); | |
if (k > -1) | |
extra.insert(text.left(k), text.mid(k + 1).trimmed()); | |
} else if (*chars == QLatin1Char('%') && chars[1].isSpace()) { | |
sourcetext.reserve(sourcetext.length() + length-2); | |
ushort *ptr = (ushort *)sourcetext.data() + sourcetext.length(); | |
int p = 2, c; | |
forever { | |
if (p >= length) | |
break; | |
c = chars[p++].unicode(); | |
if (isspace(c)) | |
continue; | |
if (c != '"') { | |
yyMsg() << qPrintable(LU::tr("Unexpected character in meta string\n")); | |
break; | |
} | |
forever { | |
if (p >= length) { | |
whoops: | |
yyMsg() << qPrintable(LU::tr("Unterminated meta string\n")); | |
break; | |
} | |
c = chars[p++].unicode(); | |
if (c == '"') | |
break; | |
if (c == '\\') { | |
if (p >= length) | |
goto whoops; | |
c = chars[p++].unicode(); | |
if (c == '\n') | |
goto whoops; | |
*ptr++ = '\\'; | |
} | |
*ptr++ = c; | |
} | |
} | |
sourcetext.resize(ptr - (ushort *)sourcetext.data()); | |
} | |
} | |
bool loadQScript(Translator &translator, const QString &filename, ConversionData &cd) | |
{ | |
QFile file(filename); | |
if (!file.open(QIODevice::ReadOnly)) { | |
cd.appendError(LU::tr("Cannot open %1: %2").arg(filename, file.errorString())); | |
return false; | |
} | |
QTextStream ts(&file); | |
QByteArray codecName; | |
if (!cd.m_codecForSource.isEmpty()) | |
codecName = cd.m_codecForSource; | |
else | |
codecName = translator.codecName(); // Just because it should be latin1 already | |
ts.setCodec(QTextCodec::codecForName(codecName)); | |
ts.setAutoDetectUnicode(true); | |
QString code = ts.readAll(); | |
QScriptParser parser; | |
QScript::Lexer lexer(&parser); | |
lexer.setCode(code, filename, /*lineNumber=*/1); | |
parser.setLexer(&lexer); | |
if (!parser.parse(&translator)) { | |
std::cerr << qPrintable(filename) << ':' << parser.errorLineNumber() << ": " | |
<< qPrintable(parser.errorMessage()) << std::endl; | |
return false; | |
} | |
// Java uses UTF-16 internally and Jambi makes UTF-8 for tr() purposes of it. | |
translator.setCodecName("UTF-8"); | |
return true; | |
} | |
QT_END_NAMESPACE |