65 lines
1.5 KiB
Java
65 lines
1.5 KiB
Java
package dev.peerat.framework.utils.json;
|
|
|
|
import be.jeffcheasey88.peeratcode.parser.Token;
|
|
import be.jeffcheasey88.peeratcode.parser.TokenType;
|
|
import be.jeffcheasey88.peeratcode.parser.Tokenizer;
|
|
|
|
public class JsonTokenizer extends Tokenizer{
|
|
|
|
@Override
|
|
public void parse(String line){
|
|
for(int i = 0; i < line.length(); i++){
|
|
char c = line.charAt(i);
|
|
|
|
if(isValidName(c)){
|
|
String buffer = ""+c;
|
|
int j = i+1;
|
|
for(; j < line.length(); j++){
|
|
c = line.charAt(j);
|
|
if(isValidName(c)) buffer+=c;
|
|
else break;
|
|
}
|
|
getTokens().add(new Token(1, i+1, buffer, TokenType.NAME));
|
|
i=j-1;
|
|
}else if(Character.isWhitespace(c)) continue;
|
|
else{
|
|
if(c == '"'){
|
|
String buffer = "";
|
|
int j = i+1;
|
|
for(; j < line.length(); j++){
|
|
c = line.charAt(j);
|
|
if(c == '\\'){
|
|
c = line.charAt(++j);
|
|
switch(c){
|
|
case 'n':
|
|
buffer+='\n';
|
|
break;
|
|
case 'r':
|
|
buffer+='\r';
|
|
break;
|
|
case 't':
|
|
buffer+='\t';
|
|
break;
|
|
default:
|
|
buffer+=c;
|
|
break;
|
|
}
|
|
continue;
|
|
}
|
|
if(c == '\"') break;
|
|
buffer+=c;
|
|
}
|
|
getTokens().add(new Token(1, i+1, buffer, TokenType.STRING));
|
|
i=j;
|
|
continue;
|
|
}
|
|
getTokens().add(new Token(1, i+1, ""+c, TokenType.DELIMITER));
|
|
}
|
|
}
|
|
}
|
|
|
|
private boolean isValidName(char c){
|
|
return c == '_' || c == '-' || c == '$' || Character.isAlphabetic(c) || Character.isDigit(c);
|
|
}
|
|
|
|
}
|