diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-11-23 13:25:02 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-11-23 13:25:02 +0100 |
commit | 015cedfb6dbd15dec60602ba3082198502d1c5d9 (patch) | |
tree | 2b546af79cc157e12b4300e358e8869fe003f409 /searchlib/src/main/javacc | |
parent | 2b4e552165c18544e1ae702175d632e1e39a6e46 (diff) |
Parse lambda
Diffstat (limited to 'searchlib/src/main/javacc')
-rwxr-xr-x | searchlib/src/main/javacc/RankingExpressionParser.jj | 63 |
1 files changed, 52 insertions, 11 deletions
diff --git a/searchlib/src/main/javacc/RankingExpressionParser.jj b/searchlib/src/main/javacc/RankingExpressionParser.jj index a800028d00b..2cebbdf7d75 100755 --- a/searchlib/src/main/javacc/RankingExpressionParser.jj +++ b/searchlib/src/main/javacc/RankingExpressionParser.jj @@ -100,7 +100,10 @@ TOKEN : <FMOD: "fmod"> | <ISNAN: "isNan"> | <IN: "in"> | + <F: "f"> | + <MAP: "map"> | <REDUCE: "reduce"> | + <JOIN: "join"> | <AVG: "avg" > | <COUNT: "count"> | <PROD: "prod"> | @@ -317,31 +320,55 @@ ExpressionNode tensorFunction() : ExpressionNode tensorExpression; } { - ( tensorExpression = tensorPrimitiveReduce() | tensorExpression = tensorReduce() ) + ( + tensorExpression = tensorMap() | + tensorExpression = tensorReduce() | + tensorExpression = tensorReduceComposites() + ) { return tensorExpression; } } -ExpressionNode tensorPrimitiveReduce() : +ExpressionNode tensorMap() : +{ + ExpressionNode tensor; + LambdaFunctionNode doubleMapper; +} +{ + <MAP> <LBRACE> tensor = expression() <COMMA> doubleMapper = lambdaFunction() <RBRACE> + { return new TensorMapNode(tensor, doubleMapper); } +} + +LambdaFunctionNode lambdaFunction() : +{ + List<String> variables; + ExpressionNode functionExpression; +} +{ + ( <F> <LBRACE> variables = identifierList() <RBRACE> <LBRACE> functionExpression = expression() <RBRACE> ) + { return new LambdaFunctionNode(variables, functionExpression); } +} + +ExpressionNode tensorReduce() : { - ExpressionNode tensor1; + ExpressionNode tensor; ReduceFunction.Aggregator aggregator; List<String> dimensions = null; } { - <REDUCE> <LBRACE> tensor1 = expression() <COMMA> aggregator = tensorReduceAggregator() dimensions = tagCommaLeadingList() <RBRACE> - { return new TensorReduceNode(tensor1, aggregator, dimensions); } + <REDUCE> <LBRACE> tensor = expression() <COMMA> aggregator = tensorReduceAggregator() dimensions = tagCommaLeadingList() <RBRACE> + { return new TensorReduceNode(tensor, aggregator, dimensions); } } -ExpressionNode tensorReduce() : +ExpressionNode tensorReduceComposites() : { - ExpressionNode tensor1; + ExpressionNode tensor; ReduceFunction.Aggregator aggregator; List<String> dimensions = null; } { aggregator = tensorReduceAggregator() - <LBRACE> tensor1 = expression() dimensions = tagCommaLeadingList() <RBRACE> - { return new TensorReduceNode(tensor1, aggregator, dimensions); } + <LBRACE> tensor = expression() dimensions = tagCommaLeadingList() <RBRACE> + { return new TensorReduceNode(tensor, aggregator, dimensions); } } ReduceFunction.Aggregator tensorReduceAggregator() : @@ -358,8 +385,10 @@ String tensorFunctionName() : ReduceFunction.Aggregator aggregator; } { - ( <REDUCE> { return token.image; } ) - | + ( <F> { return token.image; } ) | + ( <MAP> { return token.image; } ) | + ( <REDUCE> { return token.image; } ) | + ( <JOIN> { return token.image; } ) | ( aggregator = tensorReduceAggregator() { return aggregator.toString(); } ) } @@ -432,6 +461,18 @@ String identifier() : <IDENTIFIER> { return token.image; } } +List<String> identifierList() : +{ + List<String> list = new ArrayList<String>(); + String element; +} +{ + ( element = identifier() { list.add(element); } )? + ( <COMMA> element = identifier() { list.add(element); } ) * + { return list; } +} + + // An identifier or integer String tag() : { |