-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathClasss.rb
62 lines (46 loc) · 1.54 KB
/
Classs.rb
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
###########################
#Declaracion de las clases#
###########################
require_relative 'Tokens'
#Clase general para guardar un texto, linea y columna
class PhraseS
attr_accessor :text, :line, :column # Puede ser leido y escribir en ellos
def initialize(text, line, column)
@text = text
@line = line
@column = column
end
end
# Clase de error lexicografico con todo de la PhraseS
class LexicographError < PhraseS
def to_s #Salida especial del enunciado
"Error: Caracter inesperado \"#{@text}\" en la fila #{@line}, columna #{@column}"
end
end
#Clase para Token con todo de PhraseS
class Token < PhraseS
class << self
attr_accessor :regex #Esta seccion es para que la clase "redefinir la clase"
end #Se conoce como sigleton
def to_s #Salida especificada
"#{self.class.name}#{if self.class.name.eql?("TkIdent") then "(\"#{@text}\")" end}#{if self.class.name.eql?("TkNum") then "(#{@text})" end} "
end
def self.name_tk
return self.name.sub(/Tk/, '')
end
end
#######################################
#Declaracion de clases para cada token#
#######################################
#Creacion de clases de manera dinamica para cada token
$tokens.each do |id,regex|
newclass = Class::new(Token) do #Creacion dinamica "Magic"
@regex = regex #Se le asigna la regexp respectiva a la clase
def initialize(text, line, column)
@text = text
@line = line
@column = column
end
end
Object::const_set("Tk#{id}", newclass) #Se renombra la clase como Tk<nombre>
end