Spaces:
Sleeping
Sleeping
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"):
|