Update scl.py
这个提交包含在:
@@ -9,6 +9,7 @@ import os
|
|||||||
import re
|
import re
|
||||||
import importlib.util
|
import importlib.util
|
||||||
import tkinter as tk
|
import tkinter as tk
|
||||||
|
import datetime
|
||||||
|
|
||||||
class SCLInterpreter:
|
class SCLInterpreter:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@@ -440,9 +441,25 @@ class SCLInterpreter:
|
|||||||
plugin_assign_pos = plugin_pos + 1
|
plugin_assign_pos = plugin_pos + 1
|
||||||
if plugin_assign_pos < len(tokens) and tokens[plugin_assign_pos][0] == 'ASSIGN' and tokens[plugin_assign_pos][1] == ':':
|
if plugin_assign_pos < len(tokens) and tokens[plugin_assign_pos][0] == 'ASSIGN' and tokens[plugin_assign_pos][1] == ':':
|
||||||
command_pos = plugin_assign_pos + 1
|
command_pos = plugin_assign_pos + 1
|
||||||
if command_pos < len(tokens) and tokens[command_pos][0] == 'IDENTIFIER':
|
if command_pos < len(tokens):
|
||||||
command_name = tokens[command_pos][1]
|
# 处理 time 插件的特殊情况,允许 command 包含冒号
|
||||||
args_pos = command_pos + 1
|
if plugin_name == 'time':
|
||||||
|
# 收集所有 token 直到遇到参数或结束
|
||||||
|
command_tokens = []
|
||||||
|
current_pos = command_pos
|
||||||
|
while current_pos < len(tokens) and not (tokens[current_pos][0] == 'OPERATOR' and tokens[current_pos][1] == '<'):
|
||||||
|
command_tokens.append(tokens[current_pos][1])
|
||||||
|
current_pos += 1
|
||||||
|
command_name = ' '.join(command_tokens)
|
||||||
|
args_pos = current_pos
|
||||||
|
else:
|
||||||
|
# 普通插件,command 是单一标识符
|
||||||
|
if tokens[command_pos][0] == 'IDENTIFIER':
|
||||||
|
command_name = tokens[command_pos][1]
|
||||||
|
args_pos = command_pos + 1
|
||||||
|
else:
|
||||||
|
# 不是有效的 command,跳过
|
||||||
|
return None, pos
|
||||||
|
|
||||||
# Parse command arguments in angle brackets
|
# Parse command arguments in angle brackets
|
||||||
args_tokens = []
|
args_tokens = []
|
||||||
@@ -454,6 +471,9 @@ class SCLInterpreter:
|
|||||||
if current_arg_pos < len(tokens) and tokens[current_arg_pos][0] == 'OPERATOR' and tokens[current_arg_pos][1] == '>':
|
if current_arg_pos < len(tokens) and tokens[current_arg_pos][0] == 'OPERATOR' and tokens[current_arg_pos][1] == '>':
|
||||||
current_arg_pos += 1
|
current_arg_pos += 1
|
||||||
return ('PLUGIN_ASSIGN', var_name, plugin_name, command_name, args_tokens), current_arg_pos
|
return ('PLUGIN_ASSIGN', var_name, plugin_name, command_name, args_tokens), current_arg_pos
|
||||||
|
else:
|
||||||
|
# 没有参数的情况,例如 time : now 或 time : Asia/Shanghai : UTC+8
|
||||||
|
return ('PLUGIN_ASSIGN', var_name, plugin_name, command_name, args_tokens), args_pos
|
||||||
|
|
||||||
if pos < len(tokens):
|
if pos < len(tokens):
|
||||||
token = tokens[pos]
|
token = tokens[pos]
|
||||||
@@ -469,6 +489,23 @@ class SCLInterpreter:
|
|||||||
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'end':
|
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'end':
|
||||||
return ('END',), pos + 1
|
return ('END',), pos + 1
|
||||||
|
|
||||||
|
# 处理print语句
|
||||||
|
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'print':
|
||||||
|
local_pos = pos + 1
|
||||||
|
if local_pos < len(tokens) and tokens[local_pos][0] == 'ASSIGN' and tokens[local_pos][1] == ':':
|
||||||
|
local_pos += 1
|
||||||
|
expr, new_pos = self.parse_expression(tokens, local_pos)
|
||||||
|
if expr:
|
||||||
|
return ('PRINT', expr), new_pos
|
||||||
|
|
||||||
|
# 处理 time : now 直接调用
|
||||||
|
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'time':
|
||||||
|
local_pos = pos + 1
|
||||||
|
if local_pos < len(tokens) and tokens[local_pos][0] == 'ASSIGN' and tokens[local_pos][1] == ':':
|
||||||
|
now_pos = local_pos + 1
|
||||||
|
if now_pos < len(tokens) and tokens[now_pos][0] == 'IDENTIFIER' and tokens[now_pos][1] == 'now':
|
||||||
|
return ('TIME_NOW',), now_pos + 1
|
||||||
|
|
||||||
# 直接处理sif、seif、sel和swhi语句
|
# 直接处理sif、seif、sel和swhi语句
|
||||||
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'sif':
|
if pos < len(tokens) and tokens[pos][0] == 'IDENTIFIER' and tokens[pos][1] == 'sif':
|
||||||
current_pos = pos + 1 # Skip 'sif'
|
current_pos = pos + 1 # Skip 'sif'
|
||||||
@@ -620,6 +657,16 @@ class SCLInterpreter:
|
|||||||
expr, new_pos = self.parse_expression(tokens, local_pos)
|
expr, new_pos = self.parse_expression(tokens, local_pos)
|
||||||
if expr:
|
if expr:
|
||||||
return ('ASSIGNMENT', token[1], expr), new_pos
|
return ('ASSIGNMENT', token[1], expr), new_pos
|
||||||
|
# 处理 time : now 语法
|
||||||
|
elif local_pos < len(tokens) and tokens[local_pos][0] == 'ASSIGN' and tokens[local_pos][1] == ':':
|
||||||
|
time_pos = local_pos + 1
|
||||||
|
if time_pos < len(tokens) and tokens[time_pos][0] == 'IDENTIFIER' and tokens[time_pos][1] == 'time':
|
||||||
|
time_assign_pos = time_pos + 1
|
||||||
|
if time_assign_pos < len(tokens) and tokens[time_assign_pos][0] == 'ASSIGN' and tokens[time_assign_pos][1] == ':':
|
||||||
|
now_pos = time_assign_pos + 1
|
||||||
|
if now_pos < len(tokens) and tokens[now_pos][0] == 'IDENTIFIER' and tokens[now_pos][1] == 'now':
|
||||||
|
# 处理赋值: set a | a : time : now
|
||||||
|
return ('TIME_NOW',), now_pos + 1
|
||||||
|
|
||||||
# 然后调用siew插件,确保它能处理sif和swhile语句
|
# 然后调用siew插件,确保它能处理sif和swhile语句
|
||||||
if 'siew' in self.plugins:
|
if 'siew' in self.plugins:
|
||||||
@@ -737,6 +784,8 @@ class SCLInterpreter:
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def execute_statement(self, stmt):
|
def execute_statement(self, stmt):
|
||||||
"""Execute a statement"""
|
"""Execute a statement"""
|
||||||
# 检查是否是debug语句
|
# 检查是否是debug语句
|
||||||
@@ -803,6 +852,10 @@ class SCLInterpreter:
|
|||||||
print(f"Debug: Assigned {value} to variable {var_name}")
|
print(f"Debug: Assigned {value} to variable {var_name}")
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
# 处理 time : now 语句
|
||||||
|
if stmt[0] == 'TIME_NOW':
|
||||||
|
return datetime.datetime.now()
|
||||||
|
|
||||||
# 处理插件赋值语句: set var | var : plugin : command<args>
|
# 处理插件赋值语句: set var | var : plugin : command<args>
|
||||||
if stmt[0] == 'PLUGIN_ASSIGN':
|
if stmt[0] == 'PLUGIN_ASSIGN':
|
||||||
var_name = stmt[1]
|
var_name = stmt[1]
|
||||||
@@ -810,6 +863,50 @@ class SCLInterpreter:
|
|||||||
command_name = stmt[3]
|
command_name = stmt[3]
|
||||||
args_tokens = stmt[4]
|
args_tokens = stmt[4]
|
||||||
|
|
||||||
|
# 处理 time : now 语法
|
||||||
|
if plugin_name == 'time' and command_name == 'now':
|
||||||
|
value = datetime.datetime.now()
|
||||||
|
self.variables[var_name] = value
|
||||||
|
if self.debug_mode:
|
||||||
|
print(f"Debug: Assigned {value} to variable {var_name}")
|
||||||
|
return True
|
||||||
|
# 处理 time : 时区 : UTC+ 语法
|
||||||
|
elif plugin_name == 'time' and ':' in command_name:
|
||||||
|
# 解析时区和偏移量
|
||||||
|
# 移除多余的空格,然后按冒号分割
|
||||||
|
command_name_clean = ' '.join(command_name.split())
|
||||||
|
parts = command_name_clean.split(':')
|
||||||
|
if len(parts) == 2:
|
||||||
|
timezone = parts[0].strip()
|
||||||
|
offset_str = parts[1].strip()
|
||||||
|
# 移除偏移量字符串中的空格
|
||||||
|
offset_str_no_spaces = offset_str.replace(' ', '')
|
||||||
|
try:
|
||||||
|
# 解析偏移量,如 UTC+8
|
||||||
|
if offset_str_no_spaces.startswith('UTC+'):
|
||||||
|
offset = int(offset_str_no_spaces[4:])
|
||||||
|
# 计算带有时区偏移的时间(使用 UTC 时间作为基准)
|
||||||
|
now = datetime.datetime.utcnow()
|
||||||
|
value = now + datetime.timedelta(hours=offset)
|
||||||
|
self.variables[var_name] = value
|
||||||
|
if self.debug_mode:
|
||||||
|
print(f"Debug: Assigned {value} (timezone: {timezone}, offset: {offset}) to variable {var_name}")
|
||||||
|
return True
|
||||||
|
# 处理 UTC- 格式的偏移量
|
||||||
|
elif offset_str_no_spaces.startswith('UTC-'):
|
||||||
|
offset = -int(offset_str_no_spaces[4:])
|
||||||
|
# 计算带有时区偏移的时间(使用 UTC 时间作为基准)
|
||||||
|
now = datetime.datetime.utcnow()
|
||||||
|
value = now + datetime.timedelta(hours=offset)
|
||||||
|
self.variables[var_name] = value
|
||||||
|
if self.debug_mode:
|
||||||
|
print(f"Debug: Assigned {value} (timezone: {timezone}, offset: {offset}) to variable {var_name}")
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Error parsing timezone: {e}")
|
||||||
|
# 如果解析失败,返回 False
|
||||||
|
return False
|
||||||
|
|
||||||
# Check if plugin exists
|
# Check if plugin exists
|
||||||
if plugin_name not in self.plugins:
|
if plugin_name not in self.plugins:
|
||||||
print(f"Error: Plugin '{plugin_name}' not found")
|
print(f"Error: Plugin '{plugin_name}' not found")
|
||||||
|
|||||||
在新工单中引用
屏蔽一个用户