• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright JS Foundation and other contributors, http://js.foundation
2  *
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef JS_PARSER_H
17 #define JS_PARSER_H
18 
19 #include "ecma-globals.h"
20 
21 /** \addtogroup parser Parser
22  * @{
23  *
24  * \addtogroup jsparser JavaScript
25  * @{
26  *
27  * \addtogroup jsparser_parser Parser
28  * @{
29  */
30 
31 /**
32  * Error codes.
33  */
34 typedef enum
35 {
36   PARSER_ERR_NO_ERROR,                                /**< no error */
37 
38   PARSER_ERR_OUT_OF_MEMORY,                           /**< out of memory */
39   PARSER_ERR_LITERAL_LIMIT_REACHED,                   /**< maximum number of literals reached */
40   PARSER_ERR_SCOPE_STACK_LIMIT_REACHED,               /**< maximum depth of scope stack reached */
41   PARSER_ERR_ARGUMENT_LIMIT_REACHED,                  /**< maximum number of function arguments reached */
42   PARSER_ERR_STACK_LIMIT_REACHED,                     /**< maximum function stack size reached */
43   PARSER_ERR_JERRY_STACK_LIMIT_REACHED,               /**< maximum jerry context stack limit reached */
44 
45   PARSER_ERR_INVALID_CHARACTER,                       /**< unexpected character */
46   PARSER_ERR_INVALID_OCTAL_DIGIT,                     /**< invalid octal digit */
47   PARSER_ERR_INVALID_HEX_DIGIT,                       /**< invalid hexadecimal digit */
48 #if ENABLED (JERRY_ES2015)
49   PARSER_ERR_INVALID_BIN_DIGIT,                       /**< invalid binary digit */
50 #endif /* ENABLED (JERRY_ES2015) */
51   PARSER_ERR_INVALID_ESCAPE_SEQUENCE,                 /**< invalid escape sequence */
52   PARSER_ERR_INVALID_UNICODE_ESCAPE_SEQUENCE,         /**< invalid unicode escape sequence */
53   PARSER_ERR_INVALID_IDENTIFIER_START,                /**< character cannot be start of an identifier */
54   PARSER_ERR_INVALID_IDENTIFIER_PART,                 /**< character cannot be part of an identifier */
55   PARSER_ERR_INVALID_KEYWORD,                         /**< escape sequences are not allowed in keywords */
56 
57   PARSER_ERR_INVALID_NUMBER,                          /**< invalid number literal */
58   PARSER_ERR_MISSING_EXPONENT,                        /**< missing exponent */
59   PARSER_ERR_IDENTIFIER_AFTER_NUMBER,                 /**< identifier start after number */
60 
61   PARSER_ERR_INVALID_REGEXP,                          /**< invalid regular expression */
62   PARSER_ERR_UNKNOWN_REGEXP_FLAG,                     /**< unknown regexp flag */
63   PARSER_ERR_DUPLICATED_REGEXP_FLAG,                  /**< duplicated regexp flag */
64   PARSER_ERR_UNSUPPORTED_REGEXP,                      /**< regular expression is not supported */
65 
66   PARSER_ERR_IDENTIFIER_TOO_LONG,                     /**< too long identifier */
67   PARSER_ERR_STRING_TOO_LONG,                         /**< too long string literal */
68   PARSER_ERR_NUMBER_TOO_LONG,                         /**< too long number literal */
69   PARSER_ERR_REGEXP_TOO_LONG,                         /**< too long regexp literal */
70 
71   PARSER_ERR_UNTERMINATED_MULTILINE_COMMENT,          /**< unterminated multiline comment */
72   PARSER_ERR_UNTERMINATED_STRING,                     /**< unterminated string literal */
73   PARSER_ERR_UNTERMINATED_REGEXP,                     /**< unterminated regexp literal */
74 
75   PARSER_ERR_NEWLINE_NOT_ALLOWED,                     /**< newline is not allowed */
76   PARSER_ERR_OCTAL_NUMBER_NOT_ALLOWED,                /**< octal numbers are not allowed in strict mode */
77   PARSER_ERR_OCTAL_ESCAPE_NOT_ALLOWED,                /**< octal escape sequences are not allowed in strict mode */
78   PARSER_ERR_STRICT_IDENT_NOT_ALLOWED,                /**< identifier name is reserved in strict mode */
79   PARSER_ERR_EVAL_NOT_ALLOWED,                        /**< eval is not allowed here in strict mode */
80   PARSER_ERR_ARGUMENTS_NOT_ALLOWED,                   /**< arguments is not allowed here in strict mode */
81 #if ENABLED (JERRY_ES2015)
82   PARSER_ERR_USE_STRICT_NOT_ALLOWED,                  /**< use strict directive is not allowed */
83   PARSER_ERR_YIELD_NOT_ALLOWED,                       /**< yield expression is not allowed */
84   PARSER_ERR_AWAIT_NOT_ALLOWED,                       /**< await expression is not allowed */
85   PARSER_ERR_FOR_IN_OF_DECLARATION,                   /**< variable declaration in for-in or for-of loop */
86   PARSER_ERR_DUPLICATED_PROTO,                        /**< duplicated __proto__ fields are not allowed */
87 #endif /* ENABLED (JERRY_ES2015) */
88   PARSER_ERR_DELETE_IDENT_NOT_ALLOWED,                /**< identifier delete is not allowed in strict mode */
89   PARSER_ERR_EVAL_CANNOT_ASSIGNED,                    /**< eval cannot be assigned in strict mode */
90   PARSER_ERR_ARGUMENTS_CANNOT_ASSIGNED,               /**< arguments cannot be assigned in strict mode */
91   PARSER_ERR_WITH_NOT_ALLOWED,                        /**< with statement is not allowed in strict mode */
92   PARSER_ERR_MULTIPLE_DEFAULTS_NOT_ALLOWED,           /**< multiple default cases are not allowed */
93   PARSER_ERR_DEFAULT_NOT_IN_SWITCH,                   /**< default statement is not in switch block */
94   PARSER_ERR_CASE_NOT_IN_SWITCH,                      /**< case statement is not in switch block */
95 
96   PARSER_ERR_LEFT_PAREN_EXPECTED,                     /**< left paren expected */
97   PARSER_ERR_LEFT_BRACE_EXPECTED,                     /**< left brace expected */
98   PARSER_ERR_RIGHT_PAREN_EXPECTED,                    /**< right paren expected */
99   PARSER_ERR_RIGHT_SQUARE_EXPECTED,                   /**< right square expected */
100 
101   PARSER_ERR_COLON_EXPECTED,                          /**< colon expected */
102   PARSER_ERR_COLON_FOR_CONDITIONAL_EXPECTED,          /**< colon expected for conditional expression */
103   PARSER_ERR_SEMICOLON_EXPECTED,                      /**< semicolon expected */
104   PARSER_ERR_IN_EXPECTED,                             /**< in keyword expected */
105   PARSER_ERR_WHILE_EXPECTED,                          /**< while expected for do-while loop */
106   PARSER_ERR_CATCH_FINALLY_EXPECTED,                  /**< catch or finally expected */
107   PARSER_ERR_ARRAY_ITEM_SEPARATOR_EXPECTED,           /**< array item separator expected */
108   PARSER_ERR_OBJECT_ITEM_SEPARATOR_EXPECTED,          /**< object item separator expected */
109   PARSER_ERR_IDENTIFIER_EXPECTED,                     /**< identifier expected */
110   PARSER_ERR_EXPRESSION_EXPECTED,                     /**< expression expected */
111   PARSER_ERR_PRIMARY_EXP_EXPECTED,                    /**< primary expression expected */
112   PARSER_ERR_LEFT_HAND_SIDE_EXP_EXPECTED,             /**< left-hand-side expression expected */
113   PARSER_ERR_STATEMENT_EXPECTED,                      /**< statement expected */
114   PARSER_ERR_PROPERTY_IDENTIFIER_EXPECTED,            /**< property identifier expected */
115   PARSER_ERR_ARGUMENT_LIST_EXPECTED,                  /**< argument list expected */
116   PARSER_ERR_NO_ARGUMENTS_EXPECTED,                   /**< property getters must have no arguments */
117   PARSER_ERR_ONE_ARGUMENT_EXPECTED,                   /**< property setters must have one argument */
118 
119   PARSER_ERR_INVALID_EXPRESSION,                      /**< invalid expression */
120   PARSER_ERR_INVALID_SWITCH,                          /**< invalid switch body */
121   PARSER_ERR_INVALID_BREAK,                           /**< break must be inside a loop or switch */
122   PARSER_ERR_INVALID_BREAK_LABEL,                     /**< break target not found */
123   PARSER_ERR_INVALID_CONTINUE,                        /**< continue must be inside a loop */
124   PARSER_ERR_INVALID_CONTINUE_LABEL,                  /**< continue target not found */
125   PARSER_ERR_INVALID_RETURN,                          /**< return must be inside a function */
126   PARSER_ERR_INVALID_RIGHT_SQUARE,                    /**< right square must terminate a block */
127   PARSER_ERR_DUPLICATED_LABEL,                        /**< duplicated label */
128   PARSER_ERR_OBJECT_PROPERTY_REDEFINED,               /**< property of object literal redefined */
129 #if ENABLED (JERRY_ES2015)
130   PARSER_ERR_VARIABLE_REDECLARED,                     /**< a variable redeclared */
131   PARSER_ERR_LEXICAL_SINGLE_STATEMENT,                /**< lexical declaration in single statement context */
132   PARSER_ERR_LABELLED_FUNC_NOT_IN_BLOCK,              /**< labelled functions are only allowed inside blocks */
133   PARSER_ERR_LEXICAL_LET_BINDING,                     /**< let binding cannot be declared in let/const */
134   PARSER_ERR_MISSING_ASSIGN_AFTER_CONST,              /**< an assignment is required after a const declaration */
135 
136   PARSER_ERR_MULTIPLE_CLASS_CONSTRUCTORS,             /**< multiple class constructor */
137   PARSER_ERR_CLASS_CONSTRUCTOR_AS_ACCESSOR,           /**< class constructor cannot be an accessor */
138   PARSER_ERR_CLASS_CONSTRUCTOR_AS_GENERATOR,          /**< class constructor cannot be a generator */
139   PARSER_ERR_CLASS_STATIC_PROTOTYPE,                  /**< static method name 'prototype' is not allowed */
140   PARSER_ERR_UNEXPECTED_SUPER_KEYWORD,                /**< unexpected super keyword */
141 
142   PARSER_ERR_RIGHT_BRACE_EXPECTED,                    /**< right brace expected */
143   PARSER_ERR_OF_EXPECTED,                             /**< of keyword expected */
144 
145   PARSER_ERR_ASSIGNMENT_EXPECTED,                     /**< assignment expression expected */
146   PARSER_ERR_FORMAL_PARAM_AFTER_REST_PARAMETER,       /**< formal parameter after rest parameter */
147   PARSER_ERR_SETTER_REST_PARAMETER,                   /**< setter rest parameter */
148   PARSER_ERR_REST_PARAMETER_DEFAULT_INITIALIZER,      /**< rest parameter default initializer */
149   PARSER_ERR_DUPLICATED_ARGUMENT_NAMES,               /**< duplicated argument names */
150   PARSER_ERR_INVALID_DESTRUCTURING_PATTERN,           /**< invalid destructuring pattern */
151   PARSER_ERR_ILLEGAL_PROPERTY_IN_DECLARATION,         /**< illegal property in declaration context */
152   PARSER_ERR_INVALID_EXPONENTIATION,                  /**< left operand of ** operator cannot be unary expression */
153   PARSER_ERR_NEW_TARGET_EXPECTED,                     /**< expected new.target expression */
154   PARSER_ERR_NEW_TARGET_NOT_ALLOWED,                  /**< new.target is not allowed in the given context */
155 #endif /* ENABLED (JERRY_ES2015) */
156 #if ENABLED (JERRY_ES2015_MODULE_SYSTEM)
157   PARSER_ERR_FILE_NOT_FOUND,                          /**< file not found*/
158   PARSER_ERR_FROM_EXPECTED,                           /**< from expected */
159   PARSER_ERR_FROM_COMMA_EXPECTED,                     /**< from or comma expected */
160   PARSER_ERR_AS_EXPECTED,                             /**< as expected */
161   PARSER_ERR_STRING_EXPECTED,                         /**< string literal expected */
162   PARSER_ERR_MODULE_UNEXPECTED,                       /**< unexpected import or export statement */
163   PARSER_ERR_LEFT_BRACE_MULTIPLY_LITERAL_EXPECTED,    /**< left brace or multiply or literal expected */
164   PARSER_ERR_LEFT_BRACE_MULTIPLY_EXPECTED,            /**< left brace or multiply expected */
165   PARSER_ERR_RIGHT_BRACE_COMMA_EXPECTED,              /**< right brace or comma expected */
166   PARSER_ERR_DUPLICATED_EXPORT_IDENTIFIER,            /**< duplicated export identifier name */
167   PARSER_ERR_DUPLICATED_IMPORT_BINDING,               /**< duplicated import binding name */
168 #endif /* ENABLED (JERRY_ES2015_MODULE_SYSTEM) */
169 
170   PARSER_ERR_NON_STRICT_ARG_DEFINITION                /**< non-strict argument definition */
171 } parser_error_t;
172 
173 /**
174  * Source code line counter type.
175  */
176 typedef uint32_t parser_line_counter_t;
177 
178 /**
179  * Error code location.
180  */
181 typedef struct
182 {
183   parser_error_t error;                               /**< error code */
184   parser_line_counter_t line;                         /**< line where the error occured */
185   parser_line_counter_t column;                       /**< column where the error occured */
186 } parser_error_location_t;
187 
188 /* Note: source must be a valid UTF-8 string */
189 ecma_value_t parser_parse_script (const uint8_t *arg_list_p, size_t arg_list_size,
190                                   const uint8_t *source_p, size_t source_size,
191                                   uint32_t parse_opts, ecma_compiled_code_t **bytecode_data_p);
192 
193 #if ENABLED (JERRY_ERROR_MESSAGES)
194 const char *parser_error_to_string (parser_error_t);
195 #endif /* ENABLED (JERRY_ERROR_MESSAGES) */
196 
197 /**
198  * @}
199  * @}
200  * @}
201  */
202 
203 #endif /* !JS_PARSER_H */
204