1#ifndef PRISM_INTERNAL_PARSER_H
2#define PRISM_INTERNAL_PARSER_H
8#include "prism/internal/arena.h"
9#include "prism/internal/comments.h"
10#include "prism/internal/constant_pool.h"
11#include "prism/internal/encoding.h"
12#include "prism/internal/list.h"
13#include "prism/internal/options.h"
14#include "prism/internal/static_literals.h"
15#include "prism/internal/strpbrk.h"
33 PM_LEX_STATE_BIT_ENDARG,
34 PM_LEX_STATE_BIT_ENDFN,
36 PM_LEX_STATE_BIT_CMDARG,
38 PM_LEX_STATE_BIT_FNAME,
40 PM_LEX_STATE_BIT_CLASS,
41 PM_LEX_STATE_BIT_LABEL,
42 PM_LEX_STATE_BIT_LABELED,
43 PM_LEX_STATE_BIT_FITEM
51 PM_LEX_STATE_NONE = 0,
52 PM_LEX_STATE_BEG = (1 << PM_LEX_STATE_BIT_BEG),
53 PM_LEX_STATE_END = (1 << PM_LEX_STATE_BIT_END),
54 PM_LEX_STATE_ENDARG = (1 << PM_LEX_STATE_BIT_ENDARG),
55 PM_LEX_STATE_ENDFN = (1 << PM_LEX_STATE_BIT_ENDFN),
56 PM_LEX_STATE_ARG = (1 << PM_LEX_STATE_BIT_ARG),
57 PM_LEX_STATE_CMDARG = (1 << PM_LEX_STATE_BIT_CMDARG),
58 PM_LEX_STATE_MID = (1 << PM_LEX_STATE_BIT_MID),
59 PM_LEX_STATE_FNAME = (1 << PM_LEX_STATE_BIT_FNAME),
60 PM_LEX_STATE_DOT = (1 << PM_LEX_STATE_BIT_DOT),
61 PM_LEX_STATE_CLASS = (1 << PM_LEX_STATE_BIT_CLASS),
62 PM_LEX_STATE_LABEL = (1 << PM_LEX_STATE_BIT_LABEL),
63 PM_LEX_STATE_LABELED = (1 << PM_LEX_STATE_BIT_LABELED),
64 PM_LEX_STATE_FITEM = (1 << PM_LEX_STATE_BIT_FITEM),
65 PM_LEX_STATE_BEG_ANY = PM_LEX_STATE_BEG | PM_LEX_STATE_MID | PM_LEX_STATE_CLASS,
66 PM_LEX_STATE_ARG_ANY = PM_LEX_STATE_ARG | PM_LEX_STATE_CMDARG,
67 PM_LEX_STATE_END_ANY = PM_LEX_STATE_END | PM_LEX_STATE_ENDARG | PM_LEX_STATE_ENDFN
74 PM_HEREDOC_QUOTE_NONE,
75 PM_HEREDOC_QUOTE_SINGLE =
'\'',
76 PM_HEREDOC_QUOTE_DOUBLE =
'"',
77 PM_HEREDOC_QUOTE_BACKTICK =
'`',
84 PM_HEREDOC_INDENT_NONE,
85 PM_HEREDOC_INDENT_DASH,
86 PM_HEREDOC_INDENT_TILDE,
94 const uint8_t *ident_start;
100 pm_heredoc_quote_t quote;
103 pm_heredoc_indent_t indent;
191 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
213 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
246 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
259 const uint8_t *next_start;
266 size_t *common_whitespace;
269 bool line_continuation;
290 PM_CONTEXT_BEGIN_ENSURE,
293 PM_CONTEXT_BEGIN_ELSE,
296 PM_CONTEXT_BEGIN_RESCUE,
299 PM_CONTEXT_BLOCK_BRACES,
302 PM_CONTEXT_BLOCK_KEYWORDS,
305 PM_CONTEXT_BLOCK_ENSURE,
308 PM_CONTEXT_BLOCK_ELSE,
311 PM_CONTEXT_BLOCK_PARAMETERS,
314 PM_CONTEXT_BLOCK_RESCUE,
317 PM_CONTEXT_CASE_WHEN,
326 PM_CONTEXT_CLASS_ENSURE,
329 PM_CONTEXT_CLASS_ELSE,
332 PM_CONTEXT_CLASS_RESCUE,
338 PM_CONTEXT_DEF_ENSURE,
344 PM_CONTEXT_DEF_RESCUE,
347 PM_CONTEXT_DEF_PARAMS,
353 PM_CONTEXT_DEFAULT_PARAMS,
368 PM_CONTEXT_FOR_INDEX,
374 PM_CONTEXT_LAMBDA_BRACES,
377 PM_CONTEXT_LAMBDA_DO_END,
380 PM_CONTEXT_LAMBDA_ENSURE,
383 PM_CONTEXT_LAMBDA_ELSE,
386 PM_CONTEXT_LAMBDA_RESCUE,
389 PM_CONTEXT_LOOP_PREDICATE,
398 PM_CONTEXT_MODULE_ENSURE,
401 PM_CONTEXT_MODULE_ELSE,
404 PM_CONTEXT_MODULE_RESCUE,
407 PM_CONTEXT_MULTI_TARGET,
416 PM_CONTEXT_PREDICATE,
422 PM_CONTEXT_RESCUE_MODIFIER,
428 PM_CONTEXT_SCLASS_ENSURE,
431 PM_CONTEXT_SCLASS_ELSE,
434 PM_CONTEXT_SCLASS_RESCUE,
455 pm_context_t context;
465typedef uint8_t pm_shareable_constant_value_t;
466static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
467static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
468static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
469static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
516typedef uint8_t pm_scope_parameters_t;
517static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
518static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
519static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
520static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
521static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
522static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
523static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
524static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
564 pm_scope_parameters_t parameters;
570 pm_shareable_constant_value_t shareable_constant;
648 const uint8_t *start;
654 pm_lex_state_t lex_state;
657 int enclosure_nesting;
663 int lambda_enclosure_nesting;
703 const uint8_t *start;
719 const uint8_t *next_start;
727 const uint8_t *heredoc_end;
791 const uint8_t *encoding_comment_start;
840 pm_node_flags_t base;
857 const uint8_t *start;
920 uintptr_t stack_base;
930 pm_options_version_t version;
933 uint8_t command_line;
943 int8_t frozen_string_literal;
962 bool attach_comments;
972 bool in_endless_def_body;
991 bool encoding_locked;
998 bool encoding_changed;
1004 bool pattern_matching_newlines;
1007 bool in_keyword_arg;
1013 bool semantic_token_seen;
1019 bool warn_mismatched_indentation;
1026 bool stack_exhausted_reported;
1028#if defined(PRISM_HAS_NEON) || defined(PRISM_HAS_SSE2) || defined(PRISM_HAS_SWAR)
1036 uint8_t charset[12];
1039 uint8_t low_lut[16];
1042 uint8_t high_lut[16];
1067bool pm_keyword_p(
const uint8_t *start,
const uint8_t *end);
1077pm_parser_stack_exhausted(
const pm_parser_t *parser) {
1079 uintptr_t used = current < parser->stack_base ? parser->stack_base - current : current - parser->stack_base;
1080 return used > parser->stack_budget;
1089void pm_parser_err_stack_exhausted(
pm_parser_t *parser, uint32_t start, uint32_t length);
uint32_t pm_constant_id_t
A constant id is a unique identifier for a constant in the constant pool.
#define PRISM_INLINE
Old Visual Studio versions do not support the inline keyword, so we need to define it to be __inline.
A list of byte offsets of newlines in a string.
The parser used to parse Ruby source.
void(* pm_lex_callback_t)(pm_parser_t *parser, pm_token_t *token, void *data)
This is the callback that is called when a token is lexed.
void(* pm_encoding_changed_callback_t)(pm_parser_t *parser)
When the encoding that is being used to parse the source is changed by prism, we provide the ability ...
static PRISM_INLINE uintptr_t pm_stack_address(void)
Returns the current position of the C stack, for measuring how much of it has been consumed since an ...
A list of offsets of the start of lines in a string.
This struct represents a slice in the source code, defined by an offset and a length.
A list of nodes in the source, most often used for lists of children.
A view of a sequence of bytes.
This struct represents a token in the Ruby source.