“[a, b=c, [d,e]]”的抽象语法树

问题描述 投票:0回答:2

我正在尝试使用以下用 python 编写的代码为输入“[a, b=c, [d,e]]”生成抽象语法树。

语法:

list     : '[' elements ']'
elements : element (',' element)*
element  : NAME '=' NAME
         | NAME
         | list

抽象语法树代码:

 def parse_element(self):


        if self.__token_at(1).type == TokenTypes.NAME and self.__token_at(2).type == TokenTypes.EQUALS and self.__token_at(3).type == TokenTypes.NAME:
           node = AST(self.__token_at(1))
           self.__match(TokenTypes.NAME)
           return node

           node = AST(self.__token_at(2))
           self.__match(TokenTypes.EQUALS)
           return node

           node = AST(self.__token_at(3))
           self.__match(TokenTypes.NAME)
           return node

        elif self.__token_at(1).type == TokenTypes.NAME:

             node = AST(self.__token_at(1))
             self.__match(TokenTypes.NAME)
             return node

        elif self.__token_at(1).type == TokenTypes.LBRACK:
             return self.parse_list()

输出: 期待找到 RBRACK <'=', EQUALS> (列表<'a', NAME><'b', NAME>)

python parsing abstract-syntax-tree
2个回答
0
投票

我想要这个方程的抽象语法树enter image description here


-1
投票

您需要该格式有何用途?它有一些美学缺陷,您应该只对一维元素集使用方括号,对于多维元素集,使用大括号,因为它们适合。此外,由于支持空格,因此不需要逗号,它们添加噪音,它们对解析器没有语法价值。我还看到值和键值对存在于同一包含元素中,解析效率非常低,因为解析器无法知道是否应该在没有反复试验的情况下读取文字或标识符,而且它不是很明智将它们放入同一个内部容器中。

关于您发布的代码,它没有多大用处。我建议您在继续之前先阅读一个好的 JSON 解析器的源代码。

© www.soinside.com 2019 - 2024. All rights reserved.