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"
29 PM_LEX_STATE_BIT_ENDARG,
30 PM_LEX_STATE_BIT_ENDFN,
32 PM_LEX_STATE_BIT_CMDARG,
34 PM_LEX_STATE_BIT_FNAME,
36 PM_LEX_STATE_BIT_CLASS,
37 PM_LEX_STATE_BIT_LABEL,
38 PM_LEX_STATE_BIT_LABELED,
39 PM_LEX_STATE_BIT_FITEM
47 PM_LEX_STATE_NONE = 0,
48 PM_LEX_STATE_BEG = (1 << PM_LEX_STATE_BIT_BEG),
49 PM_LEX_STATE_END = (1 << PM_LEX_STATE_BIT_END),
50 PM_LEX_STATE_ENDARG = (1 << PM_LEX_STATE_BIT_ENDARG),
51 PM_LEX_STATE_ENDFN = (1 << PM_LEX_STATE_BIT_ENDFN),
52 PM_LEX_STATE_ARG = (1 << PM_LEX_STATE_BIT_ARG),
53 PM_LEX_STATE_CMDARG = (1 << PM_LEX_STATE_BIT_CMDARG),
54 PM_LEX_STATE_MID = (1 << PM_LEX_STATE_BIT_MID),
55 PM_LEX_STATE_FNAME = (1 << PM_LEX_STATE_BIT_FNAME),
56 PM_LEX_STATE_DOT = (1 << PM_LEX_STATE_BIT_DOT),
57 PM_LEX_STATE_CLASS = (1 << PM_LEX_STATE_BIT_CLASS),
58 PM_LEX_STATE_LABEL = (1 << PM_LEX_STATE_BIT_LABEL),
59 PM_LEX_STATE_LABELED = (1 << PM_LEX_STATE_BIT_LABELED),
60 PM_LEX_STATE_FITEM = (1 << PM_LEX_STATE_BIT_FITEM),
61 PM_LEX_STATE_BEG_ANY = PM_LEX_STATE_BEG | PM_LEX_STATE_MID | PM_LEX_STATE_CLASS,
62 PM_LEX_STATE_ARG_ANY = PM_LEX_STATE_ARG | PM_LEX_STATE_CMDARG,
63 PM_LEX_STATE_END_ANY = PM_LEX_STATE_END | PM_LEX_STATE_ENDARG | PM_LEX_STATE_ENDFN
70 PM_HEREDOC_QUOTE_NONE,
71 PM_HEREDOC_QUOTE_SINGLE =
'\'',
72 PM_HEREDOC_QUOTE_DOUBLE =
'"',
73 PM_HEREDOC_QUOTE_BACKTICK =
'`',
80 PM_HEREDOC_INDENT_NONE,
81 PM_HEREDOC_INDENT_DASH,
82 PM_HEREDOC_INDENT_TILDE,
90 const uint8_t *ident_start;
96 pm_heredoc_quote_t quote;
99 pm_heredoc_indent_t indent;
171 uint8_t breakpoints[11];
193 uint8_t breakpoints[7];
226 uint8_t breakpoints[7];
239 const uint8_t *next_start;
246 size_t *common_whitespace;
249 bool line_continuation;
262#define PM_LEX_STACK_SIZE 4
277 PM_CONTEXT_BEGIN_ENSURE,
280 PM_CONTEXT_BEGIN_ELSE,
283 PM_CONTEXT_BEGIN_RESCUE,
286 PM_CONTEXT_BLOCK_BRACES,
289 PM_CONTEXT_BLOCK_KEYWORDS,
292 PM_CONTEXT_BLOCK_ENSURE,
295 PM_CONTEXT_BLOCK_ELSE,
298 PM_CONTEXT_BLOCK_PARAMETERS,
301 PM_CONTEXT_BLOCK_RESCUE,
304 PM_CONTEXT_CASE_WHEN,
313 PM_CONTEXT_CLASS_ENSURE,
316 PM_CONTEXT_CLASS_ELSE,
319 PM_CONTEXT_CLASS_RESCUE,
325 PM_CONTEXT_DEF_ENSURE,
331 PM_CONTEXT_DEF_RESCUE,
334 PM_CONTEXT_DEF_PARAMS,
340 PM_CONTEXT_DEFAULT_PARAMS,
355 PM_CONTEXT_FOR_INDEX,
361 PM_CONTEXT_LAMBDA_BRACES,
364 PM_CONTEXT_LAMBDA_DO_END,
367 PM_CONTEXT_LAMBDA_ENSURE,
370 PM_CONTEXT_LAMBDA_ELSE,
373 PM_CONTEXT_LAMBDA_RESCUE,
376 PM_CONTEXT_LOOP_PREDICATE,
385 PM_CONTEXT_MODULE_ENSURE,
388 PM_CONTEXT_MODULE_ELSE,
391 PM_CONTEXT_MODULE_RESCUE,
394 PM_CONTEXT_MULTI_TARGET,
403 PM_CONTEXT_PREDICATE,
409 PM_CONTEXT_RESCUE_MODIFIER,
415 PM_CONTEXT_SCLASS_ENSURE,
418 PM_CONTEXT_SCLASS_ELSE,
421 PM_CONTEXT_SCLASS_RESCUE,
439 pm_context_t context;
446typedef uint8_t pm_shareable_constant_value_t;
447static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
448static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
449static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
450static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
497typedef uint8_t pm_scope_parameters_t;
498static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
499static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
500static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
501static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
502static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
503static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
504static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
505static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
545 pm_scope_parameters_t parameters;
551 pm_shareable_constant_value_t shareable_constant;
563typedef uint32_t pm_state_stack_t;
592 const uint8_t *start;
598 pm_lex_state_t lex_state;
601 int enclosure_nesting;
607 int lambda_enclosure_nesting;
619 pm_state_stack_t do_loop_stack;
625 pm_state_stack_t accepts_block_stack;
640 const uint8_t *start;
656 const uint8_t *next_start;
664 const uint8_t *heredoc_end;
717 const uint8_t *encoding_comment_start;
766 pm_node_flags_t base;
837 pm_options_version_t version;
840 uint8_t command_line;
850 int8_t frozen_string_literal;
873 bool in_endless_def_body;
892 bool encoding_locked;
899 bool encoding_changed;
905 bool pattern_matching_newlines;
914 bool semantic_token_seen;
920 bool warn_mismatched_indentation;
922#if defined(PRISM_HAS_NEON) || defined(PRISM_HAS_SSSE3) || defined(PRISM_HAS_SWAR)
936 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.