private boolean makeSyntaxRule(CTX ctx, List<Token> tls, int s, int e, List<Token> adst) { String nameid = null; for (int i = s; i < e; i++) { Token tk = tls.get(i); if (tk.tt == TK.INDENT) continue; if (tk.tt == TK.TEXT) { int[] ia = new int[] {i}; if (checkNestedSyntax(ctx, tls, ia, e, TK.AST_PARENTHESIS, '(', ')') || checkNestedSyntax(ctx, tls, ia, e, TK.AST_BRANCET, '[', ']') || checkNestedSyntax(ctx, tls, ia, e, TK.AST_BRACE, '{', '}')) { i = ia[0]; } else { tk.tt = TK.CODE; tk.kw = tk.text; } adst.add(tk); continue; } if (tk.tt == TK.SYMBOL || tk.tt == TK.USYMBOL) { if (i > 0 && tls.get(i - 1).topch == '$') { tk.kw = "$" + tk.text; tk.tt = TK.METANAME; if (nameid == null) nameid = tk.kw; tk.nameid = nameid; nameid = null; adst.add(tk); continue; } if (i + 1 < e && tls.get(i + 1).topch == ':') { nameid = tls.get(i).text; i++; continue; } } if (tk.tt == TK.OPERATOR) { int[] ia = new int[] {i}; if (checkNestedSyntax(ctx, tls, ia, e, TK.AST_OPTIONAL, '[', ']')) { adst.add(tk); i = ia[0]; continue; } if (tls.get(i).topch == '$') continue; } return false; } return true; }
private boolean checkNestedSyntax( CTX ctx, List<Token> tls, int[] s, int e, int tt, int opench, int closech) { int i = s[0]; Token tk = tls.get(i); String t = tk.text; if (t.length() == 1 && t.charAt(0) == opench) { int ne = findTopCh(ctx, tls, i + 1, e, tk.tt, closech); tk.tt = tt; if (tt >= 0 && tt < KW.TK_KW.length) tk.kw = KW.TK_KW[tt]; tk.sub = new ArrayList<Token>(); tk.topch = opench; tk.closech = closech; makeSyntaxRule(ctx, tls, i + 1, ne, tk.sub); s[0] = ne; return true; } return false; }