Implement SCPI parser

Adds SCPIParser class with parse() method that handles:
- IEEE 488.2 common commands (*IDN?, *RST, etc.)
- Query commands (ending with '?')
- Commands with comma-separated arguments
- Whitespace stripping
This commit is contained in:
2025-04-21 12:03:55 +00:00
parent b309645f60
commit 97541e76dd

View File

@@ -30,3 +30,57 @@ class SCPICommand:
For regular commands like "VOLT", returns "VOLT". For regular commands like "VOLT", returns "VOLT".
""" """
return self.header.rstrip("?") return self.header.rstrip("?")
class SCPIParser:
"""Parse SCPI command strings.
Handles both IEEE 488.2 common commands (e.g., *IDN?, *RST) and
instrument-specific commands (e.g., VOLT 3.3, TEMP:SETPOINT?).
Examples:
>>> parser = SCPIParser()
>>> cmd = parser.parse("*IDN?")
>>> cmd.header, cmd.is_query
('*IDN?', True)
>>> cmd = parser.parse("VOLT 3.3")
>>> cmd.header, cmd.arguments
('VOLT', ['3.3'])
"""
def parse(self, command_string: str) -> SCPICommand:
"""Parse a SCPI command string.
Args:
command_string: The raw SCPI command string to parse.
Returns:
SCPICommand with parsed header, arguments, and query flag.
Examples:
"*IDN?" -> SCPICommand("*IDN?", [], True)
"VOLT 3.3" -> SCPICommand("VOLT", ["3.3"], False)
"TEMP:SETPOINT?" -> SCPICommand("TEMP:SETPOINT?", [], True)
"CONF:VOLT:DC 10,0.001" -> SCPICommand("CONF:VOLT:DC", ["10", "0.001"], False)
"""
command_string = command_string.strip()
if not command_string:
return SCPICommand(header="", arguments=[], is_query=False)
is_query = command_string.endswith("?")
# Split into header and arguments on first whitespace
parts = command_string.split(None, 1)
header = parts[0]
arguments: list[str] = []
if len(parts) > 1:
# Parse comma-separated arguments
arg_string = parts[1]
arguments = [arg.strip() for arg in arg_string.split(",")]
return SCPICommand(
header=header,
arguments=arguments,
is_query=is_query,
)