35 lines
1.5 KiB
Python
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
|