Files
2026-05-24 12:36:44 +08:00

35 lines
1.5 KiB
Python

import json
from data.field_tree import FieldTree, Field
from agents.llm import LLMClient
P1 = "You are a COBOL COPYBOOK parser. Output JSON: {\"fields\":[{\"name\":\"...\",\"level\":N,\"pic\":\"...\",\"usage\":\"DISPLAY|COMP-3|COMP\",\"offset\":N,\"length\":N,\"decimal\":N,\"signed\":bool,\"occurs\":N|null,\"redefines\":\"...\"|null,\"conditions\":[{\"name\":\"...\",\"value\":\"...\"}],\"children\":[...]}]} Return JSON only."
class Agent1Parser:
def __init__(self, llm: LLMClient):
self.llm = llm
def parse(self, text: str) -> FieldTree:
r = self.llm.call([{"role": "system", "content": P1}, {"role": "user", "content": text}])
try:
return self._load(json.loads(r))
except:
return FieldTree(copybook_name="parse_error")
def _load(self, d):
return FieldTree(fields=self._fields(d.get("fields", []), 0))
def _fields(self, raw, off):
result = []
cur = off
for rf in raw:
f = Field(name=rf.get("name", ""), level=rf.get("level", 0), pic=rf.get("pic", ""),
usage=rf.get("usage", "DISPLAY"), offset=cur, length=rf.get("length", 0),
decimal=rf.get("decimal", 0), signed=rf.get("signed", False),
occurs=rf.get("occurs"), redefines=rf.get("redefines"),
conditions=rf.get("conditions", []))
f.children = self._fields(rf.get("children", []), cur)
cur += f.length
result.append(f)
return result