You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于PyParsing树生成Bind9 named.conf格式输出的示例请求

自定义PyParsing树转Bind9配置格式的示例

以下是一个小型可运行的示例,实现从PyParsing解析树还原出符合Bind9 named.conf语法的配置文本:

1. 先定义简化版Bind9语法解析器(用于生成解析树)

from pyparsing import Word, alphas, nums, Literal, Forward, Group, ZeroOrMore, StringEnd

# 定义基础语法元素
identifier = Word(alphas + nums + "_-")
ip_address = Word(nums + ".")
semicolon = Literal(";")
lbrace = Literal("{")
rbrace = Literal("}")

# 定义zone语句
zone_name = Word(alphas + nums + ".")
zone_block = Forward()
zone_block << lbrace + ZeroOrMore(Group(identifier + ip_address + semicolon)) + rbrace + semicolon
zone_stmt = Group(Literal("zone") + zone_name + zone_block)

# 定义options语句
option_entry = Group(identifier + ip_address + semicolon)
options_block = lbrace + ZeroOrMore(option_entry) + rbrace + semicolon
options_stmt = Group(Literal("options") + options_block)

# 完整配置语法
named_conf = ZeroOrMore(options_stmt | zone_stmt) + StringEnd()

2. 自定义输出生成器类

class BindConfigGenerator:
    def __init__(self, parse_tree):
        self.parse_tree = parse_tree
        self.indent_level = 0
        self.output = []

    def generate(self):
        self._process_tree(self.parse_tree)
        return "\n".join(self.output)

    def _process_tree(self, node):
        if isinstance(node, str):
            # 处理纯字符串元素(比如关键字、分号等)
            self.output.append("    " * self.indent_level + node)
            return

        if isinstance(node, list):
            # 处理列表类型的节点(解析树的核心结构)
            for child in node:
                if child == "{":
                    self.output.append(" {")
                    self.indent_level += 1
                elif child == "}":
                    self.indent_level -= 1
                    self.output.append("    " * self.indent_level + "}")
                elif child == ";":
                    # 把分号追加到上一行末尾,避免单独换行
                    if self.output:
                        self.output[-1] += ";"
                else:
                    self._process_tree(child)
            return

3. 运行示例

# 测试用的Bind9配置文本
test_config = """
options {
    forwarders 8.8.8.8;
    listen-on 127.0.0.1;
};

zone "example.com" {
    type master;
    file "example.com.zone";
};
"""

# 解析配置生成解析树
parse_result = named_conf.parseString(test_config, parseAll=True)

# 用生成器还原配置文本
generator = BindConfigGenerator(parse_result)
generated_config = generator.generate()

# 输出对比
print("原配置:")
print(test_config)
print("\n还原后的配置:")
print(generated_config)

说明

  • 这个生成器通过递归遍历PyParsing的解析树节点,根据节点类型(字符串、列表)和特殊符号(大括号、分号)来控制缩进和换行,还原Bind9的格式规范。
  • 实际使用时,可以根据你的完整Bind9语法定义,扩展_process_tree方法来处理更多语法元素(比如注释、多行块、嵌套结构等)。

内容的提问来源于stack exchange,提问作者John Greene

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:41:06