示例#1
0
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)
示例#2
0
 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)
示例#3
0
 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)
示例#4
0
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
示例#5
0
 def test_without_brackets_1(self):
     tokens = 'a + b * c'.split()
     expected_output = 'a b c * +'.split()
     self.assertEqual(RPNBuilder(tokens).build(), expected_output)
示例#6
0
 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)
示例#7
0
 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)
示例#8
0
 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)
示例#9
0
 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)