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
38161826
Commit
38161826
authored
Jul 03, 2014
by
Damien George
Browse files
parser: Convert (u)int to mp_(u)int_t.
parent
54eb4e72
Changes
6
Hide whitespace changes
Inline
Side-by-side
py/parse.c
View file @
38161826
...
...
@@ -109,20 +109,20 @@ STATIC const rule_t *rules[] = {
};
typedef
struct
_rule_stack_t
{
unsigned
in
t
src_line
:
24
;
unsigned
in
t
rule_id
:
8
;
int
32
_t
arg_i
;
// what should
be
the size
and signedness
?
mp_uint_
t
src_line
:
24
;
mp_uint_
t
rule_id
:
8
;
mp_u
int_t
arg_i
:
32
;
// what should the
bit-
size
be
?
}
rule_stack_t
;
typedef
struct
_parser_t
{
bool
had_memory_error
;
uint
rule_stack_alloc
;
uint
rule_stack_top
;
mp_
uint
_t
rule_stack_alloc
;
mp_
uint
_t
rule_stack_top
;
rule_stack_t
*
rule_stack
;
uint
result_stack_alloc
;
uint
result_stack_top
;
mp_
uint
_t
result_stack_alloc
;
mp_
uint
_t
result_stack_top
;
mp_parse_node_t
*
result_stack
;
mp_lexer_t
*
lexer
;
...
...
@@ -132,7 +132,7 @@ STATIC inline void memory_error(parser_t *parser) {
parser
->
had_memory_error
=
true
;
}
STATIC
void
push_rule
(
parser_t
*
parser
,
in
t
src_line
,
const
rule_t
*
rule
,
in
t
arg_i
)
{
STATIC
void
push_rule
(
parser_t
*
parser
,
mp_uint_
t
src_line
,
const
rule_t
*
rule
,
mp_uint_
t
arg_i
)
{
if
(
parser
->
had_memory_error
)
{
return
;
}
...
...
@@ -151,14 +151,14 @@ STATIC void push_rule(parser_t *parser, int src_line, const rule_t *rule, int ar
rs
->
arg_i
=
arg_i
;
}
STATIC
void
push_rule_from_arg
(
parser_t
*
parser
,
uint
arg
)
{
STATIC
void
push_rule_from_arg
(
parser_t
*
parser
,
mp_
uint
_t
arg
)
{
assert
((
arg
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_RULE
||
(
arg
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_OPT_RULE
);
uint
rule_id
=
arg
&
RULE_ARG_ARG_MASK
;
mp_
uint
_t
rule_id
=
arg
&
RULE_ARG_ARG_MASK
;
assert
(
rule_id
<
RULE_maximum_number_of
);
push_rule
(
parser
,
mp_lexer_cur
(
parser
->
lexer
)
->
src_line
,
rules
[
rule_id
],
0
);
}
STATIC
void
pop_rule
(
parser_t
*
parser
,
const
rule_t
**
rule
,
uint
*
arg_i
,
uint
*
src_line
)
{
STATIC
void
pop_rule
(
parser_t
*
parser
,
const
rule_t
**
rule
,
mp_
uint
_t
*
arg_i
,
mp_
uint
_t
*
src_line
)
{
assert
(
!
parser
->
had_memory_error
);
parser
->
rule_stack_top
-=
1
;
*
rule
=
rules
[
parser
->
rule_stack
[
parser
->
rule_stack_top
].
rule_id
];
...
...
@@ -176,8 +176,8 @@ mp_parse_node_t mp_parse_node_new_leaf(mp_int_t kind, mp_int_t arg) {
void
mp_parse_node_free
(
mp_parse_node_t
pn
)
{
if
(
MP_PARSE_NODE_IS_STRUCT
(
pn
))
{
mp_parse_node_struct_t
*
pns
=
(
mp_parse_node_struct_t
*
)
pn
;
uint
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
uint
rule_id
=
MP_PARSE_NODE_STRUCT_KIND
(
pns
);
mp_
uint
_t
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
mp_
uint
_t
rule_id
=
MP_PARSE_NODE_STRUCT_KIND
(
pns
);
if
(
rule_id
==
RULE_string
)
{
return
;
}
...
...
@@ -185,7 +185,7 @@ void mp_parse_node_free(mp_parse_node_t pn) {
if
(
adjust
)
{
n
--
;
}
for
(
uint
i
=
0
;
i
<
n
;
i
++
)
{
for
(
mp_
uint
_t
i
=
0
;
i
<
n
;
i
++
)
{
mp_parse_node_free
(
pns
->
nodes
[
i
]);
}
if
(
adjust
)
{
...
...
@@ -196,13 +196,13 @@ void mp_parse_node_free(mp_parse_node_t pn) {
}
#if MICROPY_DEBUG_PRINTERS
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
in
t
indent
)
{
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
mp_uint_
t
indent
)
{
if
(
MP_PARSE_NODE_IS_STRUCT
(
pn
))
{
printf
(
"[% 4d] "
,
(
int
)((
mp_parse_node_struct_t
*
)
pn
)
->
source_line
);
}
else
{
printf
(
" "
);
}
for
(
in
t
i
=
0
;
i
<
indent
;
i
++
)
{
for
(
mp_uint_
t
i
=
0
;
i
<
indent
;
i
++
)
{
printf
(
" "
);
}
if
(
MP_PARSE_NODE_IS_NULL
(
pn
))
{
...
...
@@ -227,13 +227,13 @@ void mp_parse_node_print(mp_parse_node_t pn, int indent) {
if
(
MP_PARSE_NODE_STRUCT_KIND
(
pns
)
==
RULE_string
)
{
printf
(
"literal str(%.*s)
\n
"
,
(
int
)
pns
->
nodes
[
1
],
(
char
*
)
pns
->
nodes
[
0
]);
}
else
{
uint
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
mp_
uint
_t
n
=
MP_PARSE_NODE_STRUCT_NUM_NODES
(
pns
);
#ifdef USE_RULE_NAME
printf
(
"%s(
%d) (n=%d
)
\n
"
,
rules
[
MP_PARSE_NODE_STRUCT_KIND
(
pns
)]
->
rule_name
,
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
n
);
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
);
#else
printf
(
"rule(
%u) (n=%d
)
\n
"
,
(
uint
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
n
);
printf
(
"rule(
"
UINT_FMT
") (n="
UINT_FMT
"
)
\n
"
,
(
mp_
uint
_t
)
MP_PARSE_NODE_STRUCT_KIND
(
pns
),
n
);
#endif
for
(
uint
i
=
0
;
i
<
n
;
i
++
)
{
for
(
mp_
uint
_t
i
=
0
;
i
<
n
;
i
++
)
{
mp_parse_node_print
(
pns
->
nodes
[
i
],
indent
+
2
);
}
}
...
...
@@ -244,7 +244,7 @@ void mp_parse_node_print(mp_parse_node_t pn, int indent) {
/*
STATIC void result_stack_show(parser_t *parser) {
printf("result stack, most recent first\n");
for (
in
t i = parser->result_stack_top - 1; i >= 0; i--) {
for (
mp_int_
t i = parser->result_stack_top - 1; i >= 0; i--) {
mp_parse_node_print(parser->result_stack[i], 0);
}
}
...
...
@@ -258,7 +258,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
,
in
t
pos
)
{
STATIC
mp_parse_node_t
peek_result
(
parser_t
*
parser
,
mp_uint_
t
pos
)
{
if
(
parser
->
had_memory_error
)
{
return
MP_PARSE_NODE_NULL
;
}
...
...
@@ -282,7 +282,7 @@ STATIC void push_result_node(parser_t *parser, mp_parse_node_t pn) {
parser
->
result_stack
[
parser
->
result_stack_top
++
]
=
pn
;
}
STATIC
void
push_result_string
(
parser_t
*
parser
,
in
t
src_line
,
const
char
*
str
,
uint
len
)
{
STATIC
void
push_result_string
(
parser_t
*
parser
,
mp_uint_
t
src_line
,
const
char
*
str
,
mp_
uint
_t
len
)
{
mp_parse_node_struct_t
*
pn
=
m_new_obj_var_maybe
(
mp_parse_node_struct_t
,
mp_parse_node_t
,
2
);
if
(
pn
==
NULL
)
{
memory_error
(
parser
);
...
...
@@ -306,13 +306,13 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
bool
dec
=
false
;
bool
small_int
=
true
;
mp_int_t
int_val
=
0
;
in
t
len
=
tok
->
len
;
mp_uint_
t
len
=
tok
->
len
;
const
char
*
str
=
tok
->
str
;
in
t
base
=
0
;
in
t
i
=
mp_parse_num_base
(
str
,
len
,
&
base
);
mp_uint_
t
base
=
0
;
mp_uint_
t
i
=
mp_parse_num_base
(
str
,
len
,
&
base
);
bool
overflow
=
false
;
for
(;
i
<
len
;
i
++
)
{
in
t
dig
;
mp_uint_
t
dig
;
if
(
unichar_isdigit
(
str
[
i
])
&&
str
[
i
]
-
'0'
<
base
)
{
dig
=
str
[
i
]
-
'0'
;
}
else
if
(
base
==
16
&&
'a'
<=
str
[
i
]
&&
str
[
i
]
<=
'f'
)
{
...
...
@@ -369,7 +369,7 @@ STATIC void push_result_token(parser_t *parser, const mp_lexer_t *lex) {
push_result_node
(
parser
,
pn
);
}
STATIC
void
push_result_rule
(
parser_t
*
parser
,
in
t
src_line
,
const
rule_t
*
rule
,
in
t
num_args
)
{
STATIC
void
push_result_rule
(
parser_t
*
parser
,
mp_uint_
t
src_line
,
const
rule_t
*
rule
,
mp_uint_
t
num_args
)
{
mp_parse_node_struct_t
*
pn
=
m_new_obj_var_maybe
(
mp_parse_node_struct_t
,
mp_parse_node_t
,
num_args
);
if
(
pn
==
NULL
)
{
memory_error
(
parser
);
...
...
@@ -377,7 +377,7 @@ STATIC void push_result_rule(parser_t *parser, int src_line, const rule_t *rule,
}
pn
->
source_line
=
src_line
;
pn
->
kind_num_nodes
=
(
rule
->
rule_id
&
0xff
)
|
(
num_args
<<
8
);
for
(
in
t
i
=
num_args
;
i
>
0
;
i
--
)
{
for
(
mp_uint_
t
i
=
num_args
;
i
>
0
;
i
--
)
{
pn
->
nodes
[
i
-
1
]
=
pop_result
(
parser
);
}
push_result_node
(
parser
,
(
mp_parse_node_t
)
pn
);
...
...
@@ -407,7 +407,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
}
// work out the top-level rule to use, and push it on the stack
in
t
top_level_rule
;
mp_uint_
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
;
...
...
@@ -417,8 +417,8 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
// parse!
uint
n
,
i
;
// state for the current rule
uint
rule_src_line
;
// source line for the first token matched by the current rule
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
bool
backtrack
=
false
;
const
rule_t
*
rule
=
NULL
;
mp_token_kind_t
tok_kind
;
...
...
@@ -541,7 +541,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
// count number of arguments for the parse_node
i
=
0
;
emit_rule
=
false
;
for
(
in
t
x
=
0
;
x
<
n
;
++
x
)
{
for
(
mp_uint_
t
x
=
0
;
x
<
n
;
++
x
)
{
if
((
rule
->
arg
[
x
]
&
RULE_ARG_KIND_MASK
)
==
RULE_ARG_TOK
)
{
tok_kind
=
rule
->
arg
[
x
]
&
RULE_ARG_ARG_MASK
;
if
(
tok_kind
>=
MP_TOKEN_NAME
)
{
...
...
@@ -589,8 +589,8 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
i
+=
1
;
}
in
t
num_not_nil
=
0
;
for
(
in
t
x
=
0
;
x
<
i
;
++
x
)
{
mp_uint_
t
num_not_nil
=
0
;
for
(
mp_uint_
t
x
=
0
;
x
<
i
;
++
x
)
{
if
(
peek_result
(
&
parser
,
x
)
!=
MP_PARSE_NODE_NULL
)
{
num_not_nil
+=
1
;
}
...
...
@@ -605,7 +605,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
}
else
if
(
num_not_nil
==
1
)
{
// single result, leave it on stack
mp_parse_node_t
pn
=
MP_PARSE_NODE_NULL
;
for
(
in
t
x
=
0
;
x
<
i
;
++
x
)
{
for
(
mp_uint_
t
x
=
0
;
x
<
i
;
++
x
)
{
mp_parse_node_t
pn2
=
pop_result
(
&
parser
);
if
(
pn2
!=
MP_PARSE_NODE_NULL
)
{
pn
=
pn2
;
...
...
@@ -653,7 +653,7 @@ mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, mp_p
}
}
else
{
for
(;;)
{
uint
arg
=
rule
->
arg
[
i
&
1
&
n
];
mp_
uint
_t
arg
=
rule
->
arg
[
i
&
1
&
n
];
switch
(
arg
&
RULE_ARG_KIND_MASK
)
{
case
RULE_ARG_TOK
:
if
(
mp_lexer_is_kind
(
lex
,
arg
&
RULE_ARG_ARG_MASK
))
{
...
...
py/parse.h
View file @
38161826
...
...
@@ -77,7 +77,7 @@ typedef struct _mp_parse_node_struct_t {
mp_parse_node_t
mp_parse_node_new_leaf
(
mp_int_t
kind
,
mp_int_t
arg
);
void
mp_parse_node_free
(
mp_parse_node_t
pn
);
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
in
t
indent
);
void
mp_parse_node_print
(
mp_parse_node_t
pn
,
mp_uint_
t
indent
);
typedef
enum
{
MP_PARSE_SINGLE_INPUT
,
...
...
py/parsenum.c
View file @
38161826
...
...
@@ -41,7 +41,7 @@
#include <math.h>
#endif
mp_obj_t
mp_parse_num_integer
(
const
char
*
restrict
str_
,
uint
len
,
in
t
base
)
{
mp_obj_t
mp_parse_num_integer
(
const
char
*
restrict
str_
,
mp_
uint
_t
len
,
mp_uint_
t
base
)
{
const
byte
*
restrict
str
=
(
const
byte
*
)
str_
;
const
byte
*
restrict
top
=
str
+
len
;
bool
neg
=
false
;
...
...
@@ -74,7 +74,7 @@ mp_obj_t mp_parse_num_integer(const char *restrict str_, uint len, int base) {
const
byte
*
restrict
str_val_start
=
str
;
for
(;
str
<
top
;
str
++
)
{
// get next digit as a value
in
t
dig
=
*
str
;
mp_uint_
t
dig
=
*
str
;
if
(
unichar_isdigit
(
dig
)
&&
dig
-
'0'
<
base
)
{
// 0-9 digit
dig
=
dig
-
'0'
;
...
...
@@ -141,11 +141,13 @@ value_error:
nlr_raise
(
mp_obj_new_exception_msg_varg
(
&
mp_type_ValueError
,
"invalid syntax for integer with base %d: '%s'"
,
base
,
str
));
}
#define PARSE_DEC_IN_INTG (1)
#define PARSE_DEC_IN_FRAC (2)
#define PARSE_DEC_IN_EXP (3)
typedef
enum
{
PARSE_DEC_IN_INTG
,
PARSE_DEC_IN_FRAC
,
PARSE_DEC_IN_EXP
,
}
parse_dec_in_t
;
mp_obj_t
mp_parse_num_decimal
(
const
char
*
str
,
uint
len
,
bool
allow_imag
,
bool
force_complex
)
{
mp_obj_t
mp_parse_num_decimal
(
const
char
*
str
,
mp_
uint
_t
len
,
bool
allow_imag
,
bool
force_complex
)
{
#if MICROPY_PY_BUILTINS_FLOAT
const
char
*
top
=
str
+
len
;
mp_float_t
dec_val
=
0
;
...
...
@@ -187,12 +189,12 @@ mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag, bool f
}
}
else
{
// string should be a decimal number
int
in
=
PARSE_DEC_IN_INTG
;
parse_dec_
in
_
t
in
=
PARSE_DEC_IN_INTG
;
bool
exp_neg
=
false
;
in
t
exp_val
=
0
;
in
t
exp_extra
=
0
;
mp_int_
t
exp_val
=
0
;
mp_int_
t
exp_extra
=
0
;
for
(;
str
<
top
;
str
++
)
{
in
t
dig
=
*
str
;
mp_uint_
t
dig
=
*
str
;
if
(
'0'
<=
dig
&&
dig
<=
'9'
)
{
dig
-=
'0'
;
if
(
in
==
PARSE_DEC_IN_EXP
)
{
...
...
py/parsenum.h
View file @
38161826
...
...
@@ -24,5 +24,5 @@
* THE SOFTWARE.
*/
mp_obj_t
mp_parse_num_integer
(
const
char
*
restrict
str
,
uint
len
,
in
t
base
);
mp_obj_t
mp_parse_num_decimal
(
const
char
*
str
,
uint
len
,
bool
allow_imag
,
bool
force_complex
);
mp_obj_t
mp_parse_num_integer
(
const
char
*
restrict
str
,
mp_
uint
_t
len
,
mp_uint_
t
base
);
mp_obj_t
mp_parse_num_decimal
(
const
char
*
str
,
mp_
uint
_t
len
,
bool
allow_imag
,
bool
force_complex
);
py/parsenumbase.c
View file @
38161826
...
...
@@ -30,9 +30,9 @@
// find real radix base, and strip preceding '0x', '0o' and '0b'
// puts base in *base, and returns number of bytes to skip the prefix
in
t
mp_parse_num_base
(
const
char
*
str
,
uint
len
,
in
t
*
base
)
{
mp_uint_
t
mp_parse_num_base
(
const
char
*
str
,
mp_
uint
_t
len
,
mp_uint_
t
*
base
)
{
const
byte
*
p
=
(
const
byte
*
)
str
;
int
c
=
*
(
p
++
);
unichar
c
=
*
(
p
++
);
if
((
*
base
==
0
||
*
base
==
16
)
&&
c
==
'0'
)
{
c
=
*
(
p
++
);
if
((
c
|
32
)
==
'x'
)
{
...
...
@@ -65,4 +65,3 @@ int mp_parse_num_base(const char *str, uint len, int *base) {
}
return
p
-
(
const
byte
*
)
str
;
}
py/parsenumbase.h
View file @
38161826
...
...
@@ -24,4 +24,4 @@
* THE SOFTWARE.
*/
in
t
mp_parse_num_base
(
const
char
*
str
,
uint
len
,
in
t
*
base
);
mp_uint_
t
mp_parse_num_base
(
const
char
*
str
,
mp_
uint
_t
len
,
mp_uint_
t
*
base
);
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