fork download
  1. def check_basic(test_case):
  2. depth = 0
  3. stack = []
  4. errors = []
  5. test_case = test_case.split('\n')
  6. indent_char = test_case[1]
  7. test_case = test_case[2:]
  8. expected = {'NEXT': 'FOR', 'ENDIF': 'IF'}
  9. for line_num, line in enumerate(test_case, 1):
  10. newline = line.strip(r'·» \t\s')
  11. if newline and not newline.isdigit():
  12. if any(newline.startswith(key) for key in expected):
  13. block_end = newline.split()[0]
  14. if not stack or expected[block_end] != stack.pop():
  15. errors.append('Error in line number {}: {} found when another close was expected'.format(line_num, block_end))
  16. depth = depth - 1 if depth >= 1 else 0
  17. depth = depth - 1 if depth >= 1 else 0
  18. print((indent_char * depth) + newline)
  19. if any(newline.startswith(value) for value in expected.values()):
  20. stack.append(newline.split()[0])
  21. depth += 1
  22.  
  23. if stack:
  24. print('Error: There was a problem closing the following block(s): {}'.format(', '.join(stack)))
  25. if errors:
  26. print('\n'.join(errors))
  27.  
  28. print('\n-------- Test case 1: --------')
  29. input1 = """12
  30. ····
  31. VAR I
  32. ·FOR I=1 TO 31
  33. »»»»IF !(I MOD 3) THEN
  34. ··PRINT "FIZZ"
  35. ··»»ENDIF
  36. »»»»····IF !(I MOD 5) THEN
  37. »»»»··PRINT "BUZZ"
  38. ··»»»»»»ENDIF
  39. »»»»IF (I MOD 3) && (I MOD 5) THEN
  40. ······PRINT "FIZZBUZZ"
  41. ··»»ENDIF
  42. »»»»·NEXT
  43. """
  44. check_basic(input1)
  45.  
  46. print('\n-------- Test case 2: --------')
  47. print('-------- (using asterix as indent) --------')
  48. input2 = """10
  49. ****
  50. FOR I=0 TO 10
  51. ····IF I MOD 2 THEN
  52. ········PRINT I
  53. NEXT
  54. FOR I=0 TO 10
  55. ····IF I MOD 2 THEN
  56. ········PRINT I
  57. FOR I=0 TO 10
  58. ····PRINT I
  59. ENDIF
  60. """
  61. check_basic(input2)
Success #stdin #stdout 0.03s 9984KB
stdin
Standard input is empty
stdout
--------       Test case 1:        --------
VAR I
FOR I=1 TO 31
····IF !(I MOD 3) THEN
········PRINT "FIZZ"
····ENDIF
····IF !(I MOD 5) THEN
········PRINT "BUZZ"
····ENDIF
····IF (I MOD 3) && (I MOD 5) THEN
········PRINT "FIZZBUZZ"
····ENDIF
NEXT

--------       Test case 2:        --------
-------- (using asterix as indent) --------
FOR I=0 TO 10
****IF I MOD 2 THEN
********PRINT I
NEXT
FOR I=0 TO 10
****IF I MOD 2 THEN
********PRINT I
********FOR I=0 TO 10
************PRINT I
****ENDIF
Error: There was a problem closing the following block(s): FOR, FOR, IF
Error in line number 4: NEXT found when another close was expected
Error in line number 10: ENDIF found when another close was expected