TokenType ([{}{}()])[{}]{}

package com.kinglead;

import java.util.ArrayList;
import java.util.List;

/**
 * @author kinglead
 * @date 2021-01-29 下午 20:55
 * @describe {请写具体描述}
 */
public class Test3  {

    private static int LEFT_SQUARE_BRACKET_COUNT = 0;
    private static int LEFT_CURLY_BRACKET_COUNT = 0;
    private static int LEFT_BRACKET_COUNT = 0;

    //([{}{}()])[{}]{}
    public static void main(String[] args) {
        List<Token> list = parseCode("([{}{}()])[{}]{}");
        System.out.println(list);
    }

    private static List<Token> parseCode(String codeText){
        //空判断
        if(codeText == null || "".equals(codeText)) return new ArrayList<>();
        List<Token> list = new ArrayList<>();
        while (!"".equals(codeText)) {
            String firstStr = codeText.substring(0,1);
            if ("[".equals(firstStr)) {
                LEFT_SQUARE_BRACKET_COUNT++;
                Token token = new Token();
                token.setType(TokenType.LEFT_SQUARE_BRACKET);
                list.add(token);
                codeText = func(token, codeText.substring(1));
            }
            if ("{".equals(firstStr)) {
                LEFT_CURLY_BRACKET_COUNT++;
                Token token = new Token();
                token.setType(TokenType.LEFT_CURLY_BRACKET);
                list.add(token);
                codeText = func(token, codeText.substring(1));
            }
            if ("(".equals(firstStr)) {
                LEFT_BRACKET_COUNT++;
                Token token = new Token();
                token.setType(TokenType.LEFT_BRACKET);
                list.add(token);
                codeText = func(token, codeText.substring(1));
            }
        }
//        func(null, codeText, list);
        return list;
    }

    private static String func(Token token, String codeText){
        if(codeText == null || "".equals(codeText)) return "";
        List<Token> childrenList = new ArrayList<>();
        String firstStr = codeText.substring(0,1);
        if("[".equals(firstStr)){
            LEFT_SQUARE_BRACKET_COUNT++;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.LEFT_SQUARE_BRACKET);
            childrenList.add(tokenChildren);
            codeText = func(tokenChildren, codeText.substring(1));
            token.setChildren(childrenList);
        }
        if("]".equals(firstStr)){
            LEFT_SQUARE_BRACKET_COUNT--;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.RIGHT_SQUARE_BRACKET);
            childrenList.add(tokenChildren);
            if(LEFT_SQUARE_BRACKET_COUNT != 0 || LEFT_CURLY_BRACKET_COUNT != 0 || LEFT_BRACKET_COUNT != 0) {
                codeText = func(tokenChildren, codeText.substring(1));
            }else{
                codeText = codeText.substring(1);
            }
            token.setChildren(childrenList);
        }
        if("{".equals(firstStr)){
            LEFT_CURLY_BRACKET_COUNT++;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.LEFT_CURLY_BRACKET);
            childrenList.add(tokenChildren);
            codeText = func(tokenChildren, codeText.substring(1));
            token.setChildren(childrenList);
        }
        if("}".equals(firstStr)){
            LEFT_CURLY_BRACKET_COUNT--;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.RIGHT_CURLY_BRACKET);
            childrenList.add(tokenChildren);
            if(LEFT_SQUARE_BRACKET_COUNT != 0 || LEFT_CURLY_BRACKET_COUNT != 0 || LEFT_BRACKET_COUNT != 0) {
                codeText = func(tokenChildren, codeText.substring(1));
            }else{
                codeText = codeText.substring(1);
            }
            token.setChildren(childrenList);
        }
        if("(".equals(firstStr)){
            LEFT_BRACKET_COUNT++;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.LEFT_BRACKET);
            childrenList.add(tokenChildren);
            codeText = func(tokenChildren, codeText.substring(1));
            token.setChildren(childrenList);
        }
        if(")".equals(firstStr)){
            LEFT_BRACKET_COUNT--;
            Token tokenChildren = new Token();
            tokenChildren.setType(TokenType.RIGHT_BRACKET);
            childrenList.add(tokenChildren);
            if(LEFT_SQUARE_BRACKET_COUNT != 0 || LEFT_CURLY_BRACKET_COUNT != 0 || LEFT_BRACKET_COUNT != 0) {
                codeText = func(tokenChildren, codeText.substring(1));
            }else{
                codeText = codeText.substring(1);
            }
            token.setChildren(childrenList);
        }
        return codeText;
    }



    // 词法树节点
    static class Token {
        TokenType type;
        List<Token> children;

        public TokenType getType() {
            return type;
        }

        public void setType(TokenType type) {
            this.type = type;
        }

        public List<Token> getChildren() {
            return children;
        }

        public void setChildren(List<Token> children) {
            this.children = children;
        }

        @Override
        public String toString() {
            return "Token{" +
                    "type=" + type +
                    ", children=" + children +
                    '}';
        }
    }

    // 词类型
    enum TokenType {
        LEFT_SQUARE_BRACKET, // [
        RIGHT_SQUARE_BRACKET, // ]
        LEFT_CURLY_BRACKET, // {
        RIGHT_CURLY_BRACKET, // }
        LEFT_BRACKET, // (
        RIGHT_BRACKET, // )
    }
}

 

posted on 2021-02-02 16:25  kinglead  阅读(278)  评论(0编辑  收藏  举报

导航