summaryrefslogtreecommitdiffstats
path: root/searchlib/src/main/javacc/RankingExpressionParser.jj
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-11-23 13:25:02 +0100
committerJon Bratseth <bratseth@yahoo-inc.com>2016-11-23 13:25:02 +0100
commit015cedfb6dbd15dec60602ba3082198502d1c5d9 (patch)
tree2b546af79cc157e12b4300e358e8869fe003f409 /searchlib/src/main/javacc/RankingExpressionParser.jj
parent2b4e552165c18544e1ae702175d632e1e39a6e46 (diff)
Parse lambda
Diffstat (limited to 'searchlib/src/main/javacc/RankingExpressionParser.jj')
-rwxr-xr-xsearchlib/src/main/javacc/RankingExpressionParser.jj63
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() :
{