-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexparam.py
101 lines (89 loc) · 2.08 KB
/
lexparam.py
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
#! /usr/bin/python
# -*- coding: utf-8 -*-
from Exceptions import *
####################################
# Integrantes: #
# - Lorenzo Fundaro 06-39559 #
# - Marion Carambula 06-39312 #
####################################
###############################################################
# lexparam.py: #
# En este script se definiran las palabras reservadas #
# los tokens, las reglas gramaticas para cada token, #
# los caracteres ignorados y los errores. #
###############################################################
# Lista de palabras reservadas
reserved = {
'fun' : 'FUN',
'nuf' : 'NUF',
'let' : 'LET',
'tel' : 'TEL',
'in' : 'IN',
'if' : 'IF',
'then': 'THEN',
'else': 'ELSE',
'fi' : 'FI',
'true': 'TRUE',
'false' : 'FALSE'
}
# Lista de tokens
tokens = [
'ID', # Variables
'NUMBER',
'OBRAKET', # [
'CBRAKET', # ]
'DCOLON', # ::
'TIMES',
'DIVIDED',
'PLUS',
'MINUS',
'DIFFERENT',
'LESSEREQ',
'LESSER',
'GREATEREQ',
'GREATER',
'EQUAL',
'NOT',
'AND',
'OR',
'OPAREN', # (
'CPAREN', # )
'ARROW', # ->
'PIPE' # |
] + list(reserved.values())
# Lista de las reglas para las expresiones regulares
# Definicion para la gramatica de las variables
def t_ID(t):
r'\b[a-zA-Z][a-zA-Z0-9_]*\b'
t.type = reserved.get(t.value,'ID')
return t
t_NUMBER = r'[0-9]+'
t_OBRAKET = r'\['
t_CBRAKET = r'\]'
t_DCOLON = r'::'
t_TIMES = r'\*'
t_DIVIDED = r'/'
t_PLUS = r'\+'
t_MINUS = r'-'
t_DIFFERENT = r'<>'
t_LESSEREQ = r'<='
t_LESSER = r'<'
t_GREATEREQ = r'>='
t_GREATER = r'>'
t_EQUAL = r'='
t_NOT = r'!'
t_AND = r'/\\'
t_OR = r'\\/'
t_OPAREN = r'\('
t_CPAREN = r'\)'
t_ARROW = r'\->'
t_PIPE = r'\|'
# Llevar seguimiento del numero de linea
def t_newline(t):
r'\n+'
t.lexer.lineno += len(t.value)
# Caracteres ignorados
t_ignore = ' \t\n'
# Error
def t_error(t):
raise TokenError(t)