def index(): context = { 'tokens_table': get_language_tokens_table(), } if request.method == 'POST': program = request.form['program'].replace('\r\n', '\n') context['program'] = program inp = StringIO(program) scanner = Scanner(inp) error = None try: scan_tokens = scanner.scan() except PKLanguageError as e: error = e else: context.update({ 'scan_output_table': get_scan_output_table(scanner), 'program_tokens_table': get_program_tokens_table(scanner), 'idents_table': get_idents_table(scanner), 'contants_table': get_contants_table(scanner), 'labels_table': get_labels_table(scanner), }) finally: inp.close() if error is None: syntax_analyzer = SyntaxAnalyzer(scan_tokens) try: syntax_tokens = syntax_analyzer.run() except PKLanguageError as e: error = e else: context['syntax_success'] = True if error is None: rpn_builder = RPNBuilder(syntax_tokens) rpn_tokens = rpn_builder.build() context.update({ 'rpn_steps_table': get_rpn_table(rpn_builder), 'rpn_tokens': ' '.join(rpn_tokens), }) if 'input' in rpn_tokens: error = 'Input operator is not supported in web interface' else: executor = Executor(rpn_tokens) output = executor.execute() context['executor_output'] = output context['error'] = error return render_template('index.html', **context)
def _rpn(input_file): syntax_tokens = _syntax_check(input_file) rpn_builder = RPNBuilder(syntax_tokens) rpn_tokens = rpn_builder.build() click.echo('\nRPN steps table') _print_table(get_rpn_table(rpn_builder)) click.echo('\nResulting RPN') click.echo(rpn_tokens) return rpn_tokens
def test_nested_if(self): tokens = ('if a > b \\n ' 'a := 5 \\n ' 'if b < 3 \\n ' 'b := 6 \\n \\n \\n ' 'print b').split() expected_output = ('a b > 16 goto_if_not ' 'a 5 := ' 'b 3 < 16 goto_if_not ' 'b 6 := ' 'b print').split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_repeat_until(self): tokens = ('var a := 1 \\n ' 'var b := 10 \\n ' 'repeat \\n ' 'a := a + 1 \\n ' 'b := b - 2 \\n \\n ' 'until a > b \\n \\n').split() expected_output = ('a var 1 := ' 'b var 10 := ' 'a a 1 + := ' 'b b 2 - := ' ' a b > 8 goto_if_not').split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_without_brackets_1(self): tokens = 'a + b * c'.split() expected_output = 'a b c * +'.split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_if(self): tokens = 'if a > b \\n a := 5 \\n b := 6 \\n \\n print b'.split() expected_output = 'a b > 11 goto_if_not a 5 := b 6 := b print'.split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_endlines(self): tokens = 'var a := b + c \\n a := d'.split() expected_output = 'a var b c + := a d :='.split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_declare_and_assign(self): tokens = 'var a := b + c'.split() expected_output = 'a var b c + :='.split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)
def test_with_brackets_2(self): tokens = 'a + b * ( c + d ) * ( e + f )'.split() expected_output = 'a b c d + * e f + * +'.split() self.assertEqual(RPNBuilder(tokens).build(), expected_output)