Prism Ruby parser
Loading...
Searching...
No Matches
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"
15#include "prism/util/pm_list.h"
18
19#include <stdbool.h>
20
26typedef 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
46typedef 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
69typedef enum {
70 PM_HEREDOC_QUOTE_NONE,
71 PM_HEREDOC_QUOTE_SINGLE = '\'',
72 PM_HEREDOC_QUOTE_DOUBLE = '"',
73 PM_HEREDOC_QUOTE_BACKTICK = '`',
75
79typedef enum {
80 PM_HEREDOC_INDENT_NONE,
81 PM_HEREDOC_INDENT_DASH,
82 PM_HEREDOC_INDENT_TILDE,
84
101
109typedef struct pm_lex_mode {
111 enum {
114
120
126
129
135
141
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
256
262#define PM_LEX_STACK_SIZE 4
263
267typedef struct pm_parser pm_parser_t;
268
274typedef 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
440
449
451typedef enum {
452 PM_COMMENT_INLINE,
453 PM_COMMENT_EMBDOC
455
471
488
494
503typedef struct {
509 void *data;
510
515 void (*callback)(void *data, pm_parser_t *parser, pm_token_t *token);
517
520static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_NONE = 0x0;
521static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_LITERAL = PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL;
522static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_EVERYTHING = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_EVERYTHING;
523static const pm_shareable_constant_value_t PM_SCOPE_SHAREABLE_CONSTANT_EXPERIMENTAL_COPY = PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY;
524
529typedef struct {
532
535
537 uint32_t index;
538
540 uint32_t reads;
541
543 uint32_t hash;
544} pm_local_t;
545
551typedef struct pm_locals {
553 uint32_t size;
554
556 uint32_t capacity;
557
561
563typedef uint8_t pm_scope_parameters_t;
564static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NONE = 0x0;
565static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_POSITIONALS = 0x1;
566static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_KEYWORDS = 0x2;
567static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_BLOCK = 0x4;
568static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_FORWARDING_ALL = 0x8;
569static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_IMPLICIT_DISALLOWED = 0x10;
570static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_INNER = 0x20;
571static const pm_scope_parameters_t PM_SCOPE_PARAMETERS_NUMBERED_FOUND = 0x40;
572
625
629typedef uint32_t pm_state_stack_t;
630
637struct pm_parser {
643 uint32_t node_id;
644
647
650
656
662
668
674
676 struct {
679
682
684 size_t index;
686
688 const uint8_t *start;
689
691 const uint8_t *end;
692
695
698
704 const uint8_t *next_start;
705
712 const uint8_t *heredoc_end;
713
716
719
726
729
732
735
738
747
753
760
766
772
778
784
787
795
801
806 int32_t start_line;
807
838
851
854
857
867
873
880
883
886
894
901
907
910
916
922
928};
929
930#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:8089
@ PM_SHAREABLE_CONSTANT_NODE_FLAGS_LITERAL
constant writes that should be modified with shareable constant value literal
Definition ast.h:8086
@ PM_SHAREABLE_CONSTANT_NODE_FLAGS_EXPERIMENTAL_COPY
constant writes that should be modified with shareable constant value experimental copy
Definition ast.h:8092
uint16_t pm_node_flags_t
These are the flags embedded in the node struct.
Definition ast.h:1043
Macro definitions used throughout the prism library.
The encoding interface and implementations used by the parser.
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:84
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:629
#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:493
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:324
@ PM_CONTEXT_ELSIF
an elsif clause
Definition parser.h:351
@ PM_CONTEXT_DEF_RESCUE
a rescue statement within a method definition
Definition parser.h:336
@ PM_CONTEXT_ELSE
an else clause
Definition parser.h:348
@ PM_CONTEXT_FOR_INDEX
a for loop's index
Definition parser.h:360
@ PM_CONTEXT_CASE_WHEN
a case when statements
Definition parser.h:309
@ PM_CONTEXT_BLOCK_RESCUE
a rescue statement within a do..end block
Definition parser.h:306
@ PM_CONTEXT_MODULE
a module declaration
Definition parser.h:387
@ PM_CONTEXT_DEF_PARAMS
a method definition's parameters
Definition parser.h:339
@ PM_CONTEXT_CASE_IN
a case in statements
Definition parser.h:312
@ 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:381
@ PM_CONTEXT_SCLASS
a singleton class definition
Definition parser.h:417
@ PM_CONTEXT_UNLESS
an unless statement
Definition parser.h:432
@ PM_CONTEXT_POSTEXE
an END block
Definition parser.h:405
@ PM_CONTEXT_IF
an if statement
Definition parser.h:363
@ PM_CONTEXT_MULTI_TARGET
a multiple target expression
Definition parser.h:399
@ PM_CONTEXT_LAMBDA_RESCUE
a rescue statement within a lambda expression
Definition parser.h:378
@ 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:321
@ PM_CONTEXT_LAMBDA_ENSURE
an ensure statement within a lambda expression
Definition parser.h:372
@ 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:318
@ PM_CONTEXT_LAMBDA_BRACES
a lambda expression with braces
Definition parser.h:366
@ PM_CONTEXT_MODULE_ELSE
a rescue else statement within a module statement
Definition parser.h:393
@ PM_CONTEXT_PARENS
a parenthesized expression
Definition parser.h:402
@ PM_CONTEXT_BLOCK_BRACES
expressions in block arguments using braces
Definition parser.h:291
@ PM_CONTEXT_BLOCK_PARAMETERS
expressions in block parameters foo do |...| end
Definition parser.h:303
@ PM_CONTEXT_DEF_ENSURE
an ensure statement within a method definition
Definition parser.h:330
@ PM_CONTEXT_SCLASS_RESCUE
a rescue statement with a singleton class
Definition parser.h:426
@ PM_CONTEXT_PREEXE
a BEGIN block
Definition parser.h:411
@ PM_CONTEXT_DEFINED
a defined? expression
Definition parser.h:342
@ PM_CONTEXT_MODULE_ENSURE
an ensure statement within a module statement
Definition parser.h:390
@ PM_CONTEXT_BEGIN_RESCUE
a rescue statement with an explicit begin
Definition parser.h:288
@ PM_CONTEXT_UNTIL
an until statement
Definition parser.h:435
@ PM_CONTEXT_DEF_ELSE
a rescue else statement within a method definition
Definition parser.h:333
@ PM_CONTEXT_FOR
a for loop
Definition parser.h:357
@ PM_CONTEXT_PREDICATE
a predicate inside an if/elsif/unless statement
Definition parser.h:408
@ 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:420
@ PM_CONTEXT_DEFAULT_PARAMS
a method definition's default parameter
Definition parser.h:345
@ PM_CONTEXT_LAMBDA_ELSE
a rescue else statement within a lambda expression
Definition parser.h:375
@ PM_CONTEXT_CLASS
a class declaration
Definition parser.h:315
@ PM_CONTEXT_MAIN
the top level context
Definition parser.h:384
@ PM_CONTEXT_LAMBDA_DO_END
a lambda expression with do..end
Definition parser.h:369
@ PM_CONTEXT_BEGIN
a begin statement
Definition parser.h:279
@ PM_CONTEXT_RESCUE_MODIFIER
a modifier rescue clause
Definition parser.h:414
@ PM_CONTEXT_EMBEXPR
an interpolated expression
Definition parser.h:354
@ PM_CONTEXT_TERNARY
a ternary expression
Definition parser.h:429
@ PM_CONTEXT_DEF
a method definition
Definition parser.h:327
@ PM_CONTEXT_SCLASS_ELSE
a rescue else statement with a singleton class
Definition parser.h:423
@ PM_CONTEXT_MODULE_RESCUE
a rescue statement within a module statement
Definition parser.h:396
@ PM_CONTEXT_BLOCK_KEYWORDS
expressions in block arguments using do..end
Definition parser.h:294
@ PM_CONTEXT_WHILE
a while statement
Definition parser.h:438
uint8_t pm_scope_parameters_t
The flags about scope parameters that can be set.
Definition parser.h:563
uint8_t pm_shareable_constant_value_t
The type of shareable constant value that can be set.
Definition parser.h:519
pm_comment_type_t
This is the type of a comment that we've found while parsing.
Definition parser.h:451
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.
Definition pm_constant_pool.h:31
A list of byte offsets of newlines in a string.
An abstract linked list.
A generic string type that can have various ownership semantics.
A set of static literal nodes that can be checked for duplicates.
This is a node in the linked list of comments that we've found while parsing.
Definition parser.h:461
pm_list_node_t node
The embedded base node.
Definition parser.h:463
pm_comment_type_t type
The type of comment that we've found.
Definition parser.h:469
pm_location_t location
The location of the comment in the source.
Definition parser.h:466
The overall constant pool, which stores constants found while parsing.
Definition pm_constant_pool.h:134
This is a node in a linked list of contexts.
Definition parser.h:442
pm_context_t context
The context that this node represents.
Definition parser.h:444
struct pm_context_node * prev
A pointer to the previous context in the linked list.
Definition parser.h:447
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:503
void * data
This opaque pointer is used to provide whatever information the user deemed necessary to the callback...
Definition parser.h:509
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
@ 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
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
union pm_lex_mode::@1 as
The data associated with this type of lex mode.
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
enum pm_lex_mode::@0 mode
The type of this lex mode.
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_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
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
A list of offsets of the start of lines in a string.
Definition pm_line_offset_list.h:28
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:529
pm_constant_id_t name
The name of the local variable.
Definition parser.h:531
pm_location_t location
The location of the local variable in the source.
Definition parser.h:534
uint32_t hash
The hash of the local variable.
Definition parser.h:543
uint32_t index
The index of the local variable in the local table.
Definition parser.h:537
uint32_t reads
The number of times the local variable is read.
Definition parser.h:540
This is a set of local variables in a certain lexical context (method, class, module,...
Definition parser.h:551
pm_local_t * locals
The nullable allocated memory for the local variables in the set.
Definition parser.h:559
uint32_t capacity
The capacity of the local variables set.
Definition parser.h:556
uint32_t size
The number of local variables in the set.
Definition parser.h:553
This struct represents a slice in the source code, defined by an offset and a length.
Definition ast.h:545
This is a node in the linked list of magic comments that we've found while parsing.
Definition parser.h:478
pm_list_node_t node
The embedded base node.
Definition parser.h:480
pm_location_t value
The value of the magic comment.
Definition parser.h:486
pm_location_t key
The key of the magic comment.
Definition parser.h:483
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:637
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:837
pm_lex_state_t lex_state
The current state of the lexer.
Definition parser.h:646
uint8_t command_line
The command line flags given from the options.
Definition parser.h:856
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:752
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:879
bool pattern_matching_newlines
This flag indicates that we are currently parsing a pattern matching expression and impacts that calc...
Definition parser.h:906
const uint8_t * end
The pointer to the end of the source.
Definition parser.h:691
bool recovering
Whether or not we're currently recovering from a syntax error.
Definition parser.h:885
pm_node_flags_t integer_base
We want to add a flag to integer nodes that indicates their base.
Definition parser.h:794
bool warn_mismatched_indentation
By default, Ruby always warns about mismatched indentation.
Definition parser.h:927
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:783
bool in_keyword_arg
This flag indicates that we are currently parsing a keyword argument.
Definition parser.h:909
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:667
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:704
pm_static_literals_t * current_hash_keys
The hash keys for the hash that is currently being parsed.
Definition parser.h:746
pm_list_t magic_comment_list
The list of magic comments that have been found while parsing.
Definition parser.h:718
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:655
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:771
pm_options_version_t version
The version of prism that we should use to parse.
Definition parser.h:853
pm_token_t previous
The previous token we were considering.
Definition parser.h:694
pm_string_t current_string
This string is used to pass information from the lexer to the parser.
Definition parser.h:800
bool parsing_eval
Whether or not we are parsing an eval string.
Definition parser.h:872
bool current_regular_expression_ascii_only
True if the current regular expression being lexed contains only ASCII characters.
Definition parser.h:921
bool encoding_changed
Whether or not the encoding has been changed by a magic comment.
Definition parser.h:900
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:725
pm_context_node_t * current_context
The current parsing context.
Definition parser.h:737
const uint8_t * start
The pointer to the start of the source.
Definition parser.h:688
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:673
int enclosure_nesting
Tracks the current nesting of (), [], and {}.
Definition parser.h:649
pm_line_offset_list_t line_offsets
This is the list of line offsets in the source file.
Definition parser.h:786
pm_list_t error_list
The list of errors that have been found while parsing.
Definition parser.h:731
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:866
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:850
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:765
pm_token_t current
The current token we're considering.
Definition parser.h:697
pm_lex_mode_t stack[PM_LEX_STACK_SIZE]
The stack of lexer modes.
Definition parser.h:681
pm_list_t warning_list
The list of warnings that have been found while parsing.
Definition parser.h:728
const uint8_t * heredoc_end
This field indicates the end of a heredoc whose identifier was found on the current line.
Definition parser.h:712
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:661
struct pm_parser::@6 lex_modes
A stack of lex modes.
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:759
int32_t start_line
The line number at the start of the parse.
Definition parser.h:806
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:893
pm_lex_mode_t * current
The current mode of the lexer.
Definition parser.h:678
pm_list_t comment_list
The list of comments that have been found while parsing.
Definition parser.h:715
size_t index
The current index into the lexer mode stack.
Definition parser.h:684
pm_string_t filepath
This is the path of the file being parsed.
Definition parser.h:777
pm_scope_t * current_scope
The current local scope.
Definition parser.h:734
bool command_start
Whether or not we're at the beginning of a command.
Definition parser.h:882
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:915
uint32_t node_id
The next node identifier that will be assigned.
Definition parser.h:643
This struct represents a node in a linked list of scopes.
Definition parser.h:577
struct pm_scope * previous
A pointer to the previous scope in the linked list.
Definition parser.h:579
pm_node_list_t implicit_parameters
This is a list of the implicit parameters contained within the block.
Definition parser.h:590
pm_shareable_constant_value_t shareable_constant
The current state of constant shareability for this scope.
Definition parser.h:617
pm_locals_t locals
The IDs of the locals in the given scope.
Definition parser.h:582
pm_scope_parameters_t parameters
This is a bitfield that indicates the parameters that are being used in this scope.
Definition parser.h:611
bool closed
A boolean indicating whether or not this scope can see into its parent.
Definition parser.h:623
Certain sets of nodes (hash keys and when clauses) check for duplicate nodes to alert the user of pot...
Definition static_literals.h:38
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:526