Я новичок в синтаксическом анализе PEG и пытаюсь написать простой синтаксический анализатор для анализа выражения типа: «term1 OR term2 Anotherterm», в идеале в AST, который будет выглядеть примерно так:
OR
-----------|---------
| |
"term1" "term2 anotherterm"
В настоящее время я использую Grappa (https://github.com/fge/grappa), но она не соответствует даже более простое выражение «термин1 ИЛИ термин2». Вот что у меня есть:
package grappa;
import com.github.fge.grappa.annotations.Label;
import com.github.fge.grappa.parsers.BaseParser;
import com.github.fge.grappa.rules.Rule;
public class ExprParser extends BaseParser<Object> {
@Label("expr")
Rule expr() {
return sequence(terms(), wsp(), string("OR"), wsp(), terms(), push(match()));
}
@Label("terms")
Rule terms() {
return sequence(whiteSpaces(),
join(term()).using(wsp()).min(0),
whiteSpaces());
}
@Label("term")
Rule term() {
return sequence(oneOrMore(character()), push(match()));
}
Rule character() {
return anyOf(
"0123456789" +
"abcdefghijklmnopqrstuvwxyz" +
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"-_");
}
@Label("whiteSpaces")
Rule whiteSpaces() {
return join(zeroOrMore(wsp())).using(sequence(optional(cr()), lf())).min(0);
}
}
Может кто-то указать мне верное направление?