1#ifndef PRISM_INTERNAL_PARSER_H
2#define PRISM_INTERNAL_PARSER_H
6#include "prism/internal/arena.h"
7#include "prism/internal/constant_pool.h"
8#include "prism/internal/encoding.h"
9#include "prism/internal/list.h"
10#include "prism/internal/options.h"
11#include "prism/internal/static_literals.h"
12#include "prism/internal/strpbrk.h"
30 PM_LEX_STATE_BIT_ENDARG,
31 PM_LEX_STATE_BIT_ENDFN,
33 PM_LEX_STATE_BIT_CMDARG,
35 PM_LEX_STATE_BIT_FNAME,
37 PM_LEX_STATE_BIT_CLASS,
38 PM_LEX_STATE_BIT_LABEL,
39 PM_LEX_STATE_BIT_LABELED,
40 PM_LEX_STATE_BIT_FITEM
48 PM_LEX_STATE_NONE = 0,
49 PM_LEX_STATE_BEG = (1 << PM_LEX_STATE_BIT_BEG),
50 PM_LEX_STATE_END = (1 << PM_LEX_STATE_BIT_END),
51 PM_LEX_STATE_ENDARG = (1 << PM_LEX_STATE_BIT_ENDARG),
52 PM_LEX_STATE_ENDFN = (1 << PM_LEX_STATE_BIT_ENDFN),
53 PM_LEX_STATE_ARG = (1 << PM_LEX_STATE_BIT_ARG),
54 PM_LEX_STATE_CMDARG = (1 << PM_LEX_STATE_BIT_CMDARG),
55 PM_LEX_STATE_MID = (1 << PM_LEX_STATE_BIT_MID),
56 PM_LEX_STATE_FNAME = (1 << PM_LEX_STATE_BIT_FNAME),
57 PM_LEX_STATE_DOT = (1 << PM_LEX_STATE_BIT_DOT),
58 PM_LEX_STATE_CLASS = (1 << PM_LEX_STATE_BIT_CLASS),
59 PM_LEX_STATE_LABEL = (1 << PM_LEX_STATE_BIT_LABEL),
60 PM_LEX_STATE_LABELED = (1 << PM_LEX_STATE_BIT_LABELED),
61 PM_LEX_STATE_FITEM = (1 << PM_LEX_STATE_BIT_FITEM),
62 PM_LEX_STATE_BEG_ANY = PM_LEX_STATE_BEG | PM_LEX_STATE_MID | PM_LEX_STATE_CLASS,
63 PM_LEX_STATE_ARG_ANY = PM_LEX_STATE_ARG | PM_LEX_STATE_CMDARG,
64 PM_LEX_STATE_END_ANY = PM_LEX_STATE_END | PM_LEX_STATE_ENDARG | PM_LEX_STATE_ENDFN
71 PM_HEREDOC_QUOTE_NONE,
72 PM_HEREDOC_QUOTE_SINGLE =
'\'',
73 PM_HEREDOC_QUOTE_DOUBLE =
'"',
74 PM_HEREDOC_QUOTE_BACKTICK =
'`',
81 PM_HEREDOC_INDENT_NONE,
82 PM_HEREDOC_INDENT_DASH,
83 PM_HEREDOC_INDENT_TILDE,
91 const uint8_t *ident_start;
97 pm_heredoc_quote_t quote;
100 pm_heredoc_indent_t indent;
188 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
210 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
243 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
256 const uint8_t *next_start;
263 size_t *common_whitespace;
266 bool line_continuation;
279#define PM_LEX_STACK_SIZE 4
294 PM_CONTEXT_BEGIN_ENSURE,
297 PM_CONTEXT_BEGIN_ELSE,
300 PM_CONTEXT_BEGIN_RESCUE,
303 PM_CONTEXT_BLOCK_BRACES,
306 PM_CONTEXT_BLOCK_KEYWORDS,
309 PM_CONTEXT_BLOCK_ENSURE,
312 PM_CONTEXT_BLOCK_ELSE,
315 PM_CONTEXT_BLOCK_PARAMETERS,
318 PM_CONTEXT_BLOCK_RESCUE,
321 PM_CONTEXT_CASE_WHEN,
330 PM_CONTEXT_CLASS_ENSURE,
333 PM_CONTEXT_CLASS_ELSE,
336 PM_CONTEXT_CLASS_RESCUE,
342 PM_CONTEXT_DEF_ENSURE,
348 PM_CONTEXT_DEF_RESCUE,
351 PM_CONTEXT_DEF_PARAMS,
357 PM_CONTEXT_DEFAULT_PARAMS,
372 PM_CONTEXT_FOR_INDEX,
378 PM_CONTEXT_LAMBDA_BRACES,
381 PM_CONTEXT_LAMBDA_DO_END,
384 PM_CONTEXT_LAMBDA_ENSURE,
387 PM_CONTEXT_LAMBDA_ELSE,
390 PM_CONTEXT_LAMBDA_RESCUE,
393 PM_CONTEXT_LOOP_PREDICATE,
402 PM_CONTEXT_MODULE_ENSURE,
405 PM_CONTEXT_MODULE_ELSE,
408 PM_CONTEXT_MODULE_RESCUE,
411 PM_CONTEXT_MULTI_TARGET,
420 PM_CONTEXT_PREDICATE,
426 PM_CONTEXT_RESCUE_MODIFIER,
432 PM_CONTEXT_SCLASS_ENSURE,
435 PM_CONTEXT_SCLASS_ELSE,
438 PM_CONTEXT_SCLASS_RESCUE,
459 pm_context_t context;
469typedef uint8_t pm_shareable_constant_value_t;
470static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
471static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
472static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
473static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
520typedef uint8_t pm_scope_parameters_t;
521static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
522static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
523static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
524static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
525static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
526static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
527static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
528static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
568 pm_scope_parameters_t parameters;
574 pm_shareable_constant_value_t shareable_constant;
586typedef uint32_t pm_state_stack_t;
615 const uint8_t *start;
621 pm_lex_state_t lex_state;
624 int enclosure_nesting;
630 int lambda_enclosure_nesting;
642 pm_state_stack_t do_loop_stack;
648 pm_state_stack_t accepts_block_stack;
663 const uint8_t *start;
679 const uint8_t *next_start;
687 const uint8_t *heredoc_end;
731 const uint8_t *encoding_comment_start;
780 pm_node_flags_t base;
851 pm_options_version_t version;
854 uint8_t command_line;
864 int8_t frozen_string_literal;
887 bool in_endless_def_body;
906 bool encoding_locked;
913 bool encoding_changed;
919 bool pattern_matching_newlines;
928 bool semantic_token_seen;
934 bool warn_mismatched_indentation;
936#if defined(PRISM_HAS_NEON) || defined(PRISM_HAS_SSSE3) || defined(PRISM_HAS_SWAR)
950 uint8_t high_lut[16];
uint32_t pm_constant_id_t
A constant id is a unique identifier for a constant in the constant pool.
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 ...
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 generic string type that can have various ownership semantics.
This struct represents a token in the Ruby source.