Browse Source

py/parse: Fix handling of empty input so it raises an exception.

pull/1392/head
Damien George 9 years ago
parent
commit
96f0dd3cbc
  1. 2
      py/grammar.h
  2. 5
      py/parse.c
  3. 24
      tests/basics/parser.py

2
py/grammar.h

@ -38,7 +38,7 @@
// eval_input: testlist NEWLINE* ENDMARKER // eval_input: testlist NEWLINE* ENDMARKER
DEF_RULE(single_input, nc, or(3), tok(NEWLINE), rule(simple_stmt), rule(compound_stmt)) DEF_RULE(single_input, nc, or(3), tok(NEWLINE), rule(simple_stmt), rule(compound_stmt))
DEF_RULE(file_input, nc, and(1), opt_rule(file_input_2)) DEF_RULE(file_input, c(generic_all_nodes), and(1), opt_rule(file_input_2))
DEF_RULE(file_input_2, c(generic_all_nodes), one_or_more, rule(file_input_3)) DEF_RULE(file_input_2, c(generic_all_nodes), one_or_more, rule(file_input_3))
DEF_RULE(file_input_3, nc, or(2), tok(NEWLINE), rule(stmt)) DEF_RULE(file_input_3, nc, or(2), tok(NEWLINE), rule(stmt))
DEF_RULE(eval_input, nc, and(2), rule(testlist), opt_rule(eval_input_2)) DEF_RULE(eval_input, nc, and(2), rule(testlist), opt_rule(eval_input_2))

5
py/parse.c

@ -720,6 +720,11 @@ memory_error:
goto syntax_error; goto syntax_error;
} }
// check that parsing resulted in a parse node (can fail on empty input)
if (parser.result_stack_top == 0) {
goto syntax_error;
}
//result_stack_show(parser); //result_stack_show(parser);
//printf("rule stack alloc: %d\n", parser.rule_stack_alloc); //printf("rule stack alloc: %d\n", parser.rule_stack_alloc);
//printf("result stack alloc: %d\n", parser.result_stack_alloc); //printf("result stack alloc: %d\n", parser.result_stack_alloc);

24
tests/basics/parser.py

@ -0,0 +1,24 @@
# parser tests
# completely empty string
# uPy and CPy differ for this case
#try:
# compile("", "stdin", "single")
#except SyntaxError:
# print("SyntaxError")
try:
compile("", "stdin", "eval")
except SyntaxError:
print("SyntaxError")
compile("", "stdin", "exec")
# empty continued line
try:
compile("\\\n", "stdin", "single")
except SyntaxError:
print("SyntaxError")
try:
compile("\\\n", "stdin", "eval")
except SyntaxError:
print("SyntaxError")
compile("\\\n", "stdin", "exec")
Loading…
Cancel
Save