Path: blob/master/tools/net/sunrpc/xdrgen/subcmds/declarations.py
26292 views
#!/usr/bin/env python31# ex: set filetype=python:23"""Translate an XDR specification into executable code that4can be compiled for the Linux kernel."""56import logging78from argparse import Namespace9from lark import logger10from lark.exceptions import UnexpectedInput1112from generators.constant import XdrConstantGenerator13from generators.enum import XdrEnumGenerator14from generators.header_bottom import XdrHeaderBottomGenerator15from generators.header_top import XdrHeaderTopGenerator16from generators.pointer import XdrPointerGenerator17from generators.program import XdrProgramGenerator18from generators.typedef import XdrTypedefGenerator19from generators.struct import XdrStructGenerator20from generators.union import XdrUnionGenerator2122from xdr_ast import transform_parse_tree, _RpcProgram, Specification23from xdr_ast import _XdrConstant, _XdrEnum, _XdrPointer24from xdr_ast import _XdrTypedef, _XdrStruct, _XdrUnion25from xdr_parse import xdr_parser, set_xdr_annotate2627logger.setLevel(logging.INFO)282930def emit_header_declarations(31root: Specification, language: str, peer: str32) -> None:33"""Emit header declarations"""34for definition in root.definitions:35if isinstance(definition.value, _XdrEnum):36gen = XdrEnumGenerator(language, peer)37elif isinstance(definition.value, _XdrPointer):38gen = XdrPointerGenerator(language, peer)39elif isinstance(definition.value, _XdrTypedef):40gen = XdrTypedefGenerator(language, peer)41elif isinstance(definition.value, _XdrStruct):42gen = XdrStructGenerator(language, peer)43elif isinstance(definition.value, _XdrUnion):44gen = XdrUnionGenerator(language, peer)45elif isinstance(definition.value, _RpcProgram):46gen = XdrProgramGenerator(language, peer)47else:48continue49gen.emit_declaration(definition.value)505152def handle_parse_error(e: UnexpectedInput) -> bool:53"""Simple parse error reporting, no recovery attempted"""54print(e)55return True565758def subcmd(args: Namespace) -> int:59"""Generate definitions and declarations"""6061set_xdr_annotate(args.annotate)62parser = xdr_parser()63with open(args.filename, encoding="utf-8") as f:64parse_tree = parser.parse(f.read(), on_error=handle_parse_error)65ast = transform_parse_tree(parse_tree)6667gen = XdrHeaderTopGenerator(args.language, args.peer)68gen.emit_declaration(args.filename, ast)6970emit_header_declarations(ast, args.language, args.peer)7172gen = XdrHeaderBottomGenerator(args.language, args.peer)73gen.emit_declaration(args.filename, ast)7475return 0767778