diff options
author | Damien <damien.p.george@gmail.com> | 2013-10-22 22:32:27 +0100 |
---|---|---|
committer | Damien <damien.p.george@gmail.com> | 2013-10-22 22:32:27 +0100 |
commit | 92c06561a3e657924b77aa53725529daddafb343 (patch) | |
tree | e5e5a1d8ce294c21eb6c926c42280eab1ed8aed5 /py | |
parent | 9d63932b3d82752e83281dacead20d412b9e34bb (diff) | |
download | micropython-92c06561a3e657924b77aa53725529daddafb343.tar.gz micropython-92c06561a3e657924b77aa53725529daddafb343.zip |
Improve REPL compount statement detection.
Diffstat (limited to 'py')
-rw-r--r-- | py/lexer.c | 3 | ||||
-rw-r--r-- | py/repl.c | 44 | ||||
-rw-r--r-- | py/repl.h | 1 |
3 files changed, 48 insertions, 0 deletions
diff --git a/py/lexer.c b/py/lexer.c index 88bc0a1aae..cd2e05ece0 100644 --- a/py/lexer.c +++ b/py/lexer.c @@ -10,6 +10,9 @@ #define TAB_SIZE (8) +// TODO seems that CPython allows NULL byte in the input stream +// don't know if that's intentional or not, but we don't allow it + struct _py_lexer_t { const char *name; // name of source void *stream_data; // data for stream diff --git a/py/repl.c b/py/repl.c new file mode 100644 index 0000000000..f295aff23d --- /dev/null +++ b/py/repl.c @@ -0,0 +1,44 @@ +#include "misc.h" +#include "repl.h" + +bool str_startswith_word(const char *str, const char *head) { + int i; + for (i = 0; str[i] && head[i]; i++) { + if (str[i] != head[i]) { + return false; + } + } + return head[i] == '\0' && (str[i] == '\0' || !g_unichar_isalpha(str[i])); +} + +bool py_repl_is_compound_stmt(const char *line) { + // compound if line starts with a certain keyword + if ( + str_startswith_word(line, "if") + || str_startswith_word(line, "while") + || str_startswith_word(line, "for") + || str_startswith_word(line, "true") + || str_startswith_word(line, "with") + || str_startswith_word(line, "def") + || str_startswith_word(line, "class") + || str_startswith_word(line, "@") + ) { + return true; + } + + // also "compound" if unmatched open bracket + int n_paren = 0; + int n_brack = 0; + int n_brace = 0; + for (const char *l = line; *l; l++) { + switch (*l) { + case '(': n_paren += 1; break; + case ')': n_paren -= 1; break; + case '[': n_brack += 1; break; + case ']': n_brack -= 1; break; + case '{': n_brace += 1; break; + case '}': n_brace -= 1; break; + } + } + return n_paren > 0 || n_brack > 0 || n_brace > 0; +} diff --git a/py/repl.h b/py/repl.h new file mode 100644 index 0000000000..014e8609b4 --- /dev/null +++ b/py/repl.h @@ -0,0 +1 @@ +bool py_repl_is_compound_stmt(const char *line); |