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

时间:2014-06-04 07:37:33

标签: python parsing abstract-syntax-tree

我正在尝试使用以下用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>)

1 个答案:

答案 0 :(得分:-1)

您需要什么格式?它有一些美学缺陷,你应该只使用方括号作为一维元素集,对于多维集,使用大括号因为它们适合。此外,由于支持空格,所以不需要逗号,它们添加噪声,它们对解析器没有语法价值。另外我看到值和keyvaluepairs存在于同一个包含元素中,解析效率非常低,因为解析器无法在没有反复试验的情况下知道它是否应该读取文字或标识符,除此之外它不是&#39非常明智地把它们放在同一个内部容器中。

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