diff options
Diffstat (limited to 'Parser')
-rw-r--r-- | Parser/tokenizer.c | 19 | ||||
-rw-r--r-- | Parser/tokenizer.h | 2 |
2 files changed, 19 insertions, 2 deletions
diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 38a9e9a..725a2f1 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -109,6 +109,7 @@ tok_new() tok->pendin = 0; tok->prompt = tok->nextprompt = NULL; tok->lineno = 0; + tok->level = 0; return tok; } @@ -390,7 +391,7 @@ tok_get(tok, p_start, p_end) /* We can't jump back right here since we still may need to skip to the end of a comment */ } - if (!blankline) { + if (!blankline && tok->level == 0) { if (col == tok->indstack[tok->indent]) { /* No change */ } @@ -483,7 +484,7 @@ tok_get(tok, p_start, p_end) /* Newline */ if (c == '\n') { tok->atbol = 1; - if (blankline) + if (blankline || tok->level > 0) goto nextline; *p_end = tok->cur - 1; /* Leave '\n' out of the string */ return NEWLINE; @@ -612,6 +613,20 @@ tok_get(tok, p_start, p_end) tok_backup(tok, c2); } + /* Keep track of parenteses nesting level */ + switch (c) { + case '(': + case '[': + case '{': + tok->level++; + break; + case ')': + case ']': + case '}': + tok->level--; + break; + } + /* Punctuation character */ *p_end = tok->cur; return tok_1char(c); diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 9abc598..bdef859 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -46,6 +46,8 @@ struct tok_state { int pendin; /* Pending indents (if > 0) or dedents (if < 0) */ char *prompt, *nextprompt; /* For interactive prompting */ int lineno; /* Current line number */ + int level; /* () [] {} Parentheses nesting level */ + /* Used to allow free continuations inside them */ }; extern struct tok_state *tok_setups PROTO((char *)); |