zoukankan      html  css  js  c++  java
  • 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, // )
        }
    }
  • 相关阅读:
    MySQL安装失败,提示需安装MicroSoft Visual C++ 2013 Redistributable
    Selinium登录系统cookies的重复使用
    脚本绕开验证码,自动执行的方法
    Firebug显示停用状态
    web自动化测试中绕开验证码登陆的方式
    java使用poi包将数据写入Excel表格
    读取config配置
    定位元素的等待方法
    jxl读取Excel表格数据
    php中的魔术常量
  • 原文地址:https://www.cnblogs.com/kinglead/p/14362717.html
Copyright © 2011-2022 走看看