aboutsummaryrefslogtreecommitdiff
path: root/lexer.py
blob: 168858e9a271399476fd4d9d4a10291a292d5207 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from enum import Enum
from symbol import LexToken, TablaLex, tokens

def inicio_lexer(data):
    tabla = TablaLex()
    
    selector = ''
    recol_string = ''
    recol_caracter = ''
    recol_comentario = ''
    recol_operador = ''
    
    for c in data + "\n":
        print (c + ' (' + selector + ')')
        
        if selector == '':
            # Entradas a tokens
            if c == '"':
                selector = 'STRING_LIT'
                continue
            elif c == '\'':
                selector = 'CHAR_LIT'
                continue
            elif c == '/':
                recol_comentario = '/'
            elif (c == '=' or c == '+' or c == '-' or c == '&' or c == '|') and len(recol_operador) == 0:
                recol_operador = c
                continue
            elif c == '!' or c == '<' or c == '>':
                recol_operador = c
                continue
            elif c == '{':
                tabla.insertar(LexToken('{', None, None, 1))
            elif c == '}':
                tabla.insertar(LexToken('}', None, None, 1))
            elif c == '(':
                tabla.insertar(LexToken('(', None, None, 1))
            elif c == ')':
                tabla.insertar(LexToken(')', None, None, 1))
            elif c == ',':
                tabla.insertar(LexToken(',', None, None, 1))
            elif c == ';':
                tabla.insertar(LexToken(';', None, None, 1))
            elif c == '*':
                tabla.insertar(LexToken('*', None, None, 1))

            # Apertura de comentario
            if recol_comentario == '/' and c == '*':
                selector = 'COMMENT'
                recol_comentario = ''
                continue

            # Apertura de operador compuesto
            if len(recol_operador) > 0:
                rc = recol_operador + c
                if (rc == '>=' or rc == '<=' or rc == '==' or rc == '!=' or
                    rc == '&&' or rc == '||' or rc == '++' or rc == '--'):
                    # Operador compuesto
                    tabla.insertar(LexToken(rc, None, None, 1))
                    recol_operador = ''
                    continue
                else:
                    # Operador simple
                    tabla.insertar(LexToken(recol_operador, None, None, 1))
                    recol_operador = ''
        
        # Cadenas de texto
        if selector == 'STRING_LIT':
            if c == '"':
                tabla.insertar(LexToken('STRING_LIT', None, recol_string, 1))
                selector = ''
                recol_string = ''
            else:
                recol_string += c
            continue

        # Caracteres
        if selector == 'CHAR_LIT':
            if len(recol_caracter) > 1:
                print ('Error: más de un caracter en una literal de caracter')
                break
            if c == '\'':
                if len(recol_caracter) == 0:
                    print ('Error: literal de caracter vacía')
                    break
                tabla.insertar(LexToken('CHAR_LIT', None, recol_caracter, 1))
                selector = ''
                recol_caracter = ''
                continue
            else:
                recol_caracter += c

        # Comentarios
        if selector == 'COMMENT':
            if c == '*':
                recol_comentario = c
                continue
            elif recol_comentario == '*':
                if c == '/':
                    selector = ''
                    recol_comentario = ''
                    continue
                else:
                    recol_comentario = ''
                    continue

    # Imprimir tabla de símbolos
    print (str(tabla))