Spaces:
Running
Running
Update parser.py
Browse files
parser.py
CHANGED
@@ -3,9 +3,14 @@ from typing import List, Tuple, Any
|
|
3 |
Token = Tuple[str, str]
|
4 |
|
5 |
FUNCTIONS = {
|
6 |
-
"
|
7 |
-
"
|
8 |
-
"
|
|
|
|
|
|
|
|
|
|
|
9 |
}
|
10 |
|
11 |
TYPES = {"int", "float", "boolean"}
|
@@ -88,13 +93,13 @@ class Parser:
|
|
88 |
def function_call(self):
|
89 |
func_name = self.current()[0]
|
90 |
self.match(func_name)
|
91 |
-
|
92 |
funciones_con_argumento = {
|
93 |
"CALIBRATE", "COPY_FILE", "DELETE_FILE", "MOVE_BACKWARD", "MOVE_FORWARD", "MOVE_TO",
|
94 |
"PRINT", "RENAME_FILE", "ROTATE", "SAVE_FILE", "SCAN", "SET", "SET_SPEED", "UPLOAD",
|
95 |
"UPLOAD_FILE", "WAIT"
|
96 |
}
|
97 |
-
|
98 |
funciones_sin_argumento = {
|
99 |
"ACTIVATE_ALARM", "ACTIVATE_SENSOR", "BREAK", "CHARGE_BATTERY", "CHECK_BATTERY",
|
100 |
"CLOSE_DOOR", "CONTINUE", "DEACTIVATE_ALARM", "DEACTIVATE_SENSOR", "DECREASE_SPEED",
|
@@ -103,7 +108,7 @@ class Parser:
|
|
103 |
"TURN_LEFT", "TURN_RIGHT", "TURN_UP", "UNLOCK", "LOG", "INIT", "LOCK", "LOW_BATTERY",
|
104 |
"OPEN_DOOR", "PAUSE"
|
105 |
}
|
106 |
-
|
107 |
if func_name in funciones_con_argumento:
|
108 |
if self.current()[0] != "OPEN_PAREN":
|
109 |
raise SyntaxError(f"La funci贸n '{func_name}' requiere un argumento entre par茅ntesis.")
|
@@ -112,17 +117,16 @@ class Parser:
|
|
112 |
self.match("CLOSE_PAREN")
|
113 |
self.match("SEMICOLON")
|
114 |
return {"type": "function", "name": func_name, "arg": arg}
|
115 |
-
|
116 |
elif func_name in funciones_sin_argumento:
|
117 |
if self.current()[0] == "OPEN_PAREN":
|
118 |
raise SyntaxError(f"La funci贸n '{func_name}' no debe llevar argumentos ni par茅ntesis.")
|
119 |
self.match("SEMICOLON")
|
120 |
return {"type": "function", "name": func_name, "arg": None}
|
121 |
-
|
122 |
else:
|
123 |
raise SyntaxError(f"Funci贸n '{func_name}' no reconocida o mal definida.")
|
124 |
|
125 |
-
|
126 |
def expression(self):
|
127 |
left = self.term()
|
128 |
while self.current()[0] in ("PLUS", "MINUS", "EQUAL", "NOT_EQUAL", "GREATER", "LESS", "AND", "OR"):
|
|
|
3 |
Token = Tuple[str, str]
|
4 |
|
5 |
FUNCTIONS = {
|
6 |
+
"ACTIVATE_ALARM", "ACTIVATE_SENSOR", "BREAK", "CHARGE_BATTERY", "CHECK_BATTERY",
|
7 |
+
"CLOSE_DOOR", "CONTINUE", "DEACTIVATE_ALARM", "DEACTIVATE_SENSOR", "DECREASE_SPEED",
|
8 |
+
"DOWNLOAD", "REBOOT", "READ_SENSOR", "RESET", "RESUME", "REVERSE", "SHUTDOWN",
|
9 |
+
"SHUT_OFF", "START", "STOP", "STOP_IMMEDIATELY", "TOGGLE_LIGHT", "TURN_DOWN",
|
10 |
+
"TURN_LEFT", "TURN_RIGHT", "TURN_UP", "UNLOCK", "LOG", "INIT", "LOCK", "LOW_BATTERY",
|
11 |
+
"OPEN_DOOR", "PAUSE", "CALIBRATE", "COPY_FILE", "DELETE_FILE", "MOVE_BACKWARD",
|
12 |
+
"MOVE_FORWARD", "MOVE_TO", "PRINT", "RENAME_FILE", "ROTATE", "SAVE_FILE", "SCAN",
|
13 |
+
"SET", "SET_SPEED", "UPLOAD", "UPLOAD_FILE", "WAIT"
|
14 |
}
|
15 |
|
16 |
TYPES = {"int", "float", "boolean"}
|
|
|
93 |
def function_call(self):
|
94 |
func_name = self.current()[0]
|
95 |
self.match(func_name)
|
96 |
+
|
97 |
funciones_con_argumento = {
|
98 |
"CALIBRATE", "COPY_FILE", "DELETE_FILE", "MOVE_BACKWARD", "MOVE_FORWARD", "MOVE_TO",
|
99 |
"PRINT", "RENAME_FILE", "ROTATE", "SAVE_FILE", "SCAN", "SET", "SET_SPEED", "UPLOAD",
|
100 |
"UPLOAD_FILE", "WAIT"
|
101 |
}
|
102 |
+
|
103 |
funciones_sin_argumento = {
|
104 |
"ACTIVATE_ALARM", "ACTIVATE_SENSOR", "BREAK", "CHARGE_BATTERY", "CHECK_BATTERY",
|
105 |
"CLOSE_DOOR", "CONTINUE", "DEACTIVATE_ALARM", "DEACTIVATE_SENSOR", "DECREASE_SPEED",
|
|
|
108 |
"TURN_LEFT", "TURN_RIGHT", "TURN_UP", "UNLOCK", "LOG", "INIT", "LOCK", "LOW_BATTERY",
|
109 |
"OPEN_DOOR", "PAUSE"
|
110 |
}
|
111 |
+
|
112 |
if func_name in funciones_con_argumento:
|
113 |
if self.current()[0] != "OPEN_PAREN":
|
114 |
raise SyntaxError(f"La funci贸n '{func_name}' requiere un argumento entre par茅ntesis.")
|
|
|
117 |
self.match("CLOSE_PAREN")
|
118 |
self.match("SEMICOLON")
|
119 |
return {"type": "function", "name": func_name, "arg": arg}
|
120 |
+
|
121 |
elif func_name in funciones_sin_argumento:
|
122 |
if self.current()[0] == "OPEN_PAREN":
|
123 |
raise SyntaxError(f"La funci贸n '{func_name}' no debe llevar argumentos ni par茅ntesis.")
|
124 |
self.match("SEMICOLON")
|
125 |
return {"type": "function", "name": func_name, "arg": None}
|
126 |
+
|
127 |
else:
|
128 |
raise SyntaxError(f"Funci贸n '{func_name}' no reconocida o mal definida.")
|
129 |
|
|
|
130 |
def expression(self):
|
131 |
left = self.term()
|
132 |
while self.current()[0] in ("PLUS", "MINUS", "EQUAL", "NOT_EQUAL", "GREATER", "LESS", "AND", "OR"):
|