Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
M
micropython
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
This is an archived project. Repository and other project resources are read-only.
Show more breadcrumbs
card10
micropython
Commits
16a6a47a
Commit
16a6a47a
authored
9 years ago
by
Damien George
Browse files
Options
Downloads
Patches
Plain Diff
py/parse: Replace mp_int_t/mp_uint_t with size_t etc, where appropriate.
parent
6e2fb56d
No related branches found
Branches containing commit
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
py/parse.c
+43
-43
43 additions, 43 deletions
py/parse.c
py/parse.h
+4
-4
4 additions, 4 deletions
py/parse.h
with
47 additions
and
47 deletions
py/parse.c
+
43
−
43
View file @
16a6a47a
...
...
@@ -109,15 +109,15 @@ STATIC const rule_t *rules[] = {
};
typedef
struct
_rule_stack_t
{
mp_uint
_t
src_line
:
BITS_PER_WORD
-
8
;
// maximum bits storing source line number
mp_uint
_t
rule_id
:
8
;
// this must be large enough to fit largest rule number
mp_uint
_t
arg_i
;
// this dictates the maximum nodes in a "list" of things
size
_t
src_line
:
8
*
sizeof
(
size_t
)
-
8
;
// maximum bits storing source line number
size
_t
rule_id
:
8
;
// this must be large enough to fit largest rule number
size
_t
arg_i
;
// this dictates the maximum nodes in a "list" of things
}
rule_stack_t
;
typedef
struct
_mp_parse_chunk_t
{
mp_uint
_t
alloc
;
size
_t
alloc
;
union
{
mp_uint
_t
used
;
size
_t
used
;
struct
_mp_parse_chunk_t
*
next
;
}
union_
;
byte
data
[];
...
...
@@ -132,12 +132,12 @@ typedef enum {
typedef
struct
_parser_t
{
parse_error_t
parse_error
;
mp_uint
_t
rule_stack_alloc
;
mp_uint
_t
rule_stack_top
;
size
_t
rule_stack_alloc
;
size
_t
rule_stack_top
;
rule_stack_t
*
rule_stack
;
mp_uint
_t
result_stack_alloc
;
mp_uint
_t
result_stack_top
;
size
_t
result_stack_alloc
;
size
_t
result_stack_top
;
mp_parse_node_t
*
result_stack
;
mp_lexer_t
*
lexer
;
...
...
@@ -191,7 +191,7 @@ STATIC void *parser_alloc(parser_t *parser, size_t num_bytes) {
return
ret
;
}
STATIC
void
push_rule
(
parser_t
*
parser
,
mp_uint
_t
src_line
,
const
rule_t
*
rule
,
mp_uint
_t
arg_i
)
{
STATIC
void
push_rule
(
parser_t
*
parser
,
size
_t
src_line
,
const
rule_t
*
rule
,
size
_t
arg_i
)
{
if
(
parser
->
parse_error
)
{
return
;
}
...
...
@@ -210,14 +210,14 @@ STATIC void push_rule(parser_t *parser, mp_uint_t src_line, const rule_t *rule,
rs
->
arg_i
=
arg_i
;
}
STATIC
void
push_rule_from_arg
(
parser_t
*
parser
,
mp_uint
_t
arg
)
{
STATIC
void
push_rule_from_arg
(
parser_t
*
parser
,
size
_t
arg
)
{
assert
((
arg
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_RULE
||
(
arg
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_OPT_RULE
);
mp_uint
_t
rule_id
=
arg
&
RULE_ARG_ARG_MASK
;
size
_t
rule_id
=
arg
&
RULE_ARG_ARG_MASK
;
assert
(
rule_id
<
RULE_maximum_number_of
);
push_rule
(
parser
,
parser
->
lexer
->
tok_line
,
rules
[
rule_id
],
0
);
}
STATIC
void
pop_rule
(
parser_t
*
parser
,
const
rule_t
**
rule
,
mp_uint
_t
*
arg_i
,
mp_uint
_t
*
src_line
)
{
STATIC
void
pop_rule
(
parser_t
*
parser
,
const
rule_t
**
rule
,
size
_t
*
arg_i
,
size
_t
*
src_line
)
{
assert
(
!
parser
->
parse_error
);
parser
->
rule_stack_top
-=
1
;
*
rule
=
rules
[
parser
->
rule_stack
[
parser
->
rule_stack_top
].
rule_id
];
...
...
@@ -225,14 +225,14 @@ STATIC void pop_rule(parser_t *parser, const rule_t **rule, mp_uint_t *arg_i, mp
*
src_line
=
parser
->
rule_stack
[
parser
->
rule_stack_top
].
src_line
;
}
mp_parse_node_t
mp_parse_node_new_leaf
(
mp_int
_t
kind
,
mp_int_t
arg
)
{
mp_parse_node_t
mp_parse_node_new_leaf
(
size
_t
kind
,
mp_int_t
arg
)
{
if
(
kind
==
MP_PARSE_NODE_SMALL_INT
)
{
return
(
mp_parse_node_t
)(
kind
|
(
arg
<<
1
));
}
return
(
mp_parse_node_t
)(
kind
|
(
arg
<<
4
));
}
int
mp_parse_node_extract_list
(
mp_parse_node_t
*
pn
,
mp_uint
_t
pn_kind
,
mp_parse_node_t
**
nodes
)
{
int
mp_parse_node_extract_list
(
mp_parse_node_t
*
pn
,
size
_t
pn_kind
,
mp_parse_node_t
**
nodes
)
{
if
(
MP_PARSE_NODE_IS_NULL
(
*
pn
))
{
*
nodes
=
NULL
;
return
0
;
...
...
@@ -252,13 +252,13 @@ int mp_parse_node_extract_list(mp_parse_node_t *pn, mp_uint_t pn_kind, mp_parse_
}
#if MICROPY_DEBUG_PRINTERS
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
mp_uint
_t
indent
)
{
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
size
_t
indent
)
{
if
(
MP_PARSE_NODE_IS_STRUCT
(
pn
))
{
printf
(
"[% 4d] "
,
(
int
)((
mp_parse_node_struct_t
*
)
pn
)
->
source_line
);
}
else
{
printf
(
" "
);
}
for
(
mp_uint
_t
i
=
0
;
i
<
indent
;
i
++
)
{
for
(
size
_t
i
=
0
;
i
<
indent
;
i
++
)
{
printf
(
" "
);
}
if
(
MP_PARSE_NODE_IS_NULL
(
pn
))
{
...
...
@@ -267,12 +267,12 @@ void mp_parse_node_print(mp_parse_node_t pn, mp_uint_t indent) {
mp_int_t
arg
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn
);
printf
(
"int("
INT_FMT
")
\n
"
,
arg
);
}
else
if
(
MP_PARSE_NODE_IS_LEAF
(
pn
))
{
mp_
uint_t
arg
=
MP_PARSE_NODE_LEAF_ARG
(
pn
);
uint
ptr
_t
arg
=
MP_PARSE_NODE_LEAF_ARG
(
pn
);
switch
(
MP_PARSE_NODE_LEAF_KIND
(
pn
))
{
case
MP_PARSE_NODE_ID
:
printf
(
"id(%s)
\n
"
,
qstr_str
(
arg
));
break
;
case
MP_PARSE_NODE_STRING
:
printf
(
"str(%s)
\n
"
,
qstr_str
(
arg
));
break
;
case
MP_PARSE_NODE_BYTES
:
printf
(
"bytes(%s)
\n
"
,
qstr_str
(
arg
));
break
;
case
MP_PARSE_NODE_TOKEN
:
printf
(
"tok(
"
INT_FMT
")
\n
"
,
arg
);
break
;
case
MP_PARSE_NODE_TOKEN
:
printf
(
"tok(
%u)
\n
"
,
(
uint
)
arg
);
break
;
default:
assert
(
0
);
}
}
else
{
...
...
@@ -289,13 +289,13 @@ void mp_parse_node_print(mp_parse_node_t pn, mp_uint_t indent) {
printf
(
"literal const(%p)
\n
"
,
(
mp_obj_t
)
pns
->
nodes
[
0
]);
#endif
}
else
{
mp_uint
_t
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
size
_t
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
#ifdef USE_RULE_NAME
printf
(
"%s(
"
UINT_FMT
") (n="
UINT_FMT
"
)
\n
"
,
rules
[
MP_PARSE_NODE_STRUCT_KIND
(
pns
)]
->
rule_name
,
(
mp_
uint
_t
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
n
);
printf
(
"%s(
%u) (n=%u
)
\n
"
,
rules
[
MP_PARSE_NODE_STRUCT_KIND
(
pns
)]
->
rule_name
,
(
uint
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
(
uint
)
n
);
#else
printf
(
"rule(
"
UINT_FMT
") (n="
UINT_FMT
"
)
\n
"
,
(
mp_
uint
_t
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
n
);
printf
(
"rule(
%u) (n=%u
)
\n
"
,
(
uint
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
(
uint
)
n
);
#endif
for
(
mp_uint
_t
i
=
0
;
i
<
n
;
i
++
)
{
for
(
size
_t
i
=
0
;
i
<
n
;
i
++
)
{
mp_parse_node_print
(
pns
->
nodes
[
i
],
indent
+
2
);
}
}
...
...
@@ -306,7 +306,7 @@ void mp_parse_node_print(mp_parse_node_t pn, mp_uint_t indent) {
/*
STATIC void result_stack_show(parser_t *parser) {
printf("result stack, most recent first\n");
for (
mp_int
_t i = parser->result_stack_top - 1; i >= 0; i--) {
for (
ssize
_t i = parser->result_stack_top - 1; i >= 0; i--) {
mp_parse_node_print(parser->result_stack[i], 0);
}
}
...
...
@@ -320,7 +320,7 @@ STATIC mp_parse_node_t pop_result(parser_t *parser) {
return
parser
->
result_stack
[
--
parser
->
result_stack_top
];
}
STATIC
mp_parse_node_t
peek_result
(
parser_t
*
parser
,
mp_uint
_t
pos
)
{
STATIC
mp_parse_node_t
peek_result
(
parser_t
*
parser
,
size
_t
pos
)
{
if
(
parser
->
parse_error
)
{
return
MP_PARSE_NODE_NULL
;
}
...
...
@@ -344,7 +344,7 @@ STATIC void push_result_node(parser_t *parser, mp_parse_node_t pn) {
parser
->
result_stack
[
parser
->
result_stack_top
++
]
=
pn
;
}
STATIC
mp_parse_node_t
make_node_string_bytes
(
parser_t
*
parser
,
mp_uint
_t
src_line
,
mp_uint
_t
rule_kind
,
const
char
*
str
,
mp_uint
_t
len
)
{
STATIC
mp_parse_node_t
make_node_string_bytes
(
parser_t
*
parser
,
size
_t
src_line
,
size
_t
rule_kind
,
const
char
*
str
,
size
_t
len
)
{
mp_parse_node_struct_t
*
pn
=
parser_alloc
(
parser
,
sizeof
(
mp_parse_node_struct_t
)
+
sizeof
(
mp_parse_node_t
)
*
2
);
if
(
pn
==
NULL
)
{
parser
->
parse_error
=
PARSE_ERROR_MEMORY
;
...
...
@@ -359,7 +359,7 @@ STATIC mp_parse_node_t make_node_string_bytes(parser_t *parser, mp_uint_t src_li
return
(
mp_parse_node_t
)
pn
;
}
STATIC
mp_parse_node_t
make_node_const_object
(
parser_t
*
parser
,
mp_uint
_t
src_line
,
mp_obj_t
obj
)
{
STATIC
mp_parse_node_t
make_node_const_object
(
parser_t
*
parser
,
size
_t
src_line
,
mp_obj_t
obj
)
{
mp_parse_node_struct_t
*
pn
=
parser_alloc
(
parser
,
sizeof
(
mp_parse_node_struct_t
)
+
sizeof
(
mp_obj_t
));
if
(
pn
==
NULL
)
{
parser
->
parse_error
=
PARSE_ERROR_MEMORY
;
...
...
@@ -373,7 +373,7 @@ STATIC mp_parse_node_t make_node_const_object(parser_t *parser, mp_uint_t src_li
pn
->
nodes
[
1
]
=
(
uint64_t
)
obj
>>
32
;
#else
pn
->
kind_num_nodes
=
RULE_const_object
|
(
1
<<
8
);
pn
->
nodes
[
0
]
=
(
mp_
uint_t
)
obj
;
pn
->
nodes
[
0
]
=
(
uint
ptr
_t
)
obj
;
#endif
return
(
mp_parse_node_t
)
pn
;
}
...
...
@@ -439,7 +439,7 @@ STATIC MP_DEFINE_CONST_MAP(mp_constants_map, mp_constants_table);
#endif
#if MICROPY_COMP_CONST_FOLDING
STATIC
bool
fold_constants
(
parser_t
*
parser
,
const
rule_t
*
rule
,
mp_uint
_t
num_args
)
{
STATIC
bool
fold_constants
(
parser_t
*
parser
,
const
rule_t
*
rule
,
size
_t
num_args
)
{
// this code does folding of arbitrary integer expressions, eg 1 + 2 * 3 + 4
// it does not do partial folding, eg 1 + 2 + x -> 3 + x
...
...
@@ -453,7 +453,7 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, mp_uint_t num_a
return
false
;
}
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn
);
for
(
mp_int
_t
i
=
num_args
-
2
;
i
>=
0
;
--
i
)
{
for
(
ssize
_t
i
=
num_args
-
2
;
i
>=
0
;
--
i
)
{
pn
=
peek_result
(
parser
,
i
);
if
(
!
MP_PARSE_NODE_IS_SMALL_INT
(
pn
))
{
return
false
;
...
...
@@ -479,7 +479,7 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, mp_uint_t num_a
return
false
;
}
arg0
=
MP_PARSE_NODE_LEAF_SMALL_INT
(
pn
);
for
(
mp_int
_t
i
=
num_args
-
2
;
i
>=
1
;
i
-=
2
)
{
for
(
ssize
_t
i
=
num_args
-
2
;
i
>=
1
;
i
-=
2
)
{
pn
=
peek_result
(
parser
,
i
-
1
);
if
(
!
MP_PARSE_NODE_IS_SMALL_INT
(
pn
))
{
return
false
;
...
...
@@ -635,7 +635,7 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, mp_uint_t num_a
// success folding this rule
for
(
mp_uint
_t
i
=
num_args
;
i
>
0
;
i
--
)
{
for
(
size
_t
i
=
num_args
;
i
>
0
;
i
--
)
{
pop_result
(
parser
);
}
push_result_node
(
parser
,
mp_parse_node_new_leaf
(
MP_PARSE_NODE_SMALL_INT
,
arg0
));
...
...
@@ -644,7 +644,7 @@ STATIC bool fold_constants(parser_t *parser, const rule_t *rule, mp_uint_t num_a
}
#endif
STATIC
void
push_result_rule
(
parser_t
*
parser
,
mp_uint
_t
src_line
,
const
rule_t
*
rule
,
mp_uint
_t
num_args
)
{
STATIC
void
push_result_rule
(
parser_t
*
parser
,
size
_t
src_line
,
const
rule_t
*
rule
,
size
_t
num_args
)
{
#if MICROPY_COMP_CONST_FOLDING
if
(
fold_constants
(
parser
,
rule
,
num_args
))
{
// we folded this rule so return straight away
...
...
@@ -659,7 +659,7 @@ STATIC void push_result_rule(parser_t *parser, mp_uint_t src_line, const rule_t
}
pn
->
source_line
=
src_line
;
pn
->
kind_num_nodes
=
(
rule
->
rule_id
&
0xff
)
|
(
num_args
<<
8
);
for
(
mp_uint
_t
i
=
num_args
;
i
>
0
;
i
--
)
{
for
(
size
_t
i
=
num_args
;
i
>
0
;
i
--
)
{
pn
->
nodes
[
i
-
1
]
=
pop_result
(
parser
);
}
push_result_node
(
parser
,
(
mp_parse_node_t
)
pn
);
...
...
@@ -696,7 +696,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
}
// work out the top-level rule to use, and push it on the stack
mp_uint
_t
top_level_rule
;
size
_t
top_level_rule
;
switch
(
input_kind
)
{
case
MP_PARSE_SINGLE_INPUT
:
top_level_rule
=
RULE_single_input
;
break
;
case
MP_PARSE_EVAL_INPUT
:
top_level_rule
=
RULE_eval_input
;
break
;
...
...
@@ -706,8 +706,8 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
// parse!
mp_uint
_t
n
,
i
;
// state for the current rule
mp_uint
_t
rule_src_line
;
// source line for the first token matched by the current rule
size
_t
n
,
i
;
// state for the current rule
size
_t
rule_src_line
;
// source line for the first token matched by the current rule
bool
backtrack
=
false
;
const
rule_t
*
rule
=
NULL
;
...
...
@@ -820,7 +820,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
// count number of arguments for the parse_node
i
=
0
;
bool
emit_rule
=
false
;
for
(
mp_uint
_t
x
=
0
;
x
<
n
;
++
x
)
{
for
(
size
_t
x
=
0
;
x
<
n
;
++
x
)
{
if
((
rule
->
arg
[
x
]
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_TOK
)
{
mp_token_kind_t
tok_kind
=
rule
->
arg
[
x
]
&
RULE_ARG_ARG_MASK
;
if
(
tok_kind
>=
MP_TOKEN_NAME
)
{
...
...
@@ -846,7 +846,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
if
(
MP_PARSE_NODE_IS_STRUCT
(
pn
))
{
mp_parse_node_struct_t
*
pns
=
(
mp_parse_node_struct_t
*
)
pn
;
if
(
MP_PARSE_NODE_STRUCT_KIND
(
pns
)
==
RULE_string
)
{
m_del
(
char
,
(
char
*
)
pns
->
nodes
[
0
],
(
mp_uint
_t
)
pns
->
nodes
[
1
]);
m_del
(
char
,
(
char
*
)
pns
->
nodes
[
0
],
(
size
_t
)
pns
->
nodes
[
1
]);
}
}
push_result_rule
(
&
parser
,
rule_src_line
,
rules
[
RULE_pass_stmt
],
0
);
...
...
@@ -875,8 +875,8 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
i
+=
1
;
}
mp_uint
_t
num_not_nil
=
0
;
for
(
mp_uint
_t
x
=
0
;
x
<
i
;
++
x
)
{
size
_t
num_not_nil
=
0
;
for
(
size
_t
x
=
0
;
x
<
i
;
++
x
)
{
if
(
peek_result
(
&
parser
,
x
)
!=
MP_PARSE_NODE_NULL
)
{
num_not_nil
+=
1
;
}
...
...
@@ -887,7 +887,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
}
else
{
// single result, leave it on stack
mp_parse_node_t
pn
=
MP_PARSE_NODE_NULL
;
for
(
mp_uint
_t
x
=
0
;
x
<
i
;
++
x
)
{
for
(
size
_t
x
=
0
;
x
<
i
;
++
x
)
{
mp_parse_node_t
pn2
=
pop_result
(
&
parser
);
if
(
pn2
!=
MP_PARSE_NODE_NULL
)
{
pn
=
pn2
;
...
...
@@ -935,7 +935,7 @@ mp_parse_tree_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) {
}
}
else
{
for
(;;)
{
mp_uint
_t
arg
=
rule
->
arg
[
i
&
1
&
n
];
size
_t
arg
=
rule
->
arg
[
i
&
1
&
n
];
switch
(
arg
&
RULE_ARG_KIND_MASK
)
{
case
RULE_ARG_TOK
:
if
(
lex
->
tok_kind
==
(
arg
&
RULE_ARG_ARG_MASK
))
{
...
...
This diff is collapsed.
Click to expand it.
py/parse.h
+
4
−
4
View file @
16a6a47a
...
...
@@ -70,14 +70,14 @@ typedef struct _mp_parse_node_struct_t {
#define MP_PARSE_NODE_IS_TOKEN_KIND(pn, k) ((pn) == (MP_PARSE_NODE_TOKEN | ((k) << 4)))
#define MP_PARSE_NODE_LEAF_KIND(pn) ((pn) & 0x0f)
#define MP_PARSE_NODE_LEAF_ARG(pn) (((
mp_
uint_t)(pn)) >> 4)
#define MP_PARSE_NODE_LEAF_ARG(pn) (((uint
ptr
_t)(pn)) >> 4)
#define MP_PARSE_NODE_LEAF_SMALL_INT(pn) (((mp_int_t)(intptr_t)(pn)) >> 1)
#define MP_PARSE_NODE_STRUCT_KIND(pns) ((pns)->kind_num_nodes & 0xff)
#define MP_PARSE_NODE_STRUCT_NUM_NODES(pns) ((pns)->kind_num_nodes >> 8)
mp_parse_node_t
mp_parse_node_new_leaf
(
mp_int
_t
kind
,
mp_int_t
arg
);
int
mp_parse_node_extract_list
(
mp_parse_node_t
*
pn
,
mp_uint
_t
pn_kind
,
mp_parse_node_t
**
nodes
);
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
mp_uint
_t
indent
);
mp_parse_node_t
mp_parse_node_new_leaf
(
size
_t
kind
,
mp_int_t
arg
);
int
mp_parse_node_extract_list
(
mp_parse_node_t
*
pn
,
size
_t
pn_kind
,
mp_parse_node_t
**
nodes
);
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
size
_t
indent
);
typedef
enum
{
MP_PARSE_SINGLE_INPUT
,
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment