-
Notifications
You must be signed in to change notification settings - Fork 1
/
scanner.py
129 lines (114 loc) · 3.06 KB
/
scanner.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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# coding=utf-8
# -----------------------------------------------------------------------------
# Abril Marina González Ramírez A01280904
# Juan Luis Flores Garza A01280767
# 12/03/2019
# Scanner
# References: https://github.com/dabeaz/ply
# -----------------------------------------------------------------------------
import ply.lex as lex
# -----------------------------------------------------------------------------
# Tokens
# -----------------------------------------------------------------------------
tokens = [
'ID', 'CTE_I', 'CTE_D', 'CTE_B',
'PLUS', 'MINUS', 'MULTIPLY', 'DIVIDE',
'IS_EQUAL_TO', 'NOT_EQUAL_TO',
'GREATER_THAN', 'LESS_THAN',
'GREATER_THAN_OR_EQUAL_TO', 'LESS_THAN_OR_EQUAL_TO',
'AND', 'OR',
'ASSIGN',
'LEFT_PAR', 'RIGHT_PAR',
'LEFT_BRACE', 'RIGHT_BRACE',
'LEFT_BRACKET', 'RIGHT_BRACKET',
'SEMICOLON', 'COMMA'
]
# -----------------------------------------------------------------------------
# Dictionary of Reserved words
# -----------------------------------------------------------------------------
reservedWords = {
'Main': 'MAIN',
'if': 'IF',
'else': 'ELSE',
'while': 'WHILE',
'function': 'FUNCTION',
'return': 'RETURN',
'void': 'VOID',
'int': 'INT',
'double': 'DOUBLE',
'bool': 'BOOL',
'true': 'TRUE',
'false': 'FALSE',
'read': 'READ',
'write': 'WRITE',
'matrix': 'MATRIX',
# Special functions
'multiply_matrix': 'MULTIPLY_MATRIX',
'add_to_matrix': 'ADD_TO_MATRIX',
'subtract_from_matrix': 'SUBTRACT_FROM_MATRIX',
'swap': 'SWAP',
'p_matrix': 'P_MATRIX',
}
tokens = tokens + list(reservedWords.values())
# -----------------------------------------------------------------------------
# Tokens
# -----------------------------------------------------------------------------
# Ignore tabs
t_ignore = " \t"
# Arithmetic Operators
t_PLUS = r'\+'
t_MINUS = r'-'
t_MULTIPLY = r'\*'
t_DIVIDE = r'/'
# Relational Operators
t_IS_EQUAL_TO = r'=='
t_NOT_EQUAL_TO = r'!='
t_GREATER_THAN = r'>'
t_LESS_THAN = r'<'
t_GREATER_THAN_OR_EQUAL_TO = r'>='
t_LESS_THAN_OR_EQUAL_TO = r'<='
# Logical Operators
t_AND = r'&&'
t_OR = r'\|\|'
# Assignment Operator
t_ASSIGN = r'\='
# Punctuators
t_LEFT_PAR = r'\('
t_RIGHT_PAR = r'\)'
t_LEFT_BRACE = r'{'
t_RIGHT_BRACE = r'}'
t_LEFT_BRACKET = r'\['
t_RIGHT_BRACKET = r'\]'
t_SEMICOLON = r'\;'
t_COMMA = r','
# Data Types & ID
def t_ID(t):
r'[a-zA-Z][_a-zA-Z0-9]*'
t.type = reservedWords.get(t.value,'ID')
return t
def t_CTE_D(t):
r'-?[0-9]*\.[0-9]+'
t.value = float(t.value)
return t
def t_CTE_I(t):
r'-?[0-9]+'
t.value = int(t.value)
return t
# New lines and errors
def t_newline(t):
r'\n+'
t.lexer.lineno += t.value.count("\n")
def t_error(t):
print("Illegal character '{}' at: {}".format(t.value[0], t.lexer.lineno))
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
#### Testing the lexer
# file = open("example.txt")
# lexer.input(file.read())
# Get tokens
# while True:
# tok = lexer.token()
# if not tok:
# break
# print("\n")