OpenCores
URL https://opencores.org/ocsvn/tcp_socket/tcp_socket/trunk

Subversion Repositories tcp_socket

[/] [tcp_socket/] [trunk/] [chips2/] [chips/] [compiler/] [parser.py] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 jondawson
__author__ = "Jon Dawson"
2
__copyright__ = "Copyright (C) 2012, Jonathan P Dawson"
3
__version__ = "0.1"
4
 
5
from parse_tree import *
6
from tokens import Tokens
7
from allocator import Allocator
8
 
9
class Parser:
10
 
11
    """Turn the C input file into a tree of expressions and statements."""
12
 
13
    def __init__(self, input_file, reuse, initialize_memory):
14
        self.scope = {}
15
        self.function = None
16
        self.loop = None
17
        self.tokens = Tokens(input_file)
18
        self.allocator = Allocator(reuse)
19
        self.structs = []
20
        self.initialize_memory = initialize_memory
21
 
22
    def parse_process(self):
23
        process = Process()
24
        process.allocator = self.allocator
25
        process.inputs = []
26
        process.outputs = []
27
        process.functions = []
28
        while not self.tokens.end():
29
            if self.tokens.peek() == "struct":
30
                self.parse_define_struct()
31
            elif self.tokens.peek() == "typedef":
32
                self.parse_typedef_struct()
33
            else:
34
                process.functions.append(self.parse_function())
35
        process.main = self.main
36
        return process
37
 
38
    def parse_type_specifier(self):
39
        type_specifiers = []
40
 
41
        while self.tokens.peek() in ["signed", "unsigned", "short", "long", "char", "int", "void"] + self.structs:
42
            type_specifiers.append(self.tokens.get())
43
 
44
        signed = True
45
        if "unsigned" in type_specifiers:
46
            signed = False
47
            if "signed" in type_specifiers:
48
                self.tokens.error("Cannot be signed and unsigned")
49
 
50
        size = 2
51
        if "long" in type_specifiers:
52
            if "short" in type_specifiers:
53
                self.tokens.error("Cannot be long and short")
54
            size = 4
55
 
56
        type_ = "int"
57
        for i in type_specifiers:
58
            if i in self.structs:
59
                type_ = i
60
                size = 2
61
                signed = False
62
 
63
        if "void" in type_specifiers:
64
            type_ = "void"
65
            size = 2
66
            signed = False
67
 
68
 
69
        return type_, size, signed
70
 
71
    def parse_function(self):
72
        function = Function()
73
        function.allocator = self.allocator
74
        stored_scope = self.scope
75
        type_, size, signed = self.parse_type_specifier()
76
        name = self.tokens.get()
77
 
78
        #check if it is a global declaration
79
        if self.tokens.peek() != "(":
80
            return self.parse_global_declaration(type_, size, signed, name)
81
 
82
        #otherwise continue parsing a function
83
        self.tokens.expect("(")
84
        function.name = name
85
        function.type_ = type_
86
        function.size = size
87
        function.signed = signed
88
        function.return_address = self.allocator.new(2, function.name+" return address")
89
        if type_ != "void":
90
            function.return_value = self.allocator.new(function.size, function.name+" return value")
91
        function.arguments = []
92
        while self.tokens.peek() != ")":
93
            argument_type, argument_size, argument_signed = self.parse_type_specifier()
94
            if argument_type in ["void"]:
95
                self.tokens.error("argument cannot be void")
96
            argument = self.tokens.get()
97
            element_type = None
98
            element_size = None
99
            element_signed = None
100
            if self.tokens.peek() == "[":
101
                self.tokens.expect("[")
102
                self.tokens.expect("]")
103
                element_type = argument_type
104
                element_size = argument_size
105
                element_signed = argument_signed
106
                argument_type+="[]"
107
                argument_size = 2
108
                argument_signed = False
109
 
110
            function.arguments.append(Argument(
111
                argument,
112
                argument_type,
113
                argument_size,
114
                argument_signed,
115
                self,
116
                element_type,
117
                element_size,
118
                element_signed))
119
            if self.tokens.peek() == ",":
120
                self.tokens.expect(",")
121
            else:
122
                break
123
        self.tokens.expect(")")
124
        self.function = function
125
        function.statement = self.parse_statement()
126
        if type_ != "void" and not hasattr(function, "return_statement"):
127
            self.tokens.error("Function must have a return statement")
128
        self.function = None
129
        self.scope = stored_scope
130
        self.scope[function.name] = function
131
        #main thread is last function
132
        self.main = function
133
        return function
134
 
135
    def parse_break(self):
136
        break_ = Break()
137
        break_.loop = self.loop
138
        self.tokens.expect("break")
139
        self.tokens.expect(";")
140
        return break_
141
 
142
    def parse_continue(self):
143
        continue_ = Continue()
144
        continue_.loop = self.loop
145
        self.tokens.expect("continue")
146
        self.tokens.expect(";")
147
        return continue_
148
 
149
    def parse_return(self):
150
        return_ = Return()
151
        return_.function = self.function
152
        self.function.return_statement = return_
153
        self.tokens.expect("return")
154
        if hasattr(self.function, "return_value"):
155
            return_.expression = self.parse_expression()
156
        self.tokens.expect(";")
157
        return return_
158
 
159
    def parse_assert(self):
160
        assert_ = Assert()
161
        assert_.allocator = self.allocator
162
        self.tokens.expect("assert")
163
        self.tokens.expect("(")
164
        assert_.expression = self.parse_expression()
165
        self.tokens.expect(")")
166
        self.tokens.expect(";")
167
        assert_.line = self.tokens.lineno
168
        assert_.filename = self.tokens.filename
169
        return assert_
170
 
171
    def parse_report(self):
172
        report_ = Report()
173
        report_.allocator = self.allocator
174
        self.tokens.expect("report")
175
        self.tokens.expect("(")
176
        report_.expression = self.parse_expression()
177
        self.tokens.expect(")")
178
        self.tokens.expect(";")
179
        report_.line = self.tokens.lineno
180
        report_.filename = self.tokens.filename
181
        return report_
182
 
183
    def parse_wait_clocks(self):
184
        wait_clocks = WaitClocks()
185
        wait_clocks.allocator = self.allocator
186
        self.tokens.expect("wait_clocks")
187
        self.tokens.expect("(")
188
        wait_clocks.expression = self.parse_expression()
189
        self.tokens.expect(")")
190
        self.tokens.expect(";")
191
        wait_clocks.line = self.tokens.lineno
192
        return wait_clocks
193
 
194
    def parse_statement(self):
195
        if self.tokens.peek() in ["unsigned", "int", "short", "long", "char"] + self.structs:
196
            return self.parse_compound_declaration()
197
        elif self.tokens.peek() == "struct":
198
            return self.parse_struct_declaration()
199
        elif self.tokens.peek() == "if":
200
            return self.parse_if()
201
        elif self.tokens.peek() == "while":
202
            return self.parse_while()
203
        elif self.tokens.peek() == "for":
204
            return self.parse_for()
205
        elif self.tokens.peek() == "return":
206
            return self.parse_return()
207
        elif self.tokens.peek() == "break":
208
            return self.parse_break()
209
        elif self.tokens.peek() == "continue":
210
            return self.parse_continue()
211
        elif self.tokens.peek() == "{":
212
            return self.parse_block()
213
        elif self.tokens.peek() == "assert":
214
            return self.parse_assert()
215
        elif self.tokens.peek() == "report":
216
            return self.parse_report()
217
        elif self.tokens.peek() == "switch":
218
            return self.parse_switch()
219
        elif self.tokens.peek() == "case":
220
            return self.parse_case()
221
        elif self.tokens.peek() == "default":
222
            return self.parse_default()
223
        elif self.tokens.peek() == "wait_clocks":
224
            return self.parse_wait_clocks()
225
        else:
226
            expression = self.parse_discard()
227
            self.tokens.expect(";")
228
            return expression
229
 
230
    def parse_discard(self):
231
        return DiscardExpression(self.parse_expression(), self.allocator)
232
 
233
    def parse_assignment(self):
234
        assignment_operators = [
235
            "=", "+=", "-=", "*=", "/=", "%=", "&=", "|=", "<<=", ">>="
236
        ]
237
        lvalue = self.parse_ternary_expression()
238
        if self.tokens.peek() in assignment_operators:
239
            if not hasattr(lvalue, "declaration"):
240
                self.tokens.error(
241
                    "left hand operand of assignment is not modifiable"
242
                )
243
            operator = self.tokens.get()
244
            if operator == "=":
245
                expression = self.parse_ternary_expression()
246
            else:
247
                expression = Binary(
248
                    operator[:-1],
249
                    lvalue,
250
                    self.parse_ternary_expression(),
251
                    self.allocator
252
                )
253
            if not compatible(lvalue.type_, expression.type_):
254
                self.tokens.error(
255
                    "type mismatch in assignment"
256
                )
257
            return Assignment(lvalue, expression, self.allocator)
258
        else:
259
            return lvalue
260
 
261
    def parse_if(self):
262
        if_ = If()
263
        if_.allocator = self.allocator
264
        self.tokens.expect("if")
265
        self.tokens.expect("(")
266
        if_.expression = self.parse_expression()
267
        if if_.expression.type_ not in ["unsigned", "int", "short", "long", "char"]:
268
            self.tokens.error(
269
                "if statement conditional must be an integer like expression"
270
            )
271
        self.tokens.expect(")")
272
        if_.true_statement = self.parse_statement()
273
        if self.tokens.peek() == "else":
274
            self.tokens.expect("else")
275
            if_.false_statement = self.parse_statement()
276
        else:
277
            if_.false_statement = None
278
        return if_
279
 
280
    def parse_switch(self):
281
        switch = Switch()
282
        switch.cases = {}
283
        self.tokens.expect("switch")
284
        self.tokens.expect("(")
285
        expression = self.parse_expression()
286
        if expression.type_ not in ["unsigned", "int", "short", "long", "char"]:
287
            self.tokens.error(
288
                "switch statement expression must be an integer like expression"
289
            )
290
        self.tokens.expect(")")
291
        stored_loop = self.loop
292
        self.loop = switch
293
        statement = self.parse_statement()
294
        self.loop = stored_loop
295
        switch.expression = expression
296
        switch.allocator = self.allocator
297
        switch.statement = statement
298
        return switch
299
 
300
    def parse_case(self):
301
        self.tokens.expect("case")
302
        expression = self.parse_expression()
303
        if expression.type_ not in ["int"]:
304
            self.tokens.error(
305
                "case expression must be an integer like expression"
306
            )
307
        self.tokens.expect(":")
308
        try:
309
            expression = value(expression)
310
            case = Case()
311
            self.loop.cases[expression] =    case
312
        except NotConstant:
313
            self.tokens.error("case expression must be constant")
314
        except AttributeError:
315
            self.tokens.error(
316
                "case statements may only be use inside a switch statment"
317
            )
318
        return case
319
 
320
    def parse_default(self):
321
        self.tokens.expect("default")
322
        self.tokens.expect(":")
323
        default = Default()
324
        if not hasattr(self.loop, "cases"):
325
            self.tokens.error(
326
                "default statements may only be used inside a switch statment"
327
            )
328
        if hasattr(self.loop, "default"):
329
            self.tokens.error(
330
                "A switch statement may only have one default statement"
331
            )
332
        self.loop.default=default
333
        return default
334
 
335
    def parse_while(self):
336
        loop = Loop()
337
        self.tokens.expect("while")
338
        self.tokens.expect("(")
339
        expression = self.parse_expression()
340
        self.tokens.expect(")")
341
        stored_loop = self.loop
342
        self.loop = loop
343
        statement = self.parse_statement()
344
        self.loop = stored_loop
345
 
346
        if_ = If()
347
        loop.statement = if_
348
        break_ = Break()
349
        break_.loop = loop
350
        if_.allocator = self.allocator
351
        if expression.type_ not in ["int"]:
352
            self.tokens.error(
353
                "if statement conditional must be an integer like expression"
354
            )
355
        if_.expression = expression
356
        if_.false_statement = break_
357
        if_.true_statement = statement
358
 
359
        return loop
360
 
361
    def parse_for(self):
362
        for_ = For()
363
        for_.allocator = self.allocator
364
        self.tokens.expect("for")
365
        self.tokens.expect("(")
366
        if self.tokens.peek() != ";":
367
            for_.statement1 = self.parse_discard()
368
        self.tokens.expect(";")
369
        if self.tokens.peek() != ";":
370
            for_.expression = self.parse_expression()
371
            if for_.expression.type_ not in ["unsigned", "int", "short", "long", "char"]:
372
                self.tokens.error(
373
                    "for statement conditional must be an integer like expression"
374
                )
375
        self.tokens.expect(";")
376
        if self.tokens.peek() != ")":
377
            for_.statement2 = self.parse_discard()
378
        self.tokens.expect(")")
379
        stored_loop = self.loop
380
        self.loop = for_
381
        for_.statement3 = self.parse_statement()
382
        self.loop = stored_loop
383
        return for_
384
 
385
    def parse_block(self):
386
        block = Block()
387
        stored_scope = self.scope
388
        self.tokens.expect("{")
389
        block.statements = []
390
        while self.tokens.peek() != "}":
391
            block.statements.append(self.parse_statement())
392
        self.tokens.expect("}")
393
        self.scope = stored_scope
394
        return block
395
 
396
    def parse_struct_body(self):
397
        self.tokens.expect("{")
398
        members = {}
399
        while self.tokens.peek() != "}":
400
            type_, size, signed = self.parse_type_specifier()
401
            name = self.tokens.get()
402
            members[name] = self.parse_declaration(type_, size, signed, name)
403
            self.tokens.expect(";")
404
        self.tokens.expect("}")
405
        return members
406
 
407
    def parse_typedef_struct(self):
408
        self.tokens.expect("typedef")
409
        self.tokens.expect("struct")
410
        declaration = StructDeclaration(self.parse_struct_body())
411
        name = self.tokens.get()
412
        self.tokens.expect(";")
413
        self.scope[name] = declaration
414
        self.structs.append(name)
415
 
416
    def parse_define_struct(self):
417
        self.tokens.expect("struct")
418
        name = self.tokens.get()
419
        declaration = StructDeclaration(self.parse_struct_body())
420
        self.tokens.expect(";")
421
        self.scope[name] = declaration
422
 
423
    def parse_struct_declaration(self):
424
        self.tokens.expect("struct")
425
        struct_name = self.tokens.get()
426
        name = self.tokens.get()
427
        self.tokens.expect(";")
428
        instance = self.scope[struct_name].instance()
429
        self.scope[name] = instance
430
        return instance
431
 
432
    def parse_global_declaration(self, type_, size, signed, name):
433
        instances = []
434
        while True:
435
            instance = self.parse_declaration(type_, size, signed, name).instance()
436
            self.scope[name] = instance
437
            instances.append(instance)
438
            if self.tokens.peek() == ",":
439
                self.tokens.expect(",")
440
            else:
441
                break
442
            name = self.tokens.get()
443
        self.tokens.expect(";")
444
        return CompoundDeclaration(instances)
445
 
446
    def parse_compound_declaration(self):
447
        type_, size, signed = self.parse_type_specifier()
448
        instances = []
449
        while True:
450
            name = self.tokens.get()
451
            instance = self.parse_declaration(type_, size, signed, name).instance()
452
            self.scope[name] = instance
453
            instances.append(instance)
454
            if self.tokens.peek() == ",":
455
                self.tokens.expect(",")
456
            else:
457
                break
458
            name = None
459
        self.tokens.expect(";")
460
        return CompoundDeclaration(instances)
461
 
462
    def parse_declaration(self, type_, size, signed, name):
463
        #struct declaration
464
        if type_ in self.structs:
465
            declaration = self.scope[type_]
466
        elif type_ in ["int"]:
467
            #array declaration 
468
            if self.tokens.peek() == "[":
469
                array_size = None
470
                self.tokens.expect("[")
471
                if self.tokens.peek() != "]":
472
                    array_size = int(self.tokens.get())
473
                self.tokens.expect("]")
474
                initializer = None
475
                if self.tokens.peek() == "=":
476
                    self.tokens.expect("=")
477
                    initializer = self.tokens.get()
478
                    initializer = [ord(i) for i in initializer.strip('"').decode("string_escape")] + [0]
479
                    array_size = len(initializer)
480
                if array_size is None:
481
                    self.tokens.error("array size must be specified if not initialized")
482
                array_type=type_+"[]"
483
                initialize_memory = self.initialize_memory
484
                declaration = ArrayDeclaration(self.allocator,
485
                                               array_size,
486
                                               array_type,
487
                                               type_,
488
                                               size,
489
                                               signed,
490
                                               initializer,
491
                                               self.initialize_memory)
492
 
493
            #simple variable declaration 
494
            else:
495
                if self.tokens.peek() == "=":
496
                    self.tokens.expect("=")
497
                    initializer = self.parse_ternary_expression()
498
                else:
499
                    initializer = Constant(0)
500
                declaration = VariableDeclaration(
501
                    self.allocator,
502
                    initializer,
503
                    name,
504
                    type_,
505
                    size,
506
                    signed
507
                )
508
 
509
        return declaration
510
 
511
    def parse_expression(self):
512
        expression = self.parse_assignment()
513
        return expression
514
 
515
    def parse_ternary_expression(self):
516
        expression = constant_fold(self.parse_or_expression())
517
        while self.tokens.peek() in ["?"]:
518
            self.tokens.expect("?")
519
            true_expression = constant_fold(self.parse_or_expression())
520
            self.tokens.expect(":")
521
            false_expression = constant_fold(self.parse_or_expression())
522
            expression = OR(AND(expression, true_expression), false_expression)
523
        return expression
524
 
525
    def parse_or_expression(self):
526
        expression = self.parse_and_expression()
527
        while self.tokens.peek() in ["||"]:
528
            self.tokens.expect("||")
529
            expression = OR(expression, self.parse_and_expression())
530
        return expression
531
 
532
    def parse_and_expression(self):
533
        expression = self.parse_binary_expression(["|"])
534
        while self.tokens.peek() in ["&&"]:
535
            self.tokens.expect("&&")
536
            expression = AND(expression, self.parse_binary_expression(["|"]))
537
        return expression
538
 
539
    def substitute_function(self, operator, left, right):
540
        #Some things can't be implemented in verilog, substitute them with a function
541
        if operator in ["/", "%"]:
542
            function_call = FunctionCall()
543
            function_call.arguments = [left, right]
544
            if operator == "/":
545
                if left.signed and right.signed:
546
                    if max(left.size, right.size) == 4:
547
                        function_call.function = self.scope["long_divide_xxxx"]
548
                    else:
549
                        function_call.function = self.scope["divide_xxxx"]
550
                else:
551
                    if max(left.size, right.size) == 4:
552
                        function_call.function = self.scope["long_unsigned_divide_xxxx"]
553
                    else:
554
                        function_call.function = self.scope["unsigned_divide_xxxx"]
555
            elif operator == "%":
556
                if left.signed and right.signed:
557
                    if max(left.size, right.size) == 4:
558
                        function_call.function = self.scope["long_modulo_xxxx"]
559
                    else:
560
                        function_call.function = self.scope["modulo_xxxx"]
561
                else:
562
                    if max(left.size, right.size) == 4:
563
                        function_call.function = self.scope["long_unsigned_modulo_xxxx"]
564
                    else:
565
                        function_call.function = self.scope["unsigned_modulo_xxxx"]
566
            function_call.type_ = function_call.function.type_
567
            function_call.size = function_call.function.size
568
            function_call.signed = function_call.function.signed
569
            return function_call
570
        else:
571
            return Binary(
572
                operator,
573
                left,
574
                right,
575
                self.allocator
576
            )
577
 
578
    def parse_binary_expression(self, operators):
579
        operator_precedence = {
580
                "|": ["^"],
581
                "^": ["&"],
582
                "&": ["==", "!="],
583
                "==": ["<", ">", "<=", ">="],
584
                "<": ["<<", ">>"],
585
                "<<": ["+", "-"],
586
                "+": ["*", "/", "%"],
587
        }
588
        if operators[0] not in operator_precedence:
589
            expression = self.parse_unary_expression()
590
            while self.tokens.peek() in operators:
591
                operator = self.tokens.get()
592
                right = self.parse_unary_expression()
593
                expression = self.substitute_function(operator, expression, right)
594
            return expression
595
        else:
596
            next_operators = operator_precedence[operators[0]]
597
            expression = self.parse_binary_expression(next_operators)
598
            while self.tokens.peek() in operators:
599
                expression = Binary(
600
                    self.tokens.get(),
601
                    expression,
602
                    self.parse_binary_expression(next_operators),
603
                    self.allocator
604
                )
605
            return expression
606
 
607
    def parse_unary_expression(self):
608
        if self.tokens.peek() == "!":
609
            operator = self.tokens.get()
610
            expression = self.parse_postfix_expression()
611
            return Binary("==", expression, Constant(0), self.allocator)
612
        elif self.tokens.peek() == "-":
613
            operator = self.tokens.get()
614
            expression = self.parse_postfix_expression()
615
            return Binary("-", Constant(0), expression, self.allocator)
616
        elif self.tokens.peek() == "~":
617
            operator = self.tokens.get()
618
            expression = self.parse_postfix_expression()
619
            return Unary("~", expression, self.allocator)
620
        elif self.tokens.peek() == "sizeof":
621
            operator = self.tokens.get()
622
            expression = self.parse_unary_expression()
623
            return SizeOf(expression)
624
        else:
625
            return self.parse_postfix_expression()
626
 
627
    def parse_postfix_expression(self):
628
        expression = self.parse_paren_expression()
629
        while self.tokens.peek() in ["++", "--"]:
630
            operator = self.tokens.get()
631
            expression = PostIncrement(
632
                operator[:-1],
633
                expression,
634
                self.allocator
635
            )
636
        return expression
637
 
638
    def parse_paren_expression(self):
639
        if self.tokens.peek() == "(":
640
            self.tokens.expect("(")
641
            expression = self.parse_expression()
642
            self.tokens.expect(")")
643
        else:
644
            expression = self.parse_number_or_variable()
645
        return expression
646
 
647
    def parse_number_or_variable(self):
648
        if self.tokens.peek()[0].isalpha():
649
            name = self.tokens.get()
650
            if self.tokens.peek() == "(":
651
                return self.parse_function_call(name)
652
            else:
653
                return self.parse_variable(name)
654
        else:
655
            return self.parse_number()
656
 
657
    def parse_file_read(self):
658
        self.tokens.expect("(")
659
        file_name = self.tokens.get()
660
        file_name = file_name.strip('"').decode("string_escape")
661
        self.tokens.expect(")")
662
        return FileRead(file_name)
663
 
664
    def parse_file_write(self):
665
        self.tokens.expect("(")
666
        expression = self.parse_expression()
667
        self.tokens.expect(",")
668
        file_name = self.tokens.get()
669
        file_name = file_name.strip('"').decode("string_escape")
670
        self.tokens.expect(")")
671
        return FileWrite(file_name, expression)
672
 
673
    def parse_input(self, name):
674
        input_name = name.replace("input_", "")
675
        self.tokens.expect("(")
676
        self.tokens.expect(")")
677
        return Input(input_name)
678
 
679
    def parse_ready(self, name):
680
        input_name = name.replace("ready_", "")
681
        self.tokens.expect("(")
682
        self.tokens.expect(")")
683
        return Ready(input_name)
684
 
685
    def parse_output(self, name):
686
        output_name = name.replace("output_", "")
687
        self.tokens.expect("(")
688
        expression = self.parse_expression()
689
        self.tokens.expect(")")
690
        return Output(output_name, expression)
691
 
692
    def parse_function_call(self, name):
693
        if name.startswith("input_"):
694
            return self.parse_input(name)
695
        if name.startswith("ready_"):
696
            return self.parse_ready(name)
697
        if name.startswith("output_"):
698
            return self.parse_output(name)
699
        if name == "file_read":
700
            return self.parse_file_read()
701
        if name == "file_write":
702
            return self.parse_file_write()
703
        function_call = FunctionCall()
704
        function_call.arguments = []
705
        self.tokens.expect("(")
706
        while self.tokens.peek() != ")":
707
            function_call.arguments.append(self.parse_expression())
708
            if self.tokens.peek() == ",":
709
                self.tokens.expect(",")
710
            else:
711
                break
712
        self.tokens.expect(")")
713
 
714
        if name not in self.scope:
715
            self.tokens.error("Unknown function: %s"%name)
716
 
717
        function_call.function = self.scope[name]
718
        function_call.type_ = function_call.function.type_
719
        function_call.size = function_call.function.size
720
        function_call.signed = function_call.function.signed
721
        required_arguments = len(function_call.function.arguments)
722
        actual_arguments = len(function_call.arguments)
723
        if required_arguments != actual_arguments:
724
            self.tokens.error("Function %s takes %s arguments %s given."%(
725
                name,
726
                len(function_call.function.arguments),
727
                len(function_call.arguments)
728
            ))
729
        required_arguments = function_call.function.arguments
730
        actual_arguments = function_call.arguments
731
        for required, actual in zip(required_arguments, actual_arguments):
732
            if not compatible(required.type_, actual.type_):
733
                self.tokens.error("Type mismatch expected type : %s got: %s."%(
734
                    required.type_,
735
                    actual.type_
736
                ))
737
 
738
 
739
        return function_call
740
 
741
    def parse_number(self):
742
        token = self.tokens.get()
743
        size = 2
744
        signed = True
745
        if token.startswith("'"):
746
            try:
747
                token = eval(token)
748
                value = ord(token)
749
            except SyntaxError:
750
                self.tokens.error("%s is not a character literal"%token)
751
        elif token.startswith('"'):
752
            try:
753
                initializer = [ord(i) for i in token.strip('"').decode("string_escape")] + [0]
754
                size = len(initializer)
755
                initialize_memory = self.initialize_memory
756
                declaration = ArrayDeclaration(
757
                    self.allocator,
758
                    size,
759
                    "int[]",
760
                    "int",
761
                    2,
762
                    False,
763
                    initializer,
764
                    self.initialize_memory)
765
                return declaration.instance()
766
            except SyntaxError:
767
                self.tokens.error("%s is not a character literal"%token)
768
        else:
769
            try:
770
                if "U" in token.upper():
771
                    signed = False
772
                if "L" in token.upper():
773
                    size = 4
774
                token = token.upper().replace("U", "")
775
                value = int(eval(token))
776
 
777
                if signed:
778
                    if value > 2**((size * 8)-1) - 1:
779
                        self.tokens.error("value too large")
780
                    if value < -(2**((size * 8)-1)):
781
                        self.tokens.error("value too small")
782
                else:
783
                    if value > 2**(size * 8) - 1:
784
                        self.tokens.error("value too large")
785
                    if value < 0:
786
                        self.tokens.error("value too small")
787
 
788
            except SyntaxError:
789
                self.tokens.error("%s is not an integer literal"%token)
790
        return Constant(value, size, signed)
791
 
792
    def parse_variable(self, name):
793
        if name not in self.scope:
794
            self.tokens.error("Unknown variable: %s"%name)
795
        instance = self.scope[name]
796
        return self.parse_variable_array_struct(instance)
797
 
798
    def parse_variable_array_struct(self, instance):
799
        if instance.type_ in ["unsigned", "int", "short", "long", "char"]:
800
            return Variable(instance, self.allocator)
801
        elif instance.type_.endswith("[]"):
802
            if self.tokens.peek() == "[":
803
                self.tokens.expect("[")
804
                index_expression = self.parse_expression()
805
                self.tokens.expect("]")
806
                if index_expression.type_ not in ["unsigned", "int", "short", "long", "char"]:
807
                    self.tokens.error(
808
                        "array indices must be an integer like expression"
809
                    )
810
                return ArrayIndex(instance, index_expression, self.allocator)
811
            else:
812
                return Array(instance, self.allocator)
813
        elif instance.type_ == "struct":
814
            self.tokens.expect(".")
815
            member = self.tokens.get()
816
            instance = instance.members[member]
817
            return self.parse_variable_array_struct(instance)
818
 
819
def compatible(left, right):
820
    return left == right

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.