-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlex_rust.py
More file actions
143 lines (115 loc) · 2.03 KB
/
lex_rust.py
File metadata and controls
143 lines (115 loc) · 2.03 KB
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import ply.lex as lex
# List of token names
tokens = (
'FOR',
'LET',
'CONST',
'FN',
'IN',
'RETURN',
'LPAREN',
'RPAREN',
'LBRACE',
'RBRACE',
'SEMICOLON',
'IF',
'ELSE',
'STRUCT',
'TYPE',
'COMMA',
'EQUALS',
'DOTDOT',
'GREATER',
'LESS',
'PLUS',
'MINUS',
'TIMES',
'DIVIDE',
'NUMBER',
'BOOL',
'STRING',
'COLON',
'INCREMENT',
'DECREMENT',
'IDENTIFIER'
)
# Regular expressions for tokens
t_LPAREN = r'\('
t_RPAREN = r'\)'
t_LBRACE = r'\{'
t_RBRACE = r'\}'
t_SEMICOLON = r';'
t_COLON = r':'
t_COMMA = r','
t_EQUALS = r'='
t_DOTDOT = r'\.\.'
t_GREATER = r'\>'
t_LESS = r'\<'
t_PLUS = r'\+'
t_MINUS = r'\-'
t_TIMES = r'\*'
t_DIVIDE = r'\/'
t_INCREMENT = r'\+\+'
t_DECREMENT = r'\+\+'
def t_FOR(t):
r'for'
return t
def t_IN(t):
r'in'
return t
def t_IF(t):
r'if'
return t
def t_ELSE(t):
r'else'
return t
def t_STRUCT(t):
r'struct'
return t
def t_RETURN(t):
r'return'
return t
def t_TYPE(t):
r'i32|i64|u32|u64|f32|f64|char|bool'
return t
def t_FN(t):
r'fn'
return t
def t_LET(t):
r'let'
return t
def t_CONST(t):
r'const'
return t
def t_IDENTIFIER(t):
r'[a-zA-Z_][a-zA-Z0-9_]*'
return t
def t_NUMBER(t):
r'\d+'
t.value = int(t.value)
return t
def t_BOOL(t):
r'true|false'
return t
def t_STRING(t):
r'"([^"\\]|\\.)*"'
return t
t_ignore = ' \t\n'
# Define a function to capture errors
def t_error(t):
print(f"Illegal character: '{t.value[0]}'")
t.lexer.skip(1)
# Build the lexer
lexer = lex.lex()
# Example Rust code
file_path = 'exampleInput.txt'
with open(file_path, 'r') as file:
rust_code = file.read()
# Give the lexer some input
lexer.input(rust_code)
# Tokenize
while True:
tok = lexer.token()
if not tok:
break # No more input
print(tok)