[project] Generate syscalls from new interface DSL
This change adds a new interface DSL for specifying objects (with methods) and interfaces (that expose objects, and optionally have their own methods). Significant changes: - Add the new scripts/definitions Python module to parse the DSL - Add the new definitions directory containing DSL definition files - Use cog to generate syscall-related code in kernel and libj6 - Unify ordering of pointer + length pairs in interfaces
This commit is contained in:
142
scripts/definitions/transformer.py
Normal file
142
scripts/definitions/transformer.py
Normal file
@@ -0,0 +1,142 @@
|
||||
from .parser import Transformer, v_args
|
||||
|
||||
def get_opts(args):
|
||||
from .types import Description, Options, Type, UID
|
||||
|
||||
kinds = {
|
||||
Description: "desc",
|
||||
Options: "opts",
|
||||
UID: "uid",
|
||||
Type: "typename",
|
||||
}
|
||||
|
||||
result = dict()
|
||||
outargs = []
|
||||
for a in args:
|
||||
for kind, name in kinds.items():
|
||||
if isinstance(a, kind):
|
||||
result[name] = a
|
||||
break
|
||||
else:
|
||||
outargs.append(a)
|
||||
|
||||
return result, outargs
|
||||
|
||||
class DefTransformer(Transformer):
|
||||
def __init__(self, filename):
|
||||
self.filename = filename
|
||||
|
||||
def start(self, args):
|
||||
from .types import Import, Interface, Object
|
||||
|
||||
imports = set()
|
||||
objects = dict()
|
||||
interfaces = dict()
|
||||
|
||||
for o in args:
|
||||
if isinstance(o, Object):
|
||||
objects[o.name] = o
|
||||
|
||||
elif isinstance(o, Interface):
|
||||
interfaces[o.name] = o
|
||||
|
||||
elif isinstance(o, Import):
|
||||
imports.add(o)
|
||||
|
||||
return imports, objects, interfaces
|
||||
|
||||
@v_args(inline=True)
|
||||
def import_statement(self, path):
|
||||
from .types import Import
|
||||
return Import(path)
|
||||
|
||||
def object(self, args):
|
||||
from .types import Object
|
||||
specials, args = get_opts(args)
|
||||
name, args = args[0], args[1:]
|
||||
return Object(name, children=args, **specials)
|
||||
|
||||
def interface(self, args):
|
||||
from .types import Interface
|
||||
specials, args = get_opts(args)
|
||||
name, args = args[0], args[1:]
|
||||
return Interface(name, children=args, **specials)
|
||||
|
||||
def method(self, args):
|
||||
from .types import Method
|
||||
specials, args = get_opts(args)
|
||||
name, args = args[0], args[1:]
|
||||
return Method(name, children=args, **specials)
|
||||
|
||||
def function(self, args):
|
||||
from .types import Function
|
||||
specials, args = get_opts(args)
|
||||
name, args = args[0], args[1:]
|
||||
return Function(name, children=args, **specials)
|
||||
|
||||
def param(self, args):
|
||||
from .types import Param
|
||||
specials, args = get_opts(args)
|
||||
name = args[0]
|
||||
return Param(name, **specials)
|
||||
|
||||
@v_args(inline=True)
|
||||
def expose(self, s):
|
||||
from .types import Expose
|
||||
return Expose(s)
|
||||
|
||||
@v_args(inline=True)
|
||||
def uid(self, s):
|
||||
return s
|
||||
|
||||
@v_args(inline=True)
|
||||
def name(self, s):
|
||||
return s
|
||||
|
||||
@v_args(inline=True)
|
||||
def type(self, s):
|
||||
return s
|
||||
|
||||
@v_args(inline=True)
|
||||
def super(self, s):
|
||||
from .types import ObjectRef
|
||||
return ObjectRef(s, self.filename)
|
||||
|
||||
def options(self, args):
|
||||
from .types import Options
|
||||
return Options([str(s) for s in args])
|
||||
|
||||
def description(self, s):
|
||||
from .types import Description
|
||||
return Description("\n".join(s))
|
||||
|
||||
@v_args(inline=True)
|
||||
def object_name(self, n):
|
||||
from .types import ObjectRef
|
||||
return ObjectRef(n, self.filename)
|
||||
|
||||
def PRIMITIVE(self, s):
|
||||
from .types import get_primitive
|
||||
return get_primitive(s)
|
||||
|
||||
def UID(self, s):
|
||||
from .types import UID
|
||||
return UID(int(s, base=16))
|
||||
|
||||
def INT_TYPE(self, s):
|
||||
return s
|
||||
|
||||
def NUMBER(self, s):
|
||||
if s.startswith("0x"):
|
||||
return int(s,16)
|
||||
return int(s)
|
||||
|
||||
def COMMENT(self, s):
|
||||
return s[2:].strip()
|
||||
|
||||
def IDENTIFIER(self, s):
|
||||
return str(s)
|
||||
|
||||
def PATH(self, s):
|
||||
return str(s[1:-1])
|
||||
|
||||
Reference in New Issue
Block a user