jparsec를 사용하여 비교적 단순한 문법을 정의하고 활용하려고 시도하고 있지만, 어떻게해야 할 지 혼란 스럽습니다. 나는 그것이 문제 공간에 대한 나의 부적절한 이해인지 또는 jparsec의 희박하고 유익하지 않은 문서인지에 관해서는이 시점에서 알지 못한다. 아니면 둘다. jparsec의 혼동
foo='abc' AND bar<>'def' OR (biz IN ['a', 'b', 'c'] AND NOT baz = 'foo')
그래서 당신이 운영자 등
AND
,
OR
,
NOT
,
IN
,
=
,
<>
을 지원 볼 수 있습니다
가 나는 문법 같은 것을 가지고있다. 또한 임의로 중첩 된 괄호를 지원하여 우선 순위를 지정합니다.
토큰 화와 상당히 거리가 있다고 생각합니다.
public final class NewParser {
// lexing
private static final Terminals OPERATORS = Terminals.operators("=", "OR", "AND", "NOT", "(", ")", "IN", "[", "]", ",", "<>");
private static final Parser<?> WHITESPACE = Scanners.WHITESPACES;
private static final Parser<?> FIELD_NAME_TOKENIZER = Terminals.Identifier.TOKENIZER;
private static final Parser<?> QUOTED_STRING_TOKENIZER = Terminals.StringLiteral.SINGLE_QUOTE_TOKENIZER.or(Terminals.StringLiteral.DOUBLE_QUOTE_TOKENIZER);
private static final Parser<?> IGNORED = Parsers.or(Scanners.WHITESPACES).skipMany();
private static final Parser<?> TOKENIZER = Parsers.or(OPERATORS.tokenizer(), WHITESPACE, FIELD_NAME_TOKENIZER, QUOTED_STRING_TOKENIZER).many();
@Test
public void test_tokenizer() {
Object result = TOKENIZER.parse("foo='abc' AND bar<>'def' OR (biz IN ['a', 'b', 'c'] AND NOT baz = 'foo')");
Assert.assertEquals("[foo, =, abc, null, AND, null, bar, <>, def, null, OR, null, (, biz, null, IN, null, [, a, ,, null, b, ,, null, c, ], null, AND, null, NOT, null, baz, null, =, null, foo,)]", result.toString());
}
}
test_tokenizer
패스, 그래서 그것을 확인 일하고 생각 : 여기있는거야.
이제 구문을 나타내는 형식 계층 구조가 이미 있습니다. 예를 들어, Node
, BinaryNode
, FieldNode
, LogicalAndNode
, ConstantNode
등의 클래스가 있습니다. 그리고 내가하려는 것은 Parser
을 만들어서 내 토큰을 받아서 Node
을 뱉어 낸다. 그리고 이것은 내가 계속 붙어있는 곳입니다.
public static Parser<Node> parser = fieldNodeParser.from(TOKENIZER);
하지만 그건 나에게 컴파일 오류를 준다 : 나는 내가이 일을 할 수있을 거라고 생각
private static Parser<FieldNode> fieldNodeParser =
Parsers.sequence(FIELD_NAME_TOKENIZER)
.map(new Map<Object, FieldNode>() {
@Override
public FieldNode map(Object from) {
Fragment fragment = (Fragment)from;
return new FieldNode(fragment.text());
}
});
:
는 나는이 같은 정말 간단 뭔가 시작 거라고 생각 :
The method from(Parser<? extends Collection<Token>>) in the type Parser<FieldNode> is not applicable for the arguments (Parser<capture#6-of ?>)
제 제네릭 어딘가에있는 것처럼 보이지만 어디에서 어떻게 수정해야하는지 모릅니다. 나는 이것이 올바른 방식으로 진행될 지 확신 할 수 없다. 누구나 나를 계몽시킬 수 있습니까?