Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
16a6a47a
Commit
16a6a47a
authored
Dec 17, 2015
by
Damien George
Browse files
py/parse: Replace mp_int_t/mp_uint_t with size_t etc, where appropriate.
parent
6e2fb56d
Changes
2
Hide whitespace changes
Inline
Side-by-side
py/parse.c
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
))
{
...
...
py/parse.h
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
,
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment