You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
2.9 KiB
157 lines
2.9 KiB
package com.jayway.jsonpath.internal; |
|
|
|
public class Parser { |
|
|
|
public enum Token { |
|
DOT('.'), |
|
OPEN_BRACKET('['), |
|
CLOSE_BRACKET(']'), |
|
OPEN_PARENTHESIS('('), |
|
CLOSE_PARENTHESIS(')'), |
|
BLANK(' '), |
|
TICK('\''), |
|
END('^'); |
|
|
|
private final char c; |
|
|
|
Token(char c) { |
|
this.c = c; |
|
} |
|
} |
|
|
|
|
|
protected String buffer; |
|
private int i; |
|
|
|
public Parser(String src) { |
|
buffer = src; |
|
i = -1; |
|
} |
|
|
|
public char prev(){ |
|
return buffer.charAt(i-1); |
|
} |
|
|
|
public boolean prevIs(char c){ |
|
if(i <= 0){ |
|
return false; |
|
} |
|
return prev() == c; |
|
} |
|
|
|
public char curr(){ |
|
return buffer.charAt(i); |
|
} |
|
|
|
public char peek(){ |
|
return buffer.charAt(i + 1); |
|
} |
|
|
|
public boolean peekIs(Token token){ |
|
return buffer.charAt(i+1) == token.c; |
|
} |
|
|
|
public char next(){ |
|
return buffer.charAt(++i); |
|
} |
|
|
|
public boolean hasNext(){ |
|
return i < buffer.length() - 1; |
|
} |
|
|
|
public String next(int count){ |
|
//i++; |
|
int y = i; |
|
i = i + count - 1; |
|
return buffer.substring(y, i+1); |
|
//return Arrays.copyOfRange(buffer, y, i+1); |
|
} |
|
|
|
public void trim(Token token){ |
|
while (peekIs(token)){ |
|
next(); |
|
} |
|
} |
|
|
|
public int findOffset(Token... tokens){ |
|
int y = i; |
|
char check; |
|
do { |
|
if(y == buffer.length()-1 && contains(tokens, Token.END.c)){ |
|
y++; |
|
break; |
|
} |
|
check = buffer.charAt(++y); |
|
} while (!contains(tokens, check)); |
|
|
|
return y-i; |
|
} |
|
|
|
public String nextUntil(Token... tokens){ |
|
next(); |
|
int offset = findOffset(tokens); |
|
return next(offset); |
|
} |
|
|
|
public boolean isInts(String chars, boolean allowSequence){ |
|
for (int i = 0; i < chars.length(); i++){ |
|
|
|
char c = chars.charAt(i); |
|
|
|
boolean isSequenceChar = (c == ' ' || c == ','); |
|
|
|
if(!Character.isDigit(c) || (isSequenceChar && allowSequence)){ |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
|
|
private boolean contains(Token[] arr, char checkFor){ |
|
for (int i = 0; i < arr.length; i++){ |
|
if(arr[i].c == checkFor){ |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
|
|
|
|
/* |
|
public Filter2 parse(String filterString){ |
|
|
|
char[] chars = filterString.trim().toCharArray(); |
|
int i = 0; |
|
|
|
|
|
do { |
|
char current = chars[i]; |
|
switch (current){ |
|
case '?': |
|
break; |
|
|
|
case '(': |
|
break; |
|
|
|
case ')': |
|
break; |
|
|
|
case '\''; |
|
} |
|
|
|
|
|
i++; |
|
} while (i < chars.length); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
*/ |
|
}
|
|
|