add cobol_testgen module
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
"""COBOL数据模型 — 所有层共享,无外部依赖"""
|
||||
|
||||
from dataclasses import dataclass, field
|
||||
|
||||
|
||||
# ── 字段定义 ──
|
||||
|
||||
@dataclass
|
||||
class PicInfo:
|
||||
type: str = 'unknown' # "numeric" | "alphanumeric" | "alphabetic"
|
||||
digits: int = 0
|
||||
decimal: int = 0
|
||||
length: int = 0
|
||||
signed: bool = False
|
||||
|
||||
|
||||
@dataclass
|
||||
class FieldDef:
|
||||
name: str
|
||||
level: int
|
||||
pic: str | None = None
|
||||
pic_info: PicInfo | None = None
|
||||
is_filler: bool = False
|
||||
occurs_count: int = 0
|
||||
occurs_depending: str | None = None
|
||||
redefines: str | None = None
|
||||
usage: str | None = None # "COMP" | "COMP-3" | "BINARY" | "PACKED-DECIMAL" | ...
|
||||
value: str | None = None
|
||||
values: list[str] | None = None
|
||||
is_88: bool = False
|
||||
parent: str | None = None
|
||||
section: str | None = None
|
||||
|
||||
|
||||
# ── 分支树 ──
|
||||
|
||||
class BrSeq:
|
||||
def __init__(self):
|
||||
self.children = []
|
||||
|
||||
def add(self, child):
|
||||
self.children.append(child)
|
||||
|
||||
|
||||
class BrIf:
|
||||
def __init__(self, condition):
|
||||
self.condition = condition
|
||||
self.cond_tree = None # 由 core.py 在解析时赋值
|
||||
self.true_seq = BrSeq()
|
||||
self.false_seq = BrSeq()
|
||||
|
||||
|
||||
class BrEval:
|
||||
def __init__(self, subject):
|
||||
self.subject = subject
|
||||
self.subjects = [] # ALSO 多主体: ['WS-A', 'WS-B'],空=普通模式
|
||||
self.when_list = []
|
||||
self.other_seq = BrSeq()
|
||||
self.has_other = False
|
||||
|
||||
|
||||
class BrPerform:
|
||||
def __init__(self, perf_type, condition=None, target=None, thru=None, times=None,
|
||||
varying_var=None, varying_from=None, varying_by=None):
|
||||
self.perf_type = perf_type
|
||||
self.condition = condition
|
||||
self.target = target
|
||||
self.thru = thru
|
||||
self.times = times
|
||||
self.varying_var = varying_var
|
||||
self.varying_from = varying_from
|
||||
self.varying_by = varying_by
|
||||
self.body_seq = BrSeq()
|
||||
|
||||
|
||||
class Assign:
|
||||
"""赋值节点:MOVE/COMPUTE/ADD/SUBTRACT/MULTIPLY/DIVIDE"""
|
||||
def __init__(self, target: str, source_info: dict):
|
||||
self.target = target
|
||||
self.source_info = source_info
|
||||
|
||||
|
||||
class CallNode:
|
||||
"""CALL 子程序调用节点(黑盒模式)"""
|
||||
def __init__(self, program_name: str, using_params: list = None):
|
||||
self.program_name = program_name
|
||||
self.using_params = using_params or []
|
||||
# using_params: [{"name": "WS-A", "mechanism": "reference"}, ...]
|
||||
# mechanism: "reference" | "content" | "value"
|
||||
|
||||
|
||||
# ── 条件树 ──
|
||||
|
||||
class CondLeaf:
|
||||
def __init__(self, field, op, value):
|
||||
self.field = field
|
||||
self.op = op
|
||||
self.value = value
|
||||
|
||||
|
||||
class CondNot:
|
||||
def __init__(self, child):
|
||||
self.child = child
|
||||
|
||||
|
||||
class CondAnd:
|
||||
def __init__(self, left, right):
|
||||
self.left = left
|
||||
self.right = right
|
||||
|
||||
|
||||
class CondOr:
|
||||
def __init__(self, left, right):
|
||||
self.left = left
|
||||
self.right = right
|
||||
|
||||
|
||||
class GoTo:
|
||||
"""GO TO 节点:无条件跳转到指定段落"""
|
||||
def __init__(self, target: str, body_seq: 'BrSeq' = None):
|
||||
self.target = target
|
||||
self.body_seq = body_seq or BrSeq()
|
||||
|
||||
|
||||
class ExitNode:
|
||||
"""控制流退出节点:EXIT PARAGRAPH / EXIT PERFORM / EXIT SECTION / EXIT PROGRAM"""
|
||||
def __init__(self, exit_type: str):
|
||||
self.exit_type = exit_type
|
||||
|
||||
|
||||
# ── 约束路径 ──
|
||||
|
||||
Constraint = tuple # (field, op, value, want_true)
|
||||
Path = list[Constraint]
|
||||
|
||||
|
||||
# ── 解析错误 ──
|
||||
|
||||
@dataclass
|
||||
class ParseError:
|
||||
line: int
|
||||
message: str
|
||||
severity: str = 'warning'
|
||||
|
||||
|
||||
@dataclass
|
||||
class ProcParseResult:
|
||||
tree: BrSeq | None = None
|
||||
assignments: dict = field(default_factory=dict)
|
||||
errors: list[ParseError] = field(default_factory=list)
|
||||
fallback_to_ai: bool = False
|
||||
Reference in New Issue
Block a user