prism 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +172 -0
- data/CODE_OF_CONDUCT.md +76 -0
- data/CONTRIBUTING.md +62 -0
- data/LICENSE.md +7 -0
- data/Makefile +84 -0
- data/README.md +89 -0
- data/config.yml +2481 -0
- data/docs/build_system.md +74 -0
- data/docs/building.md +22 -0
- data/docs/configuration.md +60 -0
- data/docs/design.md +53 -0
- data/docs/encoding.md +117 -0
- data/docs/fuzzing.md +93 -0
- data/docs/heredocs.md +36 -0
- data/docs/mapping.md +117 -0
- data/docs/ripper.md +36 -0
- data/docs/ruby_api.md +25 -0
- data/docs/serialization.md +181 -0
- data/docs/testing.md +55 -0
- data/ext/prism/api_node.c +4725 -0
- data/ext/prism/api_pack.c +256 -0
- data/ext/prism/extconf.rb +136 -0
- data/ext/prism/extension.c +626 -0
- data/ext/prism/extension.h +18 -0
- data/include/prism/ast.h +1932 -0
- data/include/prism/defines.h +45 -0
- data/include/prism/diagnostic.h +231 -0
- data/include/prism/enc/pm_encoding.h +95 -0
- data/include/prism/node.h +41 -0
- data/include/prism/pack.h +141 -0
- data/include/prism/parser.h +418 -0
- data/include/prism/regexp.h +19 -0
- data/include/prism/unescape.h +48 -0
- data/include/prism/util/pm_buffer.h +51 -0
- data/include/prism/util/pm_char.h +91 -0
- data/include/prism/util/pm_constant_pool.h +78 -0
- data/include/prism/util/pm_list.h +67 -0
- data/include/prism/util/pm_memchr.h +14 -0
- data/include/prism/util/pm_newline_list.h +61 -0
- data/include/prism/util/pm_state_stack.h +24 -0
- data/include/prism/util/pm_string.h +61 -0
- data/include/prism/util/pm_string_list.h +25 -0
- data/include/prism/util/pm_strpbrk.h +29 -0
- data/include/prism/version.h +4 -0
- data/include/prism.h +82 -0
- data/lib/prism/compiler.rb +465 -0
- data/lib/prism/debug.rb +157 -0
- data/lib/prism/desugar_compiler.rb +206 -0
- data/lib/prism/dispatcher.rb +2051 -0
- data/lib/prism/dsl.rb +750 -0
- data/lib/prism/ffi.rb +251 -0
- data/lib/prism/lex_compat.rb +838 -0
- data/lib/prism/mutation_compiler.rb +718 -0
- data/lib/prism/node.rb +14540 -0
- data/lib/prism/node_ext.rb +55 -0
- data/lib/prism/node_inspector.rb +68 -0
- data/lib/prism/pack.rb +185 -0
- data/lib/prism/parse_result/comments.rb +172 -0
- data/lib/prism/parse_result/newlines.rb +60 -0
- data/lib/prism/parse_result.rb +266 -0
- data/lib/prism/pattern.rb +239 -0
- data/lib/prism/ripper_compat.rb +174 -0
- data/lib/prism/serialize.rb +662 -0
- data/lib/prism/visitor.rb +470 -0
- data/lib/prism.rb +64 -0
- data/prism.gemspec +113 -0
- data/src/diagnostic.c +287 -0
- data/src/enc/pm_big5.c +52 -0
- data/src/enc/pm_euc_jp.c +58 -0
- data/src/enc/pm_gbk.c +61 -0
- data/src/enc/pm_shift_jis.c +56 -0
- data/src/enc/pm_tables.c +507 -0
- data/src/enc/pm_unicode.c +2324 -0
- data/src/enc/pm_windows_31j.c +56 -0
- data/src/node.c +2633 -0
- data/src/pack.c +493 -0
- data/src/prettyprint.c +2136 -0
- data/src/prism.c +14587 -0
- data/src/regexp.c +580 -0
- data/src/serialize.c +1899 -0
- data/src/token_type.c +349 -0
- data/src/unescape.c +637 -0
- data/src/util/pm_buffer.c +103 -0
- data/src/util/pm_char.c +272 -0
- data/src/util/pm_constant_pool.c +252 -0
- data/src/util/pm_list.c +41 -0
- data/src/util/pm_memchr.c +33 -0
- data/src/util/pm_newline_list.c +134 -0
- data/src/util/pm_state_stack.c +19 -0
- data/src/util/pm_string.c +200 -0
- data/src/util/pm_string_list.c +29 -0
- data/src/util/pm_strncasecmp.c +17 -0
- data/src/util/pm_strpbrk.c +66 -0
- metadata +138 -0
@@ -0,0 +1,78 @@
|
|
1
|
+
// The constant pool is a data structure that stores a set of strings. Each
|
2
|
+
// string is assigned a unique id, which can be used to compare strings for
|
3
|
+
// equality. This comparison ends up being much faster than strcmp, since it
|
4
|
+
// only requires a single integer comparison.
|
5
|
+
|
6
|
+
#ifndef PRISM_CONSTANT_POOL_H
|
7
|
+
#define PRISM_CONSTANT_POOL_H
|
8
|
+
|
9
|
+
#include "prism/defines.h"
|
10
|
+
|
11
|
+
#include <assert.h>
|
12
|
+
#include <stdbool.h>
|
13
|
+
#include <stdint.h>
|
14
|
+
#include <stdlib.h>
|
15
|
+
#include <string.h>
|
16
|
+
|
17
|
+
typedef uint32_t pm_constant_id_t;
|
18
|
+
|
19
|
+
typedef struct {
|
20
|
+
pm_constant_id_t *ids;
|
21
|
+
size_t size;
|
22
|
+
size_t capacity;
|
23
|
+
} pm_constant_id_list_t;
|
24
|
+
|
25
|
+
// Initialize a list of constant ids.
|
26
|
+
void pm_constant_id_list_init(pm_constant_id_list_t *list);
|
27
|
+
|
28
|
+
// Append a constant id to a list of constant ids. Returns false if any
|
29
|
+
// potential reallocations fail.
|
30
|
+
bool pm_constant_id_list_append(pm_constant_id_list_t *list, pm_constant_id_t id);
|
31
|
+
|
32
|
+
// Checks if the current constant id list includes the given constant id.
|
33
|
+
bool
|
34
|
+
pm_constant_id_list_includes(pm_constant_id_list_t *list, pm_constant_id_t id);
|
35
|
+
|
36
|
+
// Get the memory size of a list of constant ids.
|
37
|
+
size_t pm_constant_id_list_memsize(pm_constant_id_list_t *list);
|
38
|
+
|
39
|
+
// Free the memory associated with a list of constant ids.
|
40
|
+
void pm_constant_id_list_free(pm_constant_id_list_t *list);
|
41
|
+
|
42
|
+
typedef struct {
|
43
|
+
unsigned int id: 31;
|
44
|
+
bool owned: 1;
|
45
|
+
uint32_t hash;
|
46
|
+
} pm_constant_pool_bucket_t;
|
47
|
+
|
48
|
+
typedef struct {
|
49
|
+
const uint8_t *start;
|
50
|
+
size_t length;
|
51
|
+
} pm_constant_t;
|
52
|
+
|
53
|
+
typedef struct {
|
54
|
+
pm_constant_pool_bucket_t *buckets;
|
55
|
+
pm_constant_t *constants;
|
56
|
+
uint32_t size;
|
57
|
+
uint32_t capacity;
|
58
|
+
} pm_constant_pool_t;
|
59
|
+
|
60
|
+
// Define an empty constant pool.
|
61
|
+
#define PM_CONSTANT_POOL_EMPTY ((pm_constant_pool_t) { .buckets = NULL, .constants = NULL, .size = 0, .capacity = 0 })
|
62
|
+
|
63
|
+
// Initialize a new constant pool with a given capacity.
|
64
|
+
bool pm_constant_pool_init(pm_constant_pool_t *pool, uint32_t capacity);
|
65
|
+
|
66
|
+
// Insert a constant into a constant pool that is a slice of a source string.
|
67
|
+
// Returns the id of the constant, or 0 if any potential calls to resize fail.
|
68
|
+
pm_constant_id_t pm_constant_pool_insert_shared(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
|
69
|
+
|
70
|
+
// Insert a constant into a constant pool from memory that is now owned by the
|
71
|
+
// constant pool. Returns the id of the constant, or 0 if any potential calls to
|
72
|
+
// resize fail.
|
73
|
+
pm_constant_id_t pm_constant_pool_insert_owned(pm_constant_pool_t *pool, const uint8_t *start, size_t length);
|
74
|
+
|
75
|
+
// Free the memory associated with a constant pool.
|
76
|
+
void pm_constant_pool_free(pm_constant_pool_t *pool);
|
77
|
+
|
78
|
+
#endif
|
@@ -0,0 +1,67 @@
|
|
1
|
+
// This struct represents an abstract linked list that provides common
|
2
|
+
// functionality. It is meant to be used any time a linked list is necessary to
|
3
|
+
// store data.
|
4
|
+
//
|
5
|
+
// The linked list itself operates off a set of pointers. Because the pointers
|
6
|
+
// are not necessarily sequential, they can be of any size. We use this fact to
|
7
|
+
// allow the consumer of this linked list to extend the node struct to include
|
8
|
+
// any data they want. This is done by using the pm_list_node_t as the first
|
9
|
+
// member of the struct.
|
10
|
+
//
|
11
|
+
// For example, if we want to store a list of integers, we can do the following:
|
12
|
+
//
|
13
|
+
// typedef struct {
|
14
|
+
// pm_list_node_t node;
|
15
|
+
// int value;
|
16
|
+
// } pm_int_node_t;
|
17
|
+
//
|
18
|
+
// pm_list_t list = PM_LIST_EMPTY;
|
19
|
+
// pm_int_node_t *node = malloc(sizeof(pm_int_node_t));
|
20
|
+
// node->value = 5;
|
21
|
+
//
|
22
|
+
// pm_list_append(&list, &node->node);
|
23
|
+
//
|
24
|
+
// The pm_list_t struct is used to represent the overall linked list. It
|
25
|
+
// contains a pointer to the head and tail of the list. This allows for easy
|
26
|
+
// iteration and appending of new nodes.
|
27
|
+
|
28
|
+
#ifndef PRISM_LIST_H
|
29
|
+
#define PRISM_LIST_H
|
30
|
+
|
31
|
+
#include "prism/defines.h"
|
32
|
+
|
33
|
+
#include <stdbool.h>
|
34
|
+
#include <stddef.h>
|
35
|
+
#include <stdint.h>
|
36
|
+
#include <stdlib.h>
|
37
|
+
|
38
|
+
// This represents a node in the linked list.
|
39
|
+
typedef struct pm_list_node {
|
40
|
+
struct pm_list_node *next;
|
41
|
+
} pm_list_node_t;
|
42
|
+
|
43
|
+
// This represents the overall linked list. It keeps a pointer to the head and
|
44
|
+
// tail so that iteration is easy and pushing new nodes is easy.
|
45
|
+
typedef struct {
|
46
|
+
size_t size;
|
47
|
+
pm_list_node_t *head;
|
48
|
+
pm_list_node_t *tail;
|
49
|
+
} pm_list_t;
|
50
|
+
|
51
|
+
// This represents an empty list. It's used to initialize a stack-allocated list
|
52
|
+
// as opposed to a method call.
|
53
|
+
#define PM_LIST_EMPTY ((pm_list_t) { .size = 0, .head = NULL, .tail = NULL })
|
54
|
+
|
55
|
+
// Returns true if the given list is empty.
|
56
|
+
PRISM_EXPORTED_FUNCTION bool pm_list_empty_p(pm_list_t *list);
|
57
|
+
|
58
|
+
// Returns the size of the list.
|
59
|
+
PRISM_EXPORTED_FUNCTION size_t pm_list_size(pm_list_t *list);
|
60
|
+
|
61
|
+
// Append a node to the given list.
|
62
|
+
void pm_list_append(pm_list_t *list, pm_list_node_t *node);
|
63
|
+
|
64
|
+
// Deallocate the internal state of the given list.
|
65
|
+
PRISM_EXPORTED_FUNCTION void pm_list_free(pm_list_t *list);
|
66
|
+
|
67
|
+
#endif
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#ifndef PRISM_MEMCHR_H
|
2
|
+
#define PRISM_MEMCHR_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
#include "prism/enc/pm_encoding.h"
|
6
|
+
|
7
|
+
#include <stddef.h>
|
8
|
+
|
9
|
+
// We need to roll our own memchr to handle cases where the encoding changes and
|
10
|
+
// we need to search for a character in a buffer that could be the trailing byte
|
11
|
+
// of a multibyte character.
|
12
|
+
void * pm_memchr(const void *source, int character, size_t number, bool encoding_changed, pm_encoding_t *encoding);
|
13
|
+
|
14
|
+
#endif
|
@@ -0,0 +1,61 @@
|
|
1
|
+
// When compiling the syntax tree, it's necessary to know the line and column
|
2
|
+
// of many nodes. This is necessary to support things like error messages,
|
3
|
+
// tracepoints, etc.
|
4
|
+
//
|
5
|
+
// It's possible that we could store the start line, start column, end line, and
|
6
|
+
// end column on every node in addition to the offsets that we already store,
|
7
|
+
// but that would be quite a lot of memory overhead.
|
8
|
+
|
9
|
+
#ifndef PRISM_NEWLINE_LIST_H
|
10
|
+
#define PRISM_NEWLINE_LIST_H
|
11
|
+
|
12
|
+
#include "prism/defines.h"
|
13
|
+
|
14
|
+
#include <assert.h>
|
15
|
+
#include <stdbool.h>
|
16
|
+
#include <stddef.h>
|
17
|
+
#include <stdlib.h>
|
18
|
+
|
19
|
+
// A list of offsets of newlines in a string. The offsets are assumed to be
|
20
|
+
// sorted/inserted in ascending order.
|
21
|
+
typedef struct {
|
22
|
+
const uint8_t *start;
|
23
|
+
|
24
|
+
size_t *offsets;
|
25
|
+
size_t size;
|
26
|
+
size_t capacity;
|
27
|
+
|
28
|
+
size_t last_offset;
|
29
|
+
size_t last_index;
|
30
|
+
} pm_newline_list_t;
|
31
|
+
|
32
|
+
// A line and column in a string.
|
33
|
+
typedef struct {
|
34
|
+
size_t line;
|
35
|
+
size_t column;
|
36
|
+
} pm_line_column_t;
|
37
|
+
|
38
|
+
#define PM_NEWLINE_LIST_EMPTY ((pm_newline_list_t) { \
|
39
|
+
.start = NULL, .offsets = NULL, .size = 0, .capacity = 0, .last_offset = 0, .last_index = 0 \
|
40
|
+
})
|
41
|
+
|
42
|
+
// Initialize a new newline list with the given capacity. Returns true if the
|
43
|
+
// allocation of the offsets succeeds, otherwise returns false.
|
44
|
+
bool pm_newline_list_init(pm_newline_list_t *list, const uint8_t *start, size_t capacity);
|
45
|
+
|
46
|
+
// Append a new offset to the newline list. Returns true if the reallocation of
|
47
|
+
// the offsets succeeds (if one was necessary), otherwise returns false.
|
48
|
+
bool pm_newline_list_append(pm_newline_list_t *list, const uint8_t *cursor);
|
49
|
+
|
50
|
+
// Conditionally append a new offset to the newline list, if the value passed in is a newline.
|
51
|
+
bool pm_newline_list_check_append(pm_newline_list_t *list, const uint8_t *cursor);
|
52
|
+
|
53
|
+
// Returns the line and column of the given offset. If the offset is not in the
|
54
|
+
// list, the line and column of the closest offset less than the given offset
|
55
|
+
// are returned.
|
56
|
+
pm_line_column_t pm_newline_list_line_column(pm_newline_list_t *list, const uint8_t *cursor);
|
57
|
+
|
58
|
+
// Free the internal memory allocated for the newline list.
|
59
|
+
void pm_newline_list_free(pm_newline_list_t *list);
|
60
|
+
|
61
|
+
#endif
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#ifndef PRISM_STATE_STACK_H
|
2
|
+
#define PRISM_STATE_STACK_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
|
6
|
+
#include <stdbool.h>
|
7
|
+
#include <stdint.h>
|
8
|
+
|
9
|
+
// A struct that represents a stack of bools.
|
10
|
+
typedef uint32_t pm_state_stack_t;
|
11
|
+
|
12
|
+
// Initializes the state stack to an empty stack.
|
13
|
+
#define PM_STATE_STACK_EMPTY ((pm_state_stack_t) 0)
|
14
|
+
|
15
|
+
// Pushes a value onto the stack.
|
16
|
+
void pm_state_stack_push(pm_state_stack_t *stack, bool value);
|
17
|
+
|
18
|
+
// Pops a value off the stack.
|
19
|
+
void pm_state_stack_pop(pm_state_stack_t *stack);
|
20
|
+
|
21
|
+
// Returns the value at the top of the stack.
|
22
|
+
bool pm_state_stack_p(pm_state_stack_t *stack);
|
23
|
+
|
24
|
+
#endif
|
@@ -0,0 +1,61 @@
|
|
1
|
+
#ifndef PRISM_STRING_H
|
2
|
+
#define PRISM_STRING_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
|
6
|
+
#include <assert.h>
|
7
|
+
#include <stdbool.h>
|
8
|
+
#include <stddef.h>
|
9
|
+
#include <stdlib.h>
|
10
|
+
#include <string.h>
|
11
|
+
|
12
|
+
// This struct represents a string value.
|
13
|
+
typedef struct {
|
14
|
+
enum { PM_STRING_SHARED, PM_STRING_OWNED, PM_STRING_CONSTANT, PM_STRING_MAPPED } type;
|
15
|
+
const uint8_t *source;
|
16
|
+
size_t length;
|
17
|
+
} pm_string_t;
|
18
|
+
|
19
|
+
#define PM_EMPTY_STRING ((pm_string_t) { .type = PM_STRING_CONSTANT, .source = NULL, .length = 0 })
|
20
|
+
|
21
|
+
// Initialize a shared string that is based on initial input.
|
22
|
+
void pm_string_shared_init(pm_string_t *string, const uint8_t *start, const uint8_t *end);
|
23
|
+
|
24
|
+
// Initialize an owned string that is responsible for freeing allocated memory.
|
25
|
+
void pm_string_owned_init(pm_string_t *string, uint8_t *source, size_t length);
|
26
|
+
|
27
|
+
// Initialize a constant string that doesn't own its memory source.
|
28
|
+
void pm_string_constant_init(pm_string_t *string, const char *source, size_t length);
|
29
|
+
|
30
|
+
// Read the file indicated by the filepath parameter into source and load its
|
31
|
+
// contents and size into the given pm_string_t.
|
32
|
+
// The given pm_string_t should be freed using pm_string_free() when it is no longer used.
|
33
|
+
//
|
34
|
+
// We want to use demand paging as much as possible in order to avoid having to
|
35
|
+
// read the entire file into memory (which could be detrimental to performance
|
36
|
+
// for large files). This means that if we're on windows we'll use
|
37
|
+
// `MapViewOfFile`, on POSIX systems that have access to `mmap` we'll use
|
38
|
+
// `mmap`, and on other POSIX systems we'll use `read`.
|
39
|
+
PRISM_EXPORTED_FUNCTION bool pm_string_mapped_init(pm_string_t *string, const char *filepath);
|
40
|
+
|
41
|
+
// Returns the memory size associated with the string.
|
42
|
+
size_t pm_string_memsize(const pm_string_t *string);
|
43
|
+
|
44
|
+
// Ensure the string is owned. If it is not, then reinitialize it as owned and
|
45
|
+
// copy over the previous source.
|
46
|
+
void pm_string_ensure_owned(pm_string_t *string);
|
47
|
+
|
48
|
+
// Returns the length associated with the string.
|
49
|
+
PRISM_EXPORTED_FUNCTION size_t pm_string_length(const pm_string_t *string);
|
50
|
+
|
51
|
+
// Returns the start pointer associated with the string.
|
52
|
+
PRISM_EXPORTED_FUNCTION const uint8_t * pm_string_source(const pm_string_t *string);
|
53
|
+
|
54
|
+
// Free the associated memory of the given string.
|
55
|
+
PRISM_EXPORTED_FUNCTION void pm_string_free(pm_string_t *string);
|
56
|
+
|
57
|
+
// Returns the size of the pm_string_t struct. This is necessary to allocate the
|
58
|
+
// correct amount of memory in the FFI backend.
|
59
|
+
PRISM_EXPORTED_FUNCTION size_t pm_string_sizeof(void);
|
60
|
+
|
61
|
+
#endif // PRISM_STRING_H
|
@@ -0,0 +1,25 @@
|
|
1
|
+
#ifndef PRISM_STRING_LIST_H
|
2
|
+
#define PRISM_STRING_LIST_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
#include "prism/util/pm_string.h"
|
6
|
+
|
7
|
+
#include <stddef.h>
|
8
|
+
#include <stdlib.h>
|
9
|
+
|
10
|
+
typedef struct {
|
11
|
+
pm_string_t *strings;
|
12
|
+
size_t length;
|
13
|
+
size_t capacity;
|
14
|
+
} pm_string_list_t;
|
15
|
+
|
16
|
+
// Initialize a pm_string_list_t with its default values.
|
17
|
+
PRISM_EXPORTED_FUNCTION void pm_string_list_init(pm_string_list_t *string_list);
|
18
|
+
|
19
|
+
// Append a pm_string_t to the given string list.
|
20
|
+
void pm_string_list_append(pm_string_list_t *string_list, pm_string_t *string);
|
21
|
+
|
22
|
+
// Free the memory associated with the string list.
|
23
|
+
PRISM_EXPORTED_FUNCTION void pm_string_list_free(pm_string_list_t *string_list);
|
24
|
+
|
25
|
+
#endif
|
@@ -0,0 +1,29 @@
|
|
1
|
+
#ifndef PRISM_STRPBRK_H
|
2
|
+
#define PRISM_STRPBRK_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
#include "prism/parser.h"
|
6
|
+
|
7
|
+
#include <stddef.h>
|
8
|
+
#include <string.h>
|
9
|
+
|
10
|
+
// Here we have rolled our own version of strpbrk. The standard library strpbrk
|
11
|
+
// has undefined behavior when the source string is not null-terminated. We want
|
12
|
+
// to support strings that are not null-terminated because pm_parse does not
|
13
|
+
// have the contract that the string is null-terminated. (This is desirable
|
14
|
+
// because it means the extension can call pm_parse with the result of a call to
|
15
|
+
// mmap).
|
16
|
+
//
|
17
|
+
// The standard library strpbrk also does not support passing a maximum length
|
18
|
+
// to search. We want to support this for the reason mentioned above, but we
|
19
|
+
// also don't want it to stop on null bytes. Ruby actually allows null bytes
|
20
|
+
// within strings, comments, regular expressions, etc. So we need to be able to
|
21
|
+
// skip past them.
|
22
|
+
//
|
23
|
+
// Finally, we want to support encodings wherein the charset could contain
|
24
|
+
// characters that are trailing bytes of multi-byte characters. For example, in
|
25
|
+
// Shift-JIS, the backslash character can be a trailing byte. In that case we
|
26
|
+
// need to take a slower path and iterate one multi-byte character at a time.
|
27
|
+
const uint8_t * pm_strpbrk(pm_parser_t *parser, const uint8_t *source, const uint8_t *charset, ptrdiff_t length);
|
28
|
+
|
29
|
+
#endif
|
data/include/prism.h
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
#ifndef PRISM_H
|
2
|
+
#define PRISM_H
|
3
|
+
|
4
|
+
#include "prism/defines.h"
|
5
|
+
#include "prism/ast.h"
|
6
|
+
#include "prism/diagnostic.h"
|
7
|
+
#include "prism/node.h"
|
8
|
+
#include "prism/pack.h"
|
9
|
+
#include "prism/parser.h"
|
10
|
+
#include "prism/regexp.h"
|
11
|
+
#include "prism/unescape.h"
|
12
|
+
#include "prism/util/pm_buffer.h"
|
13
|
+
#include "prism/util/pm_char.h"
|
14
|
+
#include "prism/util/pm_memchr.h"
|
15
|
+
#include "prism/util/pm_strpbrk.h"
|
16
|
+
#include "prism/version.h"
|
17
|
+
|
18
|
+
#include <assert.h>
|
19
|
+
#include <errno.h>
|
20
|
+
#include <stdarg.h>
|
21
|
+
#include <stdbool.h>
|
22
|
+
#include <stdint.h>
|
23
|
+
#include <stdio.h>
|
24
|
+
#include <stdlib.h>
|
25
|
+
#include <string.h>
|
26
|
+
|
27
|
+
#ifndef _WIN32
|
28
|
+
#include <strings.h>
|
29
|
+
#endif
|
30
|
+
|
31
|
+
void pm_serialize_content(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
32
|
+
|
33
|
+
void pm_print_node(pm_parser_t *parser, pm_node_t *node);
|
34
|
+
|
35
|
+
void pm_parser_metadata(pm_parser_t *parser, const char *metadata);
|
36
|
+
|
37
|
+
// Generate a scope node from the given node.
|
38
|
+
void pm_scope_node_init(pm_node_t *node, pm_scope_node_t *dest);
|
39
|
+
|
40
|
+
// The prism version and the serialization format.
|
41
|
+
PRISM_EXPORTED_FUNCTION const char * pm_version(void);
|
42
|
+
|
43
|
+
// Initialize a parser with the given start and end pointers.
|
44
|
+
PRISM_EXPORTED_FUNCTION void pm_parser_init(pm_parser_t *parser, const uint8_t *source, size_t size, const char *filepath);
|
45
|
+
|
46
|
+
// Register a callback that will be called whenever prism changes the encoding it
|
47
|
+
// is using to parse based on the magic comment.
|
48
|
+
PRISM_EXPORTED_FUNCTION void pm_parser_register_encoding_changed_callback(pm_parser_t *parser, pm_encoding_changed_callback_t callback);
|
49
|
+
|
50
|
+
// Register a callback that will be called when prism encounters a magic comment
|
51
|
+
// with an encoding referenced that it doesn't understand. The callback should
|
52
|
+
// return NULL if it also doesn't understand the encoding or it should return a
|
53
|
+
// pointer to a pm_encoding_t struct that contains the functions necessary to
|
54
|
+
// parse identifiers.
|
55
|
+
PRISM_EXPORTED_FUNCTION void pm_parser_register_encoding_decode_callback(pm_parser_t *parser, pm_encoding_decode_callback_t callback);
|
56
|
+
|
57
|
+
// Free any memory associated with the given parser.
|
58
|
+
PRISM_EXPORTED_FUNCTION void pm_parser_free(pm_parser_t *parser);
|
59
|
+
|
60
|
+
// Parse the Ruby source associated with the given parser and return the tree.
|
61
|
+
PRISM_EXPORTED_FUNCTION pm_node_t * pm_parse(pm_parser_t *parser);
|
62
|
+
|
63
|
+
// Pretty-prints the AST represented by the given node to the given buffer.
|
64
|
+
PRISM_EXPORTED_FUNCTION void pm_prettyprint(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
65
|
+
|
66
|
+
// Serialize the AST represented by the given node to the given buffer.
|
67
|
+
PRISM_EXPORTED_FUNCTION void pm_serialize(pm_parser_t *parser, pm_node_t *node, pm_buffer_t *buffer);
|
68
|
+
|
69
|
+
// Parse the given source to the AST and serialize the AST to the given buffer.
|
70
|
+
PRISM_EXPORTED_FUNCTION void pm_parse_serialize(const uint8_t *source, size_t size, pm_buffer_t *buffer, const char *metadata);
|
71
|
+
|
72
|
+
// Lex the given source and serialize to the given buffer.
|
73
|
+
PRISM_EXPORTED_FUNCTION void pm_lex_serialize(const uint8_t *source, size_t size, const char *filepath, pm_buffer_t *buffer);
|
74
|
+
|
75
|
+
// Parse and serialize both the AST and the tokens represented by the given
|
76
|
+
// source to the given buffer.
|
77
|
+
PRISM_EXPORTED_FUNCTION void pm_parse_lex_serialize(const uint8_t *source, size_t size, pm_buffer_t *buffer, const char *metadata);
|
78
|
+
|
79
|
+
// Returns a string representation of the given token type.
|
80
|
+
PRISM_EXPORTED_FUNCTION const char * pm_token_type_to_str(pm_token_type_t token_type);
|
81
|
+
|
82
|
+
#endif
|