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;
172 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
194 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
227 uint8_t breakpoints[PM_STRPBRK_CACHE_SIZE];
240 const uint8_t *next_start;
247 size_t *common_whitespace;
250 bool line_continuation;
263#define PM_LEX_STACK_SIZE 4
278 PM_CONTEXT_BEGIN_ENSURE,
281 PM_CONTEXT_BEGIN_ELSE,
284 PM_CONTEXT_BEGIN_RESCUE,
287 PM_CONTEXT_BLOCK_BRACES,
290 PM_CONTEXT_BLOCK_KEYWORDS,
293 PM_CONTEXT_BLOCK_ENSURE,
296 PM_CONTEXT_BLOCK_ELSE,
299 PM_CONTEXT_BLOCK_PARAMETERS,
302 PM_CONTEXT_BLOCK_RESCUE,
305 PM_CONTEXT_CASE_WHEN,
314 PM_CONTEXT_CLASS_ENSURE,
317 PM_CONTEXT_CLASS_ELSE,
320 PM_CONTEXT_CLASS_RESCUE,
326 PM_CONTEXT_DEF_ENSURE,
332 PM_CONTEXT_DEF_RESCUE,
335 PM_CONTEXT_DEF_PARAMS,
341 PM_CONTEXT_DEFAULT_PARAMS,
356 PM_CONTEXT_FOR_INDEX,
362 PM_CONTEXT_LAMBDA_BRACES,
365 PM_CONTEXT_LAMBDA_DO_END,
368 PM_CONTEXT_LAMBDA_ENSURE,
371 PM_CONTEXT_LAMBDA_ELSE,
374 PM_CONTEXT_LAMBDA_RESCUE,
377 PM_CONTEXT_LOOP_PREDICATE,
386 PM_CONTEXT_MODULE_ENSURE,
389 PM_CONTEXT_MODULE_ELSE,
392 PM_CONTEXT_MODULE_RESCUE,
395 PM_CONTEXT_MULTI_TARGET,
404 PM_CONTEXT_PREDICATE,
410 PM_CONTEXT_RESCUE_MODIFIER,
416 PM_CONTEXT_SCLASS_ENSURE,
419 PM_CONTEXT_SCLASS_ELSE,
422 PM_CONTEXT_SCLASS_RESCUE,
440 pm_context_t context;
447typedef uint8_t pm_shareable_constant_value_t;
448static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
449static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
450static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
451static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
498typedef uint8_t pm_scope_parameters_t;
499static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
500static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
501static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
502static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
503static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
504static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
505static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
506static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
546 pm_scope_parameters_t parameters;
552 pm_shareable_constant_value_t shareable_constant;
564typedef uint32_t pm_state_stack_t;
593 const uint8_t *start;
599 pm_lex_state_t lex_state;
602 int enclosure_nesting;
608 int lambda_enclosure_nesting;
620 pm_state_stack_t do_loop_stack;
626 pm_state_stack_t accepts_block_stack;
641 const uint8_t *start;
657 const uint8_t *next_start;
665 const uint8_t *heredoc_end;
718 const uint8_t *encoding_comment_start;
767 pm_node_flags_t base;
838 pm_options_version_t version;
841 uint8_t command_line;
851 int8_t frozen_string_literal;
874 bool in_endless_def_body;
893 bool encoding_locked;
900 bool encoding_changed;
906 bool pattern_matching_newlines;
915 bool semantic_token_seen;
921 bool warn_mismatched_indentation;
923#if defined(PRISM_HAS_NEON) || defined(PRISM_HAS_SSSE3) || defined(PRISM_HAS_SWAR)
937 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.