Class OperatorTable<T>
Parser
to parse expressions with operator-precedence grammar. The operators
and precedences are declared in this table.
Operators have precedences. The higher the precedence number, the higher the precedence. For the same precedence, prefix > postfix > left-associative > non-associative > right-associative.
For example:
Unary<Integer> negate = new Unary<Integer>() {... return -n; };
Binary<Integer> plus = new Binary<Integer>() {... return a + b; };
Binary<Integer> minus = new Binary<Integer>() {... return a - b; };
...
Terminals terms = Terminals.operators("+", "-", "*", "/");
Parser<Integer> calculator = new OperatorTable()
.prefix(terms.token("-").retn(negate), 100)
.infixl(terms.token("+").retn(plus), 10)
.infixl(terms.token("-").retn(minus), 10)
.infixl(terms.token("*").retn(multiply), 20)
.infixl(terms.token("/").retn(divide), 20)
.build(Terminals.IntegerLiteral.PARSER.map(stringToInteger));
Parser<Integer> parser = calculator.from(
terms.tokenizer().or(Terminals.IntegerLiteral.TOKENIZER), Scanners.WHITESPACES.optional());
return parser.parse(text);
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescription(package private) static enum
Describes operator associativity, in order of precedence.(package private) static final class
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionBuilds aParser
based on information in thisOperatorTable
.private static <T> Parser
<T> build
(Parser op, OperatorTable.Associativity associativity, Parser<T> operand) (package private) static <T> Parser
<T> buildExpressionParser
(Parser<? extends T> term, OperatorTable.Operator... ops) Builds aParser
based on information described byOperatorTable
.Adds an infix left-associative binary operator.Adds an infix non-associative binary operator.Adds an infix right-associative binary operator.(package private) OperatorTable.Operator[]
Adds a postfix unary operator.Adds a prefix unary operator.private static Parser
<?> slice
(OperatorTable.Operator[] ops, int begin, int end)
-
Field Details
-
ops
-
-
Constructor Details
-
OperatorTable
public OperatorTable()
-
-
Method Details
-
prefix
public OperatorTable<T> prefix(Parser<? extends Function<? super T, ? extends T>> parser, int precedence) Adds a prefix unary operator.- Parameters:
parser
- the parser for the operator.precedence
- the precedence number.- Returns:
- this.
-
postfix
public OperatorTable<T> postfix(Parser<? extends Function<? super T, ? extends T>> parser, int precedence) Adds a postfix unary operator.- Parameters:
parser
- the parser for the operator.precedence
- the precedence number.- Returns:
- this.
-
infixl
public OperatorTable<T> infixl(Parser<? extends BiFunction<? super T, ? super T, ? extends T>> parser, int precedence) Adds an infix left-associative binary operator.- Parameters:
parser
- the parser for the operator.precedence
- the precedence number.- Returns:
- this.
-
infixr
public OperatorTable<T> infixr(Parser<? extends BiFunction<? super T, ? super T, ? extends T>> parser, int precedence) Adds an infix right-associative binary operator.- Parameters:
parser
- the parser for the operator.precedence
- the precedence number.- Returns:
- this.
-
infixn
public OperatorTable<T> infixn(Parser<? extends BiFunction<? super T, ? super T, ? extends T>> parser, int precedence) Adds an infix non-associative binary operator.- Parameters:
parser
- the parser for the operator.precedence
- the precedence number.- Returns:
- this.
-
build
Builds aParser
based on information in thisOperatorTable
.- Parameters:
operand
- parser for the operands.- Returns:
- the expression parser.
-
operators
OperatorTable.Operator[] operators() -
buildExpressionParser
Builds aParser
based on information described byOperatorTable
.- Parameters:
term
- parser for the terminals.ops
- the operators.- Returns:
- the expression parser.
-
slice
-
build
private static <T> Parser<T> build(Parser op, OperatorTable.Associativity associativity, Parser<T> operand)
-