-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexer.py
88 lines (78 loc) · 2.37 KB
/
lexer.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
from sly import Lexer
import string
import re
from errors import ForeignCharacter, WrongCharacter, FalseTermination, FullStopNotFound
class Lexer2048(Lexer):
"""
Lexer2048 Class, Subclass of sly.lexer Used to preprocess, tokenize text for pipelining to parser and game
Parameters:
tokens: The set of tokens used for grammer
ignore: spaces and tabs are ignored
literals: . ? , are given literals
"""
# Set of token names. This is always required
tokens = {
IDENTIFIER,
NUMBER,
COMMA,
OPERATION,
DIRECTION,
ASSIGN,
TO,
VAR,
IS,
VALUE,
IN,
}
ignore = " \t"
literals = {".", "?", ","}
# Identifiers and keywords
COMMA = r"\,"
NUMBER = r"-?\d+"
IDENTIFIER = r"[a-zA-Z]+[a-zA-Z0-9]*"
IDENTIFIER["ADD"] = OPERATION
IDENTIFIER["SUBTRACT"] = OPERATION
IDENTIFIER["MULTIPLY"] = OPERATION
IDENTIFIER["DIVIDE"] = OPERATION
IDENTIFIER["LEFT"] = DIRECTION
IDENTIFIER["RIGHT"] = DIRECTION
IDENTIFIER["UP"] = DIRECTION
IDENTIFIER["DOWN"] = DIRECTION
IDENTIFIER["ASSIGN"] = ASSIGN
IDENTIFIER["TO"] = TO
IDENTIFIER["VAR"] = VAR
IDENTIFIER["IS"] = IS
IDENTIFIER["VALUE"] = VALUE
IDENTIFIER["IN"] = IN
def error(self, t):
"""
Called When Lexer encounters an Invalid / Foreign Token
t: Input Token
"""
raise ForeignCharacter(self.index, t.value[0])
def preprocess(self, text, lineno=1, index=0):
"""
Preprocess String for checking Full Stops / Misplaced Characters
text: Input Command
"""
vocab = set(string.ascii_letters + string.digits + " .,?-")
for i, char in enumerate(text):
if char not in vocab:
raise ForeignCharacter(i, char)
ltext = text.rstrip()
Q, D, length = ltext.find("?"), ltext.find("."), len(ltext)
if Q >= 0:
if D >= 0:
if Q < D or (D == length - 1):
raise WrongCharacter("?", Q)
else:
raise FalseTermination(D)
else:
raise WrongCharacter("?", Q)
else:
if D == -1:
raise FullStopNotFound
elif D != length - 1:
raise FalseTermination(D)
else:
return ltext[:-1]