示例#1
0
    def test_not(self):
        str = "int main() { !3; }"
        lex = lexical.Lexical(str)

        # self.assertEqual(8 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(3 + 1, syn.size)

        str = "int main() { !!3; }"
        lex = lexical.Lexical(str)

        # self.assertEqual(8 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(4 + 1, syn.size)

        str = "int main() { !(!1 + 2); }"
        lex = lexical.Lexical(str)

        # self.assertEqual(8 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(6 + 1, syn.size)
示例#2
0
    def generic(self, str, lexSize, synSize):
        lex = lexical.Lexical(str)
        self.assertEqual(lexSize + 6, len(lex))

        syn = syntax.Syntax(lex)
        print(syn.node)
        self.assertEqual(synSize + 1, syn.size)
示例#3
0
    def test_all(self):
        str = "2 + z * 4"
        lex = lexical.Lexical(str)
        self.assertEqual(5, len(lex))

        c = lex.current()
        self.assertEqual(lexical.categories_const.TOKEN_VALUE, c.category)
        self.assertEqual(2, c.value)


        c = lex.nextToken()
        plus = c
        self.assertEqual(lexical.categories_const.TOKEN_PLUS, c.category)

        c = lex.nextToken()
        self.assertEqual(lexical.categories_const.TOKEN_IDENT, c.category)
        self.assertEqual("z", c.identifier)

        c = lex.nextToken()
        self.assertEqual(lexical.categories_const.TOKEN_MULTIPLICATION, c.category)

        c = lex.undo()

        self.assertEqual(lexical.categories_const.TOKEN_IDENT, c.category)
        self.assertEqual("z", c.identifier)

        c = lex.nextToken()
        self.assertEqual(lexical.categories_const.TOKEN_MULTIPLICATION, c.category)

        c = lex.undo(plus)
        self.assertEqual(lexical.categories_const.TOKEN_PLUS, c.category)
示例#4
0
    def test_variable(self):
        str = "x;"
        lex = lexical.Lexical(str)
        syn = syntax.Syntax(lex, run=False)
        node = syn.P(lex.current())

        self.assertEqual(syntax.nodes_const.NODE_VAR_REF, node.type)
        self.assertEqual("x", node.identifier)
示例#5
0
    def test_constant(self):
        str = " 3 "
        lex = lexical.Lexical(str)
        syn = syntax.Syntax(lex, run=False)
        node = syn.P(lex.current())

        self.assertEqual(syntax.nodes_const.NODE_CONSTANT, node.type)
        self.assertEqual(3, node.value)
示例#6
0
    def test_error(self):
        str = "int main() { 3 * (2 + 4) * 1 ( }"
        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)

        str = "int main() { 3 * (2 + 4) * 1 1 }"
        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)

        str = "int main() { 3 * (2 + 4) * 1 * }"
        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)

        str = "int main() { 3 * (2 + 4) * 1 ) }"
        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)

        str = "int main() { 3 * (2 + 4) * 1 - }"
        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)
示例#7
0
    def test_global(self):
        str = "int main() { 3 + x * 2 * -z; }"
        lex = lexical.Lexical(str)

        # self.assertEqual(8 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(9 + 1, syn.size)
示例#8
0
    def test_declaration(self):
        str = "int main() { int a; }"

        lex = lexical.Lexical(str)

        self.assertEqual(3 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(1 + 1, syn.size)
示例#9
0
    def test_if_else(self):
        str = "int main() { if (3 == 2) { 2 + 1; 4 + 3; } else { 3 + 5; } }"

        lex = lexical.Lexical(str)

        self.assertEqual(23 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(18 + 1, syn.size)
示例#10
0
    def test_if(self):
        str = "int main() { if (3 == 2) { 2 + 1; 4 + 3; } }"

        lex = lexical.Lexical(str)

        self.assertEqual(16 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(13 + 1, syn.size)
示例#11
0
    def test_affectation(self):
        str = "int main() { a = 10 + 2; }"

        lex = lexical.Lexical(str)

        self.assertEqual(6 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(4 + 1, syn.size)
示例#12
0
    def test_out_addition(self):
        str = "int main() { out 2 + 1; }"

        lex = lexical.Lexical(str)

        self.assertEqual(5 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(4 + 1, syn.size)
示例#13
0
    def test_out(self):
        str = "int main() { out 2; }"

        lex = lexical.Lexical(str)

        self.assertEqual(3 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(2 + 1, syn.size)
示例#14
0
    def test_statement_equals(self):

        str = "int main() { 3 == 1; }"
        lex = lexical.Lexical(str)

        print(', '.join([t.category.name for t in lex.tokens]))
        self.assertEqual(4 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(4 + 1, syn.size)
示例#15
0
    def test_block(self):

        str = 'int main() { { 3 + 3; 2 +2; } }'

        lex = lexical.Lexical(str)

        self.assertEqual(10 + 6, len(lex))

        syn = syntax.Syntax(lex)

        self.assertEqual(9 + 1, syn.size)
示例#16
0
    def test_if_malformated(self):

        str = "if ( 1 || b { 1 + 2; }"

        lex = lexical.Lexical(str)

        self.assertEqual(11, len(lex))

        with self.assertRaises(CompileException) as e:
            syntax.Syntax(lex)
        print(e.exception)
示例#17
0
    def test_cond_e(self):

        str = "3 == 1;"
        lex = lexical.Lexical(str)

        print(', '.join([t.category.name for t in lex.tokens]))
        self.assertEqual(4, len(lex))

        syn = syntax.Syntax(lex, run=False)
        syn.E(lex.current())

        self.assertEqual(3, syn.size)
示例#18
0
    def test_unitary_minus_ident(self):
        str = "-y;"
        lex = lexical.Lexical(str)
        syn = syntax.Syntax(lex, run=False)
        node = syn.P(lex.current())

        self.assertEqual(syntax.nodes_const.NODE_UNITARY_MINUS, node.type)
        self.assertEqual(1, len(node.children))

        child = node.children[0]

        self.assertEqual(syntax.nodes_const.NODE_VAR_REF, child.type)
        self.assertEqual('y', child.identifier)
示例#19
0
    def test_unitary_minus_const(self):
        str = "-4"
        lex = lexical.Lexical(str)
        syn = syntax.Syntax(lex, run=False)
        node = syn.P(lex.current())

        self.assertEqual(syntax.nodes_const.NODE_UNITARY_MINUS, node.type)
        self.assertEqual(1, len(node.children))

        child = node.children[0]

        self.assertEqual(syntax.nodes_const.NODE_CONSTANT, child.type)
        self.assertEqual(4, child.value)
示例#20
0
    def test_cond(self):

        token_cond = ["&&", "||", "==", "!=", "<", "<=", ">", ">="]

        for tok in token_cond:
            print tok
            str = "int main() { 3 %s 1; }" % tok
            lex = lexical.Lexical(str)

            print(', '.join([t.category.name for t in lex.tokens]))
            self.assertEqual(4 + 6, len(lex))

            syn = syntax.Syntax(lex)

            self.assertEqual(4 + 1, syn.size)
示例#21
0
def run(str, skip_print=False, out=sys.stdout):

    nbLineRuntime = len(runtime().split('\n')) - 1

    str = runtime() + str

    tableSymbol = table_symbol.TableSymbol()

    lex = lexical.Lexical(str, nbLineRuntime)

    syn = syntax.Syntax(lex)
    node = syn.node

    syn.draw()

    sem = semantic.Semantic(tableSymbol)
    sem.run(node)


    node = optimisator.Optimisator(node).node
    g = gencode.CodeGenerator(node)
    if not skip_print:
        print(g.getOutput(), file=out)