1#ifndef PRISM_INTERNAL_PARSER_H
2#define PRISM_INTERNAL_PARSER_H
6#include "prism/internal/arena.h"
7#include "prism/internal/comments.h"
8#include "prism/internal/constant_pool.h"
9#include "prism/internal/encoding.h"
10#include "prism/internal/list.h"
11#include "prism/internal/options.h"
12#include "prism/internal/static_literals.h"
13#include "prism/internal/strpbrk.h"
31 PM_LEX_STATE_BIT_ENDARG,
32 PM_LEX_STATE_BIT_ENDFN,
34 PM_LEX_STATE_BIT_CMDARG,
36 PM_LEX_STATE_BIT_FNAME,
38 PM_LEX_STATE_BIT_CLASS,
39 PM_LEX_STATE_BIT_LABEL,
40 PM_LEX_STATE_BIT_LABELED,
41 PM_LEX_STATE_BIT_FITEM
49 PM_LEX_STATE_NONE = 0,
50 PM_LEX_STATE_BEG = (1 << PM_LEX_STATE_BIT_BEG),
51 PM_LEX_STATE_END = (1 << PM_LEX_STATE_BIT_END),
52 PM_LEX_STATE_ENDARG = (1 << PM_LEX_STATE_BIT_ENDARG),
53 PM_LEX_STATE_ENDFN = (1 << PM_LEX_STATE_BIT_ENDFN),
54 PM_LEX_STATE_ARG = (1 << PM_LEX_STATE_BIT_ARG),
55 PM_LEX_STATE_CMDARG = (1 << PM_LEX_STATE_BIT_CMDARG),
56 PM_LEX_STATE_MID = (1 << PM_LEX_STATE_BIT_MID),
57 PM_LEX_STATE_FNAME = (1 << PM_LEX_STATE_BIT_FNAME),
58 PM_LEX_STATE_DOT = (1 << PM_LEX_STATE_BIT_DOT),
59 PM_LEX_STATE_CLASS = (1 << PM_LEX_STATE_BIT_CLASS),
60 PM_LEX_STATE_LABEL = (1 << PM_LEX_STATE_BIT_LABEL),
61 PM_LEX_STATE_LABELED = (1 << PM_LEX_STATE_BIT_LABELED),
62 PM_LEX_STATE_FITEM = (1 << PM_LEX_STATE_BIT_FITEM),
63 PM_LEX_STATE_BEG_ANY = PM_LEX_STATE_BEG | PM_LEX_STATE_MID | PM_LEX_STATE_CLASS,
64 PM_LEX_STATE_ARG_ANY = PM_LEX_STATE_ARG | PM_LEX_STATE_CMDARG,
65 PM_LEX_STATE_END_ANY = PM_LEX_STATE_END | PM_LEX_STATE_ENDARG | PM_LEX_STATE_ENDFN
72 PM_HEREDOC_QUOTE_NONE,
73 PM_HEREDOC_QUOTE_SINGLE =
'\'',
74 PM_HEREDOC_QUOTE_DOUBLE =
'"',
75 PM_HEREDOC_QUOTE_BACKTICK =
'`',
82 PM_HEREDOC_INDENT_NONE,
83 PM_HEREDOC_INDENT_DASH,
84 PM_HEREDOC_INDENT_TILDE,
92 const uint8_t *ident_start;
98 pm_heredoc_quote_t quote;
101 pm_heredoc_indent_t indent;
189 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
211 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
244 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
257 const uint8_t *next_start;
264 size_t *common_whitespace;
267 bool line_continuation;
280#define PM_LEX_STACK_SIZE 4
295 PM_CONTEXT_BEGIN_ENSURE,
298 PM_CONTEXT_BEGIN_ELSE,
301 PM_CONTEXT_BEGIN_RESCUE,
304 PM_CONTEXT_BLOCK_BRACES,
307 PM_CONTEXT_BLOCK_KEYWORDS,
310 PM_CONTEXT_BLOCK_ENSURE,
313 PM_CONTEXT_BLOCK_ELSE,
316 PM_CONTEXT_BLOCK_PARAMETERS,
319 PM_CONTEXT_BLOCK_RESCUE,
322 PM_CONTEXT_CASE_WHEN,
331 PM_CONTEXT_CLASS_ENSURE,
334 PM_CONTEXT_CLASS_ELSE,
337 PM_CONTEXT_CLASS_RESCUE,
343 PM_CONTEXT_DEF_ENSURE,
349 PM_CONTEXT_DEF_RESCUE,
352 PM_CONTEXT_DEF_PARAMS,
358 PM_CONTEXT_DEFAULT_PARAMS,
373 PM_CONTEXT_FOR_INDEX,
379 PM_CONTEXT_LAMBDA_BRACES,
382 PM_CONTEXT_LAMBDA_DO_END,
385 PM_CONTEXT_LAMBDA_ENSURE,
388 PM_CONTEXT_LAMBDA_ELSE,
391 PM_CONTEXT_LAMBDA_RESCUE,
394 PM_CONTEXT_LOOP_PREDICATE,
403 PM_CONTEXT_MODULE_ENSURE,
406 PM_CONTEXT_MODULE_ELSE,
409 PM_CONTEXT_MODULE_RESCUE,
412 PM_CONTEXT_MULTI_TARGET,
421 PM_CONTEXT_PREDICATE,
427 PM_CONTEXT_RESCUE_MODIFIER,
433 PM_CONTEXT_SCLASS_ENSURE,
436 PM_CONTEXT_SCLASS_ELSE,
439 PM_CONTEXT_SCLASS_RESCUE,
460 pm_context_t context;
470typedef uint8_t pm_shareable_constant_value_t;
471static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
472static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
473static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
474static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
521typedef uint8_t pm_scope_parameters_t;
522static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
523static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
524static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
525static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
526static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
527static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
528static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
529static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
569 pm_scope_parameters_t parameters;
575 pm_shareable_constant_value_t shareable_constant;
587typedef uint32_t pm_state_stack_t;
616 const uint8_t *start;
622 pm_lex_state_t lex_state;
625 int enclosure_nesting;
631 int lambda_enclosure_nesting;
643 pm_state_stack_t do_loop_stack;
649 pm_state_stack_t accepts_block_stack;
664 const uint8_t *start;
680 const uint8_t *next_start;
688 const uint8_t *heredoc_end;
738 const uint8_t *encoding_comment_start;
787 pm_node_flags_t base;
858 pm_options_version_t version;
861 uint8_t command_line;
871 int8_t frozen_string_literal;
890 bool attach_comments;
900 bool in_endless_def_body;
919 bool encoding_locked;
926 bool encoding_changed;
932 bool pattern_matching_newlines;
941 bool semantic_token_seen;
947 bool warn_mismatched_indentation;
949#if defined(PRISM_HAS_NEON) || defined(PRISM_HAS_SSE2) || defined(PRISM_HAS_SWAR)
963 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.