PeacebinfLow commited on
Commit
d8a93fc
·
verified ·
1 Parent(s): 6bb43c2

Create command_parser.py

Browse files
Files changed (1) hide show
  1. src/command_parser.py +82 -0
src/command_parser.py ADDED
@@ -0,0 +1,82 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from dataclasses import dataclass
2
+ from typing import Optional
3
+
4
+ @dataclass
5
+ class ParsedCommand:
6
+ kind: str
7
+ arg1: Optional[str] = None
8
+ arg2: Optional[str] = None
9
+ arg3: Optional[str] = None
10
+ rest: Optional[str] = None
11
+
12
+ def to_dict(self):
13
+ return {
14
+ "kind": self.kind,
15
+ "arg1": self.arg1,
16
+ "arg2": self.arg2,
17
+ "arg3": self.arg3,
18
+ "rest": self.rest,
19
+ }
20
+
21
+ class CommandParser:
22
+ """
23
+ Minimal deterministic command parser.
24
+ Supported:
25
+ MODE <STATE>
26
+ RESET | STATE | HELP
27
+ CARD <TYPE>
28
+ SPLITS
29
+ FIRST <split> <limit>
30
+ ROWS <split> <offset> <length>
31
+ SEARCH <split> <query...>
32
+ FILTER <split> <where...>
33
+ """
34
+ def parse(self, raw: str) -> ParsedCommand:
35
+ raw = (raw or "").strip()
36
+ if not raw:
37
+ return ParsedCommand(kind="NOOP")
38
+
39
+ parts = raw.split()
40
+ head = parts[0].upper()
41
+
42
+ if head == "MODE":
43
+ return ParsedCommand(kind="MODE", arg1=parts[1] if len(parts) > 1 else None)
44
+
45
+ if head == "RESET":
46
+ return ParsedCommand(kind="RESET")
47
+
48
+ if head == "STATE":
49
+ return ParsedCommand(kind="STATE")
50
+
51
+ if head == "HELP":
52
+ return ParsedCommand(kind="HELP")
53
+
54
+ if head == "CARD":
55
+ return ParsedCommand(kind="CARD", arg1=parts[1].upper() if len(parts) > 1 else None)
56
+
57
+ if head == "SPLITS":
58
+ return ParsedCommand(kind="SPLITS")
59
+
60
+ if head == "FIRST":
61
+ split = parts[1] if len(parts) > 1 else "train"
62
+ limit = parts[2] if len(parts) > 2 else "100"
63
+ return ParsedCommand(kind="FIRST", arg1=split, arg2=limit)
64
+
65
+ if head == "ROWS":
66
+ split = parts[1] if len(parts) > 1 else "train"
67
+ offset = parts[2] if len(parts) > 2 else "0"
68
+ length = parts[3] if len(parts) > 3 else "25"
69
+ return ParsedCommand(kind="ROWS", arg1=split, arg2=offset, arg3=length)
70
+
71
+ if head == "SEARCH":
72
+ split = parts[1] if len(parts) > 1 else "train"
73
+ rest = " ".join(parts[2:]) if len(parts) > 2 else ""
74
+ return ParsedCommand(kind="SEARCH", arg1=split, rest=rest)
75
+
76
+ if head == "FILTER":
77
+ split = parts[1] if len(parts) > 1 else "train"
78
+ rest = " ".join(parts[2:]) if len(parts) > 2 else ""
79
+ return ParsedCommand(kind="FILTER", arg1=split, rest=rest)
80
+
81
+ # fallback: treat unknown as SEARCH on train
82
+ return ParsedCommand(kind="SEARCH", arg1="train", rest=raw)