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
です。そして、これは私が立ち往生し続ける場所です。
私は、次のような非常に単純なものから始めようと考えました。
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());
}
});
私はこれを行うことができると思いました:
public static Parser<Node> parser = fieldNodeParser.from(TOKENIZER);
しかし、それは私にコンパイルエラーを与えます:
The method from(Parser<? extends Collection<Token>>) in the type Parser<FieldNode> is not applicable for the arguments (Parser<capture#6-of ?>)
したがって、ジェネリックがどこかで壊れているように見えますが、これをどこでどのように修正すればよいかわかりません。私はこれについて正しい方法で行っているかどうかさえ確信が持てません。誰でも私を啓発できますか?