Ruby  3.4.0dev (2024-12-06 revision 892c46283a5ea4179500d951c9d4866c0051f27b)
parser.h
Go to the documentation of this file.
1 
6 #ifndef PRISM_PARSER_H
7 #define PRISM_PARSER_H
8 
9 #include "prism/defines.h"
10 #include "prism/ast.h"
11 #include "prism/encoding.h"
12 #include "prism/options.h"
13 #include "prism/static_literals.h"
15 #include "prism/util/pm_list.h"
17 #include "prism/util/pm_string.h"
18 
19 #include <stdbool.h>
20 
26 typedef enum {
27  PM_LEX_STATE_BIT_BEG,
28  PM_LEX_STATE_BIT_END,
29  PM_LEX_STATE_BIT_ENDARG,
30  PM_LEX_STATE_BIT_ENDFN,
31  PM_LEX_STATE_BIT_ARG,
32  PM_LEX_STATE_BIT_CMDARG,
33  PM_LEX_STATE_BIT_MID,
34  PM_LEX_STATE_BIT_FNAME,
35  PM_LEX_STATE_BIT_DOT,
36  PM_LEX_STATE_BIT_CLASS,
37  PM_LEX_STATE_BIT_LABEL,
38  PM_LEX_STATE_BIT_LABELED,
39  PM_LEX_STATE_BIT_FITEM
41 
46 typedef enum {
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
65 
69 typedef enum {
70  PM_HEREDOC_QUOTE_NONE,
71  PM_HEREDOC_QUOTE_SINGLE = '\'',
72  PM_HEREDOC_QUOTE_DOUBLE = '"',
73  PM_HEREDOC_QUOTE_BACKTICK = '`',
75 
79 typedef enum {
80  PM_HEREDOC_INDENT_NONE,
81  PM_HEREDOC_INDENT_DASH,
82  PM_HEREDOC_INDENT_TILDE,
84 
88 typedef struct {
90  const uint8_t *ident_start;
91 
93  size_t ident_length;
94 
97 
101 
109 typedef struct pm_lex_mode {
111  enum {
114 
120 
126 
129 
135 
141 
147  } mode;
148 
150  union {
151  struct {
153  size_t nesting;
154 
157 
162  uint8_t incrementor;
163 
165  uint8_t terminator;
166 
171  uint8_t breakpoints[11];
172  } list;
173 
174  struct {
178  size_t nesting;
179 
184  uint8_t incrementor;
185 
187  uint8_t terminator;
188 
193  uint8_t breakpoints[7];
194  } regexp;
195 
196  struct {
198  size_t nesting;
199 
201  bool interpolation;
202 
209 
214  uint8_t incrementor;
215 
220  uint8_t terminator;
221 
226  uint8_t breakpoints[7];
227  } string;
228 
229  struct {
234 
239  const uint8_t *next_start;
240 
247 
250  } heredoc;
251  } as;
252 
254  struct pm_lex_mode *prev;
256 
262 #define PM_LEX_STACK_SIZE 4
263 
267 typedef struct pm_parser pm_parser_t;
268 
274 typedef enum {
277 
280 
283 
286 
289 
292 
295 
298 
301 
304 
307 
310 
313 
316 
319 
322 
325 
328 
331 
334 
337 
340 
343 
346 
349 
352 
355 
358 
361 
364 
367 
370 
373 
376 
379 
382 
385 
388 
391 
394 
397 
400 
403 
406 
409 
412 
415 
418 
421 
424 
427 
430 
433 
436 } pm_context_t;
437 
439 typedef struct pm_context_node {
442 
446 
448 typedef enum {
449  PM_COMMENT_INLINE,
450  PM_COMMENT_EMBDOC
452 
458 typedef struct pm_comment {
461 
464 
468 
475 typedef struct {
478 
480  const uint8_t *key_start;
481 
483  const uint8_t *value_start;
484 
486  uint32_t key_length;
487 
489  uint32_t value_length;
491 
497 
506 typedef struct {
512  void *data;
513 
518  void (*callback)(void *data, pm_parser_t *parser, pm_token_t *token);
520 
523 static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
524 static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
525 static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
526 static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
527 
532 typedef struct {
535 
538 
540  uint32_t index;
541 
543  uint32_t reads;
544 
546  uint32_t hash;
547 } pm_local_t;
548 
554 typedef struct pm_locals {
556  uint32_t size;
557 
559  uint32_t capacity;
560 
564 
566 typedef uint8_t pm_scope_parameters_t;
567 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
568 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
569 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
570 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
571 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
572 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
573 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
574 static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
575 
580 typedef struct pm_scope {
583 
586 
594 
615 
621 
626  bool closed;
628 
632 typedef uint32_t pm_state_stack_t;
633 
640 struct pm_parser {
646  uint32_t node_id;
647 
650 
653 
659 
665 
671 
677 
679  struct {
682 
685 
687  size_t index;
689 
691  const uint8_t *start;
692 
694  const uint8_t *end;
695 
698 
701 
707  const uint8_t *next_start;
708 
715  const uint8_t *heredoc_end;
716 
719 
722 
729 
732 
735 
738 
741 
750 
756 
763 
768  const uint8_t *encoding_comment_start;
769 
775 
781 
787 
790 
798 
804 
809  int32_t start_line;
810 
841 
854 
857 
859  uint8_t command_line;
860 
870 
876 
883 
886 
889 
897 
904 
910 
913 
919 
925 
931 };
932 
933 #endif
The abstract syntax tree.
@ PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING
constant writes that should be modified with shareable constant value experimental everything
Definition: ast.h:7893
@ PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL
constant writes that should be modified with shareable constant value literal
Definition: ast.h:7890
@ PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY
constant writes that should be modified with shareable constant value experimental copy
Definition: ast.h:7896
uint16_t pm_node_flags_t
These are the flags embedded in the node struct.
Definition: ast.h:1040
The options that can be passed to parsing.
pm_options_version_t
The version of Ruby syntax that we should be parsing with.
Definition: options.h:66
struct pm_locals pm_locals_t
This is a set of local variables in a certain lexical context (method, class, module,...
pm_heredoc_indent_t
The type of indentation that a heredoc uses.
Definition: parser.h:79
struct pm_context_node pm_context_node_t
This is a node in a linked list of contexts.
uint32_t pm_state_stack_t
A struct that represents a stack of boolean values.
Definition: parser.h:632
#define PM_LEX_STACK_SIZE
We pre-allocate a certain number of lex states in order to avoid having to call malloc too many times...
Definition: parser.h:262
struct pm_lex_mode pm_lex_mode_t
When lexing Ruby source, the lexer has a small amount of state to tell which kind of token it is curr...
struct pm_comment pm_comment_t
This is a node in the linked list of comments that we've found while parsing.
pm_lex_state_bit_t
This enum provides various bits that represent different kinds of states that the lexer can track.
Definition: parser.h:26
pm_lex_state_t
This enum combines the various bits from the above enum into individual values that represent the var...
Definition: parser.h:46
struct pm_scope pm_scope_t
This struct represents a node in a linked list of scopes.
pm_heredoc_quote_t
The type of quote that a heredoc uses.
Definition: parser.h:69
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 ...
Definition: parser.h:496
pm_context_t
While parsing, we keep track of a stack of contexts.
Definition: parser.h:274
@ PM_CONTEXT_CLASS_RESCUE
a rescue statement within a class statement
Definition: parser.h:321
@ PM_CONTEXT_ELSIF
an elsif clause
Definition: parser.h:348
@ PM_CONTEXT_DEF_RESCUE
a rescue statement within a method definition
Definition: parser.h:333
@ PM_CONTEXT_ELSE
an else clause
Definition: parser.h:345
@ PM_CONTEXT_FOR_INDEX
a for loop's index
Definition: parser.h:357
@ PM_CONTEXT_CASE_WHEN
a case when statements
Definition: parser.h:306
@ PM_CONTEXT_BLOCK_RESCUE
a rescue statement within a do..end block
Definition: parser.h:303
@ PM_CONTEXT_MODULE
a module declaration
Definition: parser.h:384
@ PM_CONTEXT_DEF_PARAMS
a method definition's parameters
Definition: parser.h:336
@ PM_CONTEXT_CASE_IN
a case in statements
Definition: parser.h:309
@ PM_CONTEXT_BLOCK_ELSE
a rescue else statement within a do..end block
Definition: parser.h:300
@ PM_CONTEXT_LOOP_PREDICATE
the predicate clause of a loop statement
Definition: parser.h:378
@ PM_CONTEXT_SCLASS
a singleton class definition
Definition: parser.h:414
@ PM_CONTEXT_UNLESS
an unless statement
Definition: parser.h:429
@ PM_CONTEXT_POSTEXE
an END block
Definition: parser.h:402
@ PM_CONTEXT_IF
an if statement
Definition: parser.h:360
@ PM_CONTEXT_MULTI_TARGET
a multiple target expression
Definition: parser.h:396
@ PM_CONTEXT_LAMBDA_RESCUE
a rescue statement within a lambda expression
Definition: parser.h:375
@ PM_CONTEXT_BEGIN_ELSE
a rescue else statement with an explicit begin
Definition: parser.h:285
@ PM_CONTEXT_NONE
a null context, used for returning a value from a function
Definition: parser.h:276
@ PM_CONTEXT_CLASS_ELSE
a rescue else statement within a class statement
Definition: parser.h:318
@ PM_CONTEXT_LAMBDA_ENSURE
an ensure statement within a lambda expression
Definition: parser.h:369
@ PM_CONTEXT_BLOCK_ENSURE
an ensure statement within a do..end block
Definition: parser.h:297
@ PM_CONTEXT_CLASS_ENSURE
an ensure statement within a class statement
Definition: parser.h:315
@ PM_CONTEXT_LAMBDA_BRACES
a lambda expression with braces
Definition: parser.h:363
@ PM_CONTEXT_MODULE_ELSE
a rescue else statement within a module statement
Definition: parser.h:390
@ PM_CONTEXT_PARENS
a parenthesized expression
Definition: parser.h:399
@ PM_CONTEXT_BLOCK_BRACES
expressions in block arguments using braces
Definition: parser.h:291
@ PM_CONTEXT_DEF_ENSURE
an ensure statement within a method definition
Definition: parser.h:327
@ PM_CONTEXT_SCLASS_RESCUE
a rescue statement with a singleton class
Definition: parser.h:423
@ PM_CONTEXT_PREEXE
a BEGIN block
Definition: parser.h:408
@ PM_CONTEXT_DEFINED
a defined? expression
Definition: parser.h:339
@ PM_CONTEXT_MODULE_ENSURE
an ensure statement within a module statement
Definition: parser.h:387
@ PM_CONTEXT_BEGIN_RESCUE
a rescue statement with an explicit begin
Definition: parser.h:288
@ PM_CONTEXT_UNTIL
an until statement
Definition: parser.h:432
@ PM_CONTEXT_DEF_ELSE
a rescue else statement within a method definition
Definition: parser.h:330
@ PM_CONTEXT_FOR
a for loop
Definition: parser.h:354
@ PM_CONTEXT_PREDICATE
a predicate inside an if/elsif/unless statement
Definition: parser.h:405
@ PM_CONTEXT_BEGIN_ENSURE
an ensure statement with an explicit begin
Definition: parser.h:282
@ PM_CONTEXT_SCLASS_ENSURE
an ensure statement with a singleton class
Definition: parser.h:417
@ PM_CONTEXT_DEFAULT_PARAMS
a method definition's default parameter
Definition: parser.h:342
@ PM_CONTEXT_LAMBDA_ELSE
a rescue else statement within a lambda expression
Definition: parser.h:372
@ PM_CONTEXT_CLASS
a class declaration
Definition: parser.h:312
@ PM_CONTEXT_MAIN
the top level context
Definition: parser.h:381
@ PM_CONTEXT_LAMBDA_DO_END
a lambda expression with do..end
Definition: parser.h:366
@ PM_CONTEXT_BEGIN
a begin statement
Definition: parser.h:279
@ PM_CONTEXT_RESCUE_MODIFIER
a modifier rescue clause
Definition: parser.h:411
@ PM_CONTEXT_EMBEXPR
an interpolated expression
Definition: parser.h:351
@ PM_CONTEXT_TERNARY
a ternary expression
Definition: parser.h:426
@ PM_CONTEXT_DEF
a method definition
Definition: parser.h:324
@ PM_CONTEXT_SCLASS_ELSE
a rescue else statement with a singleton class
Definition: parser.h:420
@ PM_CONTEXT_MODULE_RESCUE
a rescue statement within a module statement
Definition: parser.h:393
@ PM_CONTEXT_BLOCK_KEYWORDS
expressions in block arguments using do..end
Definition: parser.h:294
@ PM_CONTEXT_WHILE
a while statement
Definition: parser.h:435
uint8_t pm_scope_parameters_t
The flags about scope parameters that can be set.
Definition: parser.h:566
uint8_t pm_shareable_constant_value_t
The type of shareable constant value that can be set.
Definition: parser.h:522
pm_comment_type_t
This is the type of a comment that we've found while parsing.
Definition: parser.h:448
A data structure that stores a set of strings.
uint32_t pm_constant_id_t
A constant id is a unique identifier for a constant in the constant pool.
An abstract linked list.
A list of byte offsets of newlines in a string.
A generic string type that can have various ownership semantics.
Macro definitions used throughout the prism library.
The encoding interface and implementations used by the parser.
A set of static literal nodes that can be checked for duplicates.
C99 shim for <stdbool.h>
This is a node in the linked list of comments that we've found while parsing.
Definition: parser.h:458
pm_list_node_t node
The embedded base node.
Definition: parser.h:460
pm_comment_type_t type
The type of comment that we've found.
Definition: parser.h:466
pm_location_t location
The location of the comment in the source.
Definition: parser.h:463
The overall constant pool, which stores constants found while parsing.
This is a node in a linked list of contexts.
Definition: parser.h:439
pm_context_t context
The context that this node represents.
Definition: parser.h:441
struct pm_context_node * prev
A pointer to the previous context in the linked list.
Definition: parser.h:444
This struct defines the functions necessary to implement the encoding interface so we can determine h...
Definition: encoding.h:23
All of the information necessary to store to lexing a heredoc.
Definition: parser.h:88
size_t ident_length
The length of the heredoc identifier.
Definition: parser.h:93
pm_heredoc_quote_t quote
The type of quote that the heredoc uses.
Definition: parser.h:96
pm_heredoc_indent_t indent
The type of indentation that the heredoc uses.
Definition: parser.h:99
const uint8_t * ident_start
A pointer to the start of the heredoc identifier.
Definition: parser.h:90
When you are lexing through a file, the lexer needs all of the information that the parser additional...
Definition: parser.h:506
void * data
This opaque pointer is used to provide whatever information the user deemed necessary to the callback...
Definition: parser.h:512
When lexing Ruby source, the lexer has a small amount of state to tell which kind of token it is curr...
Definition: parser.h:109
enum pm_lex_mode::@91 mode
The type of this lex mode.
uint8_t terminator
This is the terminator of the list literal.
Definition: parser.h:165
size_t nesting
This keeps track of the nesting level of the list.
Definition: parser.h:153
bool interpolation
Whether or not interpolation is allowed in this list.
Definition: parser.h:156
uint8_t incrementor
When lexing a list, it takes into account balancing the terminator if the terminator is one of (),...
Definition: parser.h:162
uint8_t breakpoints[11]
This is the character set that should be used to delimit the tokens within the list.
Definition: parser.h:171
@ PM_LEX_LIST
This state is used when we are lexing a list of tokens, as in a w word list literal or a i symbol lis...
Definition: parser.h:134
@ PM_LEX_EMBVAR
This state is used when we're lexing a variable that is embedded directly inside of a string with the...
Definition: parser.h:125
@ PM_LEX_REGEXP
This state is used when a regular expression has been begun and we are looking for the terminator.
Definition: parser.h:140
@ PM_LEX_DEFAULT
This state is used when any given token is being lexed.
Definition: parser.h:113
@ PM_LEX_HEREDOC
This state is used when you are inside the content of a heredoc.
Definition: parser.h:128
@ PM_LEX_EMBEXPR
This state is used when we're lexing as normal but inside an embedded expression of a string.
Definition: parser.h:119
@ PM_LEX_STRING
This state is used when we are lexing a string or a string-like token, as in string content with eith...
Definition: parser.h:146
pm_heredoc_lex_mode_t base
All of the data necessary to lex a heredoc.
Definition: parser.h:233
bool line_continuation
True if the previous token ended with a line continuation.
Definition: parser.h:249
struct pm_lex_mode * prev
The previous lex state so that it knows how to pop.
Definition: parser.h:254
bool label_allowed
Whether or not at the end of the string we should allow a :, which would indicate this was a dynamic ...
Definition: parser.h:208
union pm_lex_mode::@92 as
The data associated with this type of lex mode.
const uint8_t * next_start
This is the pointer to the character where lexing should resume once the heredoc has been completely ...
Definition: parser.h:239
size_t * common_whitespace
This is used to track the amount of common whitespace on each line so that we know how much to dedent...
Definition: parser.h:246
This struct represents an abstract linked list that provides common functionality.
Definition: pm_list.h:46
This represents the overall linked list.
Definition: pm_list.h:55
This tracks an individual local variable in a certain lexical context, as well as the number of times...
Definition: parser.h:532
pm_constant_id_t name
The name of the local variable.
Definition: parser.h:534
pm_location_t location
The location of the local variable in the source.
Definition: parser.h:537
uint32_t hash
The hash of the local variable.
Definition: parser.h:546
uint32_t index
The index of the local variable in the local table.
Definition: parser.h:540
uint32_t reads
The number of times the local variable is read.
Definition: parser.h:543
This is a set of local variables in a certain lexical context (method, class, module,...
Definition: parser.h:554
pm_local_t * locals
The nullable allocated memory for the local variables in the set.
Definition: parser.h:562
uint32_t capacity
The capacity of the local variables set.
Definition: parser.h:559
uint32_t size
The number of local variables in the set.
Definition: parser.h:556
This represents a range of bytes in the source string to which a node or token corresponds.
Definition: ast.h:545
This is a node in the linked list of magic comments that we've found while parsing.
Definition: parser.h:475
uint32_t key_length
The length of the key in the source.
Definition: parser.h:486
pm_list_node_t node
The embedded base node.
Definition: parser.h:477
const uint8_t * key_start
A pointer to the start of the key in the source.
Definition: parser.h:480
const uint8_t * value_start
A pointer to the start of the value in the source.
Definition: parser.h:483
uint32_t value_length
The length of the value in the source.
Definition: parser.h:489
A list of offsets of newlines in a string.
A list of nodes in the source, most often used for lists of children.
Definition: ast.h:558
This struct represents the overall parser.
Definition: parser.h:640
const pm_encoding_t * explicit_encoding
When a string-like expression is being lexed, any byte or escape sequence that resolves to a value wh...
Definition: parser.h:840
pm_lex_state_t lex_state
The current state of the lexer.
Definition: parser.h:649
uint8_t command_line
The command line flags given from the options.
Definition: parser.h:859
const pm_encoding_t * encoding
The encoding functions for the current file is attached to the parser as it's parsing so that it can ...
Definition: parser.h:755
bool partial_script
Whether or not we are parsing a "partial" script, which is a script that will be evaluated in the con...
Definition: parser.h:882
bool pattern_matching_newlines
This flag indicates that we are currently parsing a pattern matching expression and impacts that calc...
Definition: parser.h:909
const uint8_t * end
The pointer to the end of the source.
Definition: parser.h:694
bool recovering
Whether or not we're currently recovering from a syntax error.
Definition: parser.h:888
pm_node_flags_t integer_base
We want to add a flag to integer nodes that indicates their base.
Definition: parser.h:797
bool warn_mismatched_indentation
By default, Ruby always warns about mismatched indentation.
Definition: parser.h:930
pm_constant_pool_t constant_pool
This constant pool keeps all of the constants defined throughout the file so that we can reference th...
Definition: parser.h:786
bool in_keyword_arg
This flag indicates that we are currently parsing a keyword argument.
Definition: parser.h:912
pm_state_stack_t do_loop_stack
The stack used to determine if a do keyword belongs to the predicate of a while, until,...
Definition: parser.h:670
const uint8_t * next_start
This is a special field set on the parser when we need the parser to jump to a specific location when...
Definition: parser.h:707
pm_static_literals_t * current_hash_keys
The hash keys for the hash that is currently being parsed.
Definition: parser.h:749
pm_list_t magic_comment_list
The list of magic comments that have been found while parsing.
Definition: parser.h:721
int lambda_enclosure_nesting
Used to temporarily track the nesting of enclosures to determine if a { is the beginning of a lambda ...
Definition: parser.h:658
pm_lex_callback_t * lex_callback
This is an optional callback that can be attached to the parser that will be called whenever a new to...
Definition: parser.h:774
pm_options_version_t version
The version of prism that we should use to parse.
Definition: parser.h:856
pm_token_t previous
The previous token we were considering.
Definition: parser.h:697
struct pm_parser::@97 lex_modes
A stack of lex modes.
pm_string_t current_string
This string is used to pass information from the lexer to the parser.
Definition: parser.h:803
bool parsing_eval
Whether or not we are parsing an eval string.
Definition: parser.h:875
bool current_regular_expression_ascii_only
True if the current regular expression being lexed contains only ASCII characters.
Definition: parser.h:924
bool encoding_changed
Whether or not the encoding has been changed by a magic comment.
Definition: parser.h:903
pm_location_t data_loc
An optional location that represents the location of the END marker and the rest of the content of th...
Definition: parser.h:728
pm_context_node_t * current_context
The current parsing context.
Definition: parser.h:740
const uint8_t * start
The pointer to the start of the source.
Definition: parser.h:691
pm_state_stack_t accepts_block_stack
The stack used to determine if a do keyword belongs to the beginning of a block.
Definition: parser.h:676
int enclosure_nesting
Tracks the current nesting of (), [], and {}.
Definition: parser.h:652
pm_list_t error_list
The list of errors that have been found while parsing.
Definition: parser.h:734
int8_t frozen_string_literal
Whether or not we have found a frozen_string_literal magic comment with a true or false value.
Definition: parser.h:869
pm_node_list_t * current_block_exits
When parsing block exits (e.g., break, next, redo), we need to validate that they are in correct cont...
Definition: parser.h:853
const uint8_t * encoding_comment_start
This pointer indicates where a comment must start if it is to be considered an encoding comment.
Definition: parser.h:768
pm_token_t current
The current token we're considering.
Definition: parser.h:700
pm_lex_mode_t stack[PM_LEX_STACK_SIZE]
The stack of lexer modes.
Definition: parser.h:684
pm_list_t warning_list
The list of warnings that have been found while parsing.
Definition: parser.h:731
const uint8_t * heredoc_end
This field indicates the end of a heredoc whose identifier was found on the current line.
Definition: parser.h:715
int brace_nesting
Used to track the nesting of braces to ensure we get the correct value when we are interpolating bloc...
Definition: parser.h:664
pm_encoding_changed_callback_t encoding_changed_callback
When the encoding that is being used to parse the source is changed by prism, we provide the ability ...
Definition: parser.h:762
int32_t start_line
The line number at the start of the parse.
Definition: parser.h:809
bool encoding_locked
This is very specialized behavior for when you want to parse in a context that does not respect encod...
Definition: parser.h:896
pm_lex_mode_t * current
The current mode of the lexer.
Definition: parser.h:681
pm_list_t comment_list
The list of comments that have been found while parsing.
Definition: parser.h:718
size_t index
The current index into the lexer mode stack.
Definition: parser.h:687
pm_string_t filepath
This is the path of the file being parsed.
Definition: parser.h:780
pm_scope_t * current_scope
The current local scope.
Definition: parser.h:737
bool command_start
Whether or not we're at the beginning of a command.
Definition: parser.h:885
pm_newline_list_t newline_list
This is the list of newline offsets in the source file.
Definition: parser.h:789
bool semantic_token_seen
Whether or not the parser has seen a token that has semantic meaning (i.e., a token that is not a com...
Definition: parser.h:918
uint32_t node_id
The next node identifier that will be assigned.
Definition: parser.h:646
This struct represents a node in a linked list of scopes.
Definition: parser.h:580
struct pm_scope * previous
A pointer to the previous scope in the linked list.
Definition: parser.h:582
pm_node_list_t implicit_parameters
This is a list of the implicit parameters contained within the block.
Definition: parser.h:593
pm_shareable_constant_value_t shareable_constant
The current state of constant shareability for this scope.
Definition: parser.h:620
pm_locals_t locals
The IDs of the locals in the given scope.
Definition: parser.h:585
pm_scope_parameters_t parameters
This is a bitfield that indicates the parameters that are being used in this scope.
Definition: parser.h:614
bool closed
A boolean indicating whether or not this scope can see into its parent.
Definition: parser.h:626
Certain sets of nodes (hash keys and when clauses) check for duplicate nodes to alert the user of pot...
A generic string type that can have various ownership semantics.
Definition: pm_string.h:33
This struct represents a token in the Ruby source.
Definition: ast.h:530