mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-16 10:17:32 +00:00
4b132aacb0
Add a Python-based tool for translating XDR specifications into XDR encoder and decoder functions written in the Linux kernel's C coding style. The generator attempts to match the usual C coding style of the Linux kernel's SunRPC consumers. This approach is similar to the netlink code generator in tools/net/ynl . The maintainability benefits of machine-generated XDR code include: - Stronger type checking - Reduces the number of bugs introduced by human error - Makes the XDR code easier to audit and analyze - Enables rapid prototyping of new RPC-based protocols - Hardens the layering between protocol logic and marshaling - Makes it easier to add observability on demand - Unit tests might be built for both the tool and (automatically) for the generated code In addition, converting the XDR layer to use memory-safe languages such as Rust will be easier if much of the code can be converted automatically. Tested-by: Jeff Layton <jlayton@kernel.org> Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
37 lines
826 B
Python
37 lines
826 B
Python
#!/usr/bin/env python3
|
|
# ex: set filetype=python:
|
|
|
|
"""Common parsing code for xdrgen"""
|
|
|
|
from lark import Lark
|
|
|
|
|
|
# Set to True to emit annotation comments in generated source
|
|
annotate = False
|
|
|
|
|
|
def set_xdr_annotate(set_it: bool) -> None:
|
|
"""Set 'annotate' if --annotate was specified on the command line"""
|
|
global annotate
|
|
annotate = set_it
|
|
|
|
|
|
def get_xdr_annotate() -> bool:
|
|
"""Return True if --annotate was specified on the command line"""
|
|
return annotate
|
|
|
|
|
|
def xdr_parser() -> Lark:
|
|
"""Return a Lark parser instance configured with the XDR language grammar"""
|
|
|
|
return Lark.open(
|
|
"grammars/xdr.lark",
|
|
rel_to=__file__,
|
|
start="specification",
|
|
debug=True,
|
|
strict=True,
|
|
propagate_positions=True,
|
|
parser="lalr",
|
|
lexer="contextual",
|
|
)
|