Skip to main content
Homepage
Explore
Search or go to…
/
Register
Sign in
Explore
Primary navigation
Project
eraser
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Collapse sidebar
Snippets
Groups
Projects
Show more breadcrumbs
OpenLicht
eraser
Commits
54274749
Commit
54274749
authored
May 9, 2019
by
René Schöne
Browse files
Options
Downloads
Patches
Plain Diff
Implement eval and add test for the expression sub-language.
parent
e3024b14
No related branches found
No related tags found
No related merge requests found
Changes
2
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
eraser-base/src/main/jastadd/Expression.jrag
+25
-2
25 additions, 2 deletions
eraser-base/src/main/jastadd/Expression.jrag
eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java
+151
-0
151 additions, 0 deletions
...t/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java
with
176 additions
and
2 deletions
eraser-base/src/main/jastadd/Expression.jrag
+
25
−
2
View file @
54274749
aspect Expression {
aspect Expression {
syn boolean LogicalExpression.eval() = false;
//--- eval (logical) ---
syn boolean LogicalExpression.eval();
eq ParenthesizedLogicalExpression.eval() = getOperand().eval();
eq NotExpression.eval() = !getOperand().eval();
eq NotExpression.eval() = !getOperand().eval();
eq ComparingExpression.eval() {
eq ComparingExpression.eval() {
// TODO
double leftValue = getLeftOperand().eval();
double rightValue = getRightOperand().eval();
switch (getComparator()) {
case LessThan: return leftValue < rightValue;
case LessOrEqualThan: return leftValue <= rightValue;
case Equals: return leftValue == rightValue;
case NotEquals: return leftValue != rightValue;
case GreaterThan: return leftValue > rightValue;
case GreaterOrEqualThan: return leftValue >= rightValue;
}
return false;
return false;
}
}
eq AndExpression.eval() = getLeftOperand().eval() && getRightOperand().eval();
eq AndExpression.eval() = getLeftOperand().eval() && getRightOperand().eval();
eq OrExpression.eval() = getLeftOperand().eval() || getRightOperand().eval();
eq OrExpression.eval() = getLeftOperand().eval() || getRightOperand().eval();
//--- eval (number) ---
syn double NumberExpression.eval();
eq AddExpression.eval() = getLeftOperand().eval() + getRightOperand().eval();
eq SubExpression.eval() = getLeftOperand().eval() - getRightOperand().eval();
eq MultExpression.eval() = getLeftOperand().eval() * getRightOperand().eval();
eq DivExpression.eval() = getLeftOperand().eval() / getRightOperand().eval();
eq PowerExpression.eval() = Math.pow(getLeftOperand().eval(), getRightOperand().eval());
eq Designator.eval() = getItem().getStateAsDouble();
eq ParenthesizedNumberExpression.eval() = getOperand().eval();
eq NumberLiteralExpression.eval() = getValue();
}
}
This diff is collapsed.
Click to expand it.
eraser-base/src/test/java/de/tudresden/inf/st/eraser/ExpressionEvalTest.java
0 → 100644
+
151
−
0
View file @
54274749
package
de.tudresden.inf.st.eraser
;
import
beaver.Parser
;
import
de.tudresden.inf.st.eraser.jastadd.model.*
;
import
de.tudresden.inf.st.eraser.util.ParserUtils
;
import
org.junit.Test
;
import
java.io.IOException
;
import
static
org
.
hamcrest
.
core
.
IsEqual
.
equalTo
;
import
static
org
.
hamcrest
.
core
.
IsInstanceOf
.
instanceOf
;
import
static
org
.
junit
.
Assert
.
assertThat
;
/**
* Test correct evaluation of NumberExpression and LogicalExpression.
*
* @author rschoene - Initial contribution
*/
public
class
ExpressionEvalTest
{
@Test
public
void
plusExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(3 + 4)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
7.0
));
}
@Test
public
void
minusExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(4.1 - 12.5)"
);
assertThat
(
sut
.
eval
(),
equalTo
(-
8.4
));
}
@Test
public
void
multExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(3 * 4)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
12.0
));
}
@Test
public
void
divExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(1.1 / 4.0)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
0.275
));
}
@Test
public
void
powerExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(16 ^ 0.5)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
4.0
));
}
@Test
public
void
parenthesizedExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"(3)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
3.0
));
}
@Test
public
void
complexExpression
()
throws
IOException
,
Parser
.
Exception
{
NumberExpression
sut
=
ParserUtils
.
parseNumberExpression
(
"((3 + 4) * (1 / (12 - 8)))"
);
assertThat
(
sut
.
eval
(),
equalTo
(
1.75
));
MultExpression
multExpression
=
(
MultExpression
)
sut
;
// 3+4
assertThat
(
multExpression
.
getLeftOperand
(),
instanceOf
(
AddExpression
.
class
));
assertThat
(
multExpression
.
getLeftOperand
().
eval
(),
equalTo
(
7.0
));
// 1/(12-8)
assertThat
(
multExpression
.
getRightOperand
(),
instanceOf
(
DivExpression
.
class
));
DivExpression
divExpression
=
(
DivExpression
)
multExpression
.
getRightOperand
();
assertThat
(
divExpression
.
eval
(),
equalTo
(
0.25
));
// 12-8
assertThat
(
divExpression
.
getRightOperand
().
eval
(),
equalTo
(
4.0
));
}
@Test
public
void
comparingExpressions
()
throws
IOException
,
Parser
.
Exception
{
comparingExpression
(
1
,
"<"
,
2
,
true
);
comparingExpression
(
2
,
"<"
,
2
,
false
);
comparingExpression
(
3
,
"<"
,
2
,
false
);
comparingExpression
(
3
,
"<="
,
4
,
true
);
comparingExpression
(
4
,
"<="
,
4
,
true
);
comparingExpression
(
5
,
"<="
,
4
,
false
);
comparingExpression
(
5
,
"=="
,
6
,
false
);
comparingExpression
(
6
,
"=="
,
6
,
true
);
comparingExpression
(
7
,
"!="
,
8
,
true
);
comparingExpression
(
8
,
"!="
,
8
,
false
);
comparingExpression
(
9
,
"=>"
,
10
,
false
);
comparingExpression
(
10
,
"=>"
,
10
,
true
);
comparingExpression
(
11
,
"=>"
,
10
,
true
);
comparingExpression
(
11
,
">"
,
12
,
false
);
comparingExpression
(
12
,
">"
,
12
,
false
);
comparingExpression
(
13
,
">"
,
12
,
true
);
}
private
void
comparingExpression
(
double
left
,
String
actualComparatorString
,
double
right
,
boolean
expectedResult
)
throws
IOException
,
Parser
.
Exception
{
LogicalExpression
sut
=
ParserUtils
.
parseLogicalExpression
(
String
.
format
(
"(%f %s %f)"
,
left
,
actualComparatorString
,
right
));
assertThat
(
sut
.
eval
(),
equalTo
(
expectedResult
));
}
@Test
public
void
notExpression
()
throws
IOException
,
Parser
.
Exception
{
LogicalExpression
sut
=
ParserUtils
.
parseLogicalExpression
(
"!(0==0)"
);
assertThat
(
sut
.
eval
(),
equalTo
(
false
));
LogicalExpression
sut2
=
ParserUtils
.
parseLogicalExpression
(
"!!(0==0)"
);
assertThat
(
sut2
.
eval
(),
equalTo
(
true
));
}
@Test
public
void
andExpression
()
throws
IOException
,
Parser
.
Exception
{
LogicalExpression
sut
=
ParserUtils
.
parseLogicalExpression
(
"((0==0) & (0==0))"
);
assertThat
(
sut
.
eval
(),
equalTo
(
true
));
LogicalExpression
sut2
=
ParserUtils
.
parseLogicalExpression
(
"((0==0) & (0==1))"
);
assertThat
(
sut2
.
eval
(),
equalTo
(
false
));
LogicalExpression
sut3
=
ParserUtils
.
parseLogicalExpression
(
"((0==1) & (0==0))"
);
assertThat
(
sut3
.
eval
(),
equalTo
(
false
));
LogicalExpression
sut4
=
ParserUtils
.
parseLogicalExpression
(
"((0==1) & (0==1))"
);
assertThat
(
sut4
.
eval
(),
equalTo
(
false
));
}
@Test
public
void
orExpression
()
throws
IOException
,
Parser
.
Exception
{
LogicalExpression
sut
=
ParserUtils
.
parseLogicalExpression
(
"((0==0) | (0==0))"
);
assertThat
(
sut
.
eval
(),
equalTo
(
true
));
LogicalExpression
sut2
=
ParserUtils
.
parseLogicalExpression
(
"((0==0) | (0==1))"
);
assertThat
(
sut2
.
eval
(),
equalTo
(
true
));
LogicalExpression
sut3
=
ParserUtils
.
parseLogicalExpression
(
"((0==1) | (0==0))"
);
assertThat
(
sut3
.
eval
(),
equalTo
(
true
));
LogicalExpression
sut4
=
ParserUtils
.
parseLogicalExpression
(
"((0==1) | (0==1))"
);
assertThat
(
sut4
.
eval
(),
equalTo
(
false
));
}
@Test
public
void
parenthesizedLogicalExpression
()
throws
IOException
,
Parser
.
Exception
{
LogicalExpression
sut
=
ParserUtils
.
parseLogicalExpression
(
"((0==0))"
);
assertThat
(
sut
.
eval
(),
equalTo
(
true
));
ParenthesizedLogicalExpression
parenthesizedLogicalExpression
=
(
ParenthesizedLogicalExpression
)
sut
;
assertThat
(
parenthesizedLogicalExpression
.
getOperand
().
eval
(),
equalTo
(
true
));
}
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment