package net.ion.rosetta.bleujinx;
import java.util.List;
import junit.framework.TestCase;
import net.ion.craken.expression.QualifiedName;
import net.ion.framework.util.Debug;
import net.ion.rosetta.Parser;
import net.ion.rosetta.Parsers;
import net.ion.rosetta.Scanners;
import net.ion.rosetta.Terminals;
import net.ion.rosetta.Tokens.Tag;
import net.ion.rosetta.misc.Mapper;
public class TestStudyToken extends TestCase {
final static String[] OPERATORS = {"+", "-", "*", "/", "%", ">", "<", "=", "==", ">=", "<=", "<>", ".", ",", "(", ")", "[", "]", "&&", "||"};
final static Terminals TERMS = Terminals.caseInsensitive(OPERATORS, new String[0]);
final Parser<?> TOKENIZER = Parsers.or(Terminals.DecimalLiteral.TOKENIZER, Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER, TERMS.tokenizer());
public void testArrayExpr() throws Exception {
Parser<String> parser = Parsers.between(term("["), Terminals.fragment(Tag.RESERVED, Tag.IDENTIFIER), term("]")).or(Terminals.Identifier.PARSER);
// parser = arrayParser().or(Terminals.Identifier.PARSER);
final Parser<QualifiedName> qparser = Mapper.curry(QualifiedName.class).sequence(parser.sepBy1(term("."))) ;
String source = "a.d.[abc]";
// Debug.line(TerminalParser.parse(qparser, source)) ;
Debug.line(qparser.from(TOKENIZER, Scanners.SQL_DELIMITER).parse(source));
// Debug.line(arrayParser().parse("'a'")) ;
}
public void testBetween() throws Exception {
Parser<Object> p = Parsers.sequence(Parsers.between(term("["), Terminals.Identifier.PARSER, term("]")).or(Terminals.Identifier.PARSER).sepBy1(term("."))) ;
// Parser<String> p = Parsers.between(term("["), Terminals.fragment(Tag.RESERVED, Tag.IDENTIFIER), term("]")).or(Terminals.Identifier.PARSER) ;
// Debug.line(TerminalParser.parse(p, "abc")) ;
// Debug.line(p.parse("abc")) ;
// p = Terminals.Identifier.PARSER ;
Object parsed = p.from(TOKENIZER, Scanners.SQL_DELIMITER).parse("[abc].b.c.[def]");
Debug.debug(parsed, parsed.getClass()) ;
}
public void testBetween2() throws Exception {
Parser<List<String>> np = Terminals.fragment(Tag.IDENTIFIER, Tag.RESERVED).many();
// np = Parsers.between(term("["), Terminals.fragment(Tag.RESERVED, Tag.IDENTIFIER), term("]")).or(Terminals.Identifier.PARSER).many() ;
Debug.line(np.from(TOKENIZER, Scanners.SQL_DELIMITER).parse("abc.b.c")) ;
Debug.line(np.from(TOKENIZER, Scanners.SQL_DELIMITER).parse("[abc].b.c")) ;
}
public void testWhenBetweenParser() throws Exception {
Parser<String> parser = Parsers.between(term("["), Terminals.fragment(Tag.RESERVED, Tag.IDENTIFIER), term("]")).or(Terminals.Identifier.PARSER);
printParsed(parser) ;
}
public void testWhenArrayIdenfier() throws Exception {
Parser<String> parser = Scanners.ARRAY_IDENTIFIER.or(Terminals.Identifier.PARSER) ;
printParsed(parser) ;
}
public void testWhen() throws Exception {
Parser<String> parser = Parsers.between(term("["), Terminals.Identifier.PARSER, term("]")).or(Terminals.Identifier.PARSER);
printParsed(parser) ;
}
public void testWhen2() throws Exception {
Parser<String> parser = term("[").next(Terminals.Identifier.PARSER).followedBy(term("]")).source().or(Terminals.Identifier.PARSER);
printParsed(parser) ;
}
private void printParsed(Parser<String> parser){
final Parser<QualifiedName> qparser = Mapper.curry(QualifiedName.class).sequence(parser.sepBy1(term("."))) ;
System.out.println(qparser.from(TOKENIZER, Scanners.SQL_DELIMITER).parse("a.b.[c]")) ;
}
public static Parser<?> term(String term) {
return Mapper._(TERMS.token(term));
}
}