私は非常に単純な文法を定義して利用するために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
通るので、私はそれがOK働いて思い:ここに私が持っているものです。
ここでは、すでに構文を表す型階層があります。例えば、Node
,BinaryNode
,FieldNode
,LogicalAndNode
,ConstantNode
などと呼ばれるクラスがあります。私がしようとしているのはを吐き出して吐き出すParser
です。そして、これは私が立ち往生し続けるところです。
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 ?>)
私のジェネリック医薬品はどこかにありますが、どこでどのように修正するかはわかりません。私はこのことについて正しいことをするつもりはないと確信しています。誰も私を啓発することはできますか?