blob: c16e58d3129ab8db0d5e2b126f269116c2d9d360 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sysml.parser;
import java.util.HashMap;
public class BooleanExpression extends Expression
{
private Expression _left;
private Expression _right;
private BooleanOp _opcode;
public BooleanExpression(BooleanOp bop){
_opcode = bop;
setFilename("MAIN SCRIPT");
setBeginLine(0);
setBeginColumn(0);
setEndLine(0);
setEndColumn(0);
setText(null);
}
public BooleanExpression(BooleanOp bop, ParseInfo parseInfo) {
_opcode = bop;
setParseInfo(parseInfo);
}
public BooleanOp getOpCode(){
return _opcode;
}
public void setLeft(Expression l){
_left = l;
// update script location information --> left expression is BEFORE in script
if (_left != null){
this.setParseInfo(_left);
}
}
public void setRight(Expression r){
_right = r;
// update script location information --> right expression is AFTER in script
if (_right != null){
this.setParseInfo(_right);
}
}
public Expression getLeft(){
return _left;
}
public Expression getRight(){
return _right;
}
@Override
public Expression rewriteExpression(String prefix) throws LanguageException{
BooleanExpression newExpr = new BooleanExpression(this._opcode, this);
newExpr.setLeft(_left.rewriteExpression(prefix));
if (_right != null)
newExpr.setRight(_right.rewriteExpression(prefix));
return newExpr;
}
/**
* Validate parse tree : Process Boolean Expression
*/
@Override
public void validateExpression(HashMap<String,DataIdentifier> ids, HashMap<String, ConstIdentifier> constVars, boolean conditional) throws LanguageException{
this.getLeft().validateExpression(ids, constVars, conditional);
//recursive validate
if (_left instanceof FunctionCallIdentifier){
raiseValidateError("user-defined function calls not supported in boolean expressions",
false, LanguageException.LanguageErrorCodes.UNSUPPORTED_EXPRESSION);
}
if (this.getRight() != null) {
if (_right instanceof FunctionCallIdentifier){
raiseValidateError("user-defined function calls not supported in boolean expressions",
false, LanguageException.LanguageErrorCodes.UNSUPPORTED_EXPRESSION);
}
this.getRight().validateExpression(ids, constVars, conditional);
}
String outputName = getTempName();
DataIdentifier output = new DataIdentifier(outputName);
output.setParseInfo(this);
output.setBooleanProperties();
this.setOutput(output);
if ((_opcode == Expression.BooleanOp.CONDITIONALAND) || (_opcode == Expression.BooleanOp.CONDITIONALOR)) {
// always unconditional (because unsupported operation)
if (_opcode == Expression.BooleanOp.CONDITIONALAND) {
raiseValidateError("Conditional AND (&&) not supported.", false);
} else if (_opcode == Expression.BooleanOp.CONDITIONALOR) {
raiseValidateError("Conditional OR (||) not supported.", false);
}
}
}
@Override
public String toString(){
if (_opcode == BooleanOp.NOT) {
return "(" + _opcode.toString() + " " + _left.toString() + ")";
} else {
return "(" + _left.toString() + " " + _opcode.toString() + " " + _right.toString() + ")";
}
}
@Override
public VariableSet variablesRead() {
VariableSet result = new VariableSet();
result.addVariables(_left.variablesRead());
if (_right != null){
result.addVariables(_right.variablesRead());
}
return result;
}
@Override
public VariableSet variablesUpdated() {
VariableSet result = new VariableSet();
result.addVariables(_left.variablesUpdated());
if (_right != null){
result.addVariables(_right.variablesUpdated());
}
return result;
}
}