diff options
author | Damien George <damien.p.george@gmail.com> | 2014-01-15 21:23:31 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2014-01-15 21:23:31 +0000 |
commit | 9528cd66d7c94d7376884a53c2080b29e9bc3a0a (patch) | |
tree | 7c3ad5d4af03b7760f7c3be4ae1a1e9555113324 /py/parse.c | |
parent | 24224d7c72e1d6572ef0d24f08eb882dcac8dc50 (diff) | |
download | micropython-9528cd66d7c94d7376884a53c2080b29e9bc3a0a.tar.gz micropython-9528cd66d7c94d7376884a53c2080b29e9bc3a0a.zip |
Convert parse errors to exceptions.
Parser no longer prints an error, but instead returns an exception ID
and message.
Diffstat (limited to 'py/parse.c')
-rw-r--r-- | py/parse.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/py/parse.c b/py/parse.c index e2c9520736..e26e235aa3 100644 --- a/py/parse.c +++ b/py/parse.c @@ -8,6 +8,7 @@ #include "misc.h" #include "mpconfig.h" +#include "mpqstr.h" #include "lexer.h" #include "parse.h" @@ -265,7 +266,7 @@ static void push_result_rule(parser_t *parser, const rule_t *rule, int num_args) push_result_node(parser, (mp_parse_node_t)pn); } -mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind) { +mp_parse_node_t mp_parse(mp_lexer_t *lex, mp_parse_input_kind_t input_kind, qstr *exc_id_out, const char **exc_msg_out) { // allocate memory for the parser and its stacks @@ -598,17 +599,20 @@ finished: return result; syntax_error: - // TODO these should raise a proper exception if (mp_lexer_is_kind(lex, MP_TOKEN_INDENT)) { - mp_lexer_show_error_pythonic(lex, "IndentationError: unexpected indent"); + *exc_id_out = MP_QSTR_IndentationError; + *exc_msg_out = "unexpected indent"; } else if (mp_lexer_is_kind(lex, MP_TOKEN_DEDENT_MISMATCH)) { - mp_lexer_show_error_pythonic(lex, "IndentationError: unindent does not match any outer indentation level"); + *exc_id_out = MP_QSTR_IndentationError; + *exc_msg_out = "unindent does not match any outer indentation level"; } else { - mp_lexer_show_error_pythonic(lex, "syntax error:"); + *exc_id_out = MP_QSTR_SyntaxError; + *exc_msg_out = "invalid syntax"; #ifdef USE_RULE_NAME - mp_lexer_show_error(lex, rule->rule_name); -#endif + // debugging: print the rule name that failed and the token + mp_lexer_show_error_pythonic(lex, rule->rule_name); mp_token_show(mp_lexer_cur(lex)); +#endif } result = MP_PARSE_NODE_NULL; goto finished; |