Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
C
CNNArchLang
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
1
Issues
1
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Test Cases
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
monticore
EmbeddedMontiArc
languages
CNNArchLang
Commits
6096077b
Commit
6096077b
authored
Jan 03, 2018
by
Thomas Michael Timmermanns
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Completed resolve mechanism and output shape computation.
parent
b2d40dcd
Changes
31
Show whitespace changes
Inline
Side-by-side
Showing
31 changed files
with
666 additions
and
501 deletions
+666
-501
pom.xml
pom.xml
+1
-1
src/main/grammars/de/monticore/lang/monticar/CNNArch.mc4
src/main/grammars/de/monticore/lang/monticar/CNNArch.mc4
+4
-2
src/main/java/de/monticore/lang/monticar/cnnarch/Constraint.java
...n/java/de/monticore/lang/monticar/cnnarch/Constraint.java
+37
-5
src/main/java/de/monticore/lang/monticar/cnnarch/PredefinedMethods.java
...de/monticore/lang/monticar/cnnarch/PredefinedMethods.java
+29
-15
src/main/java/de/monticore/lang/monticar/cnnarch/PredefinedVariables.java
.../monticore/lang/monticar/cnnarch/PredefinedVariables.java
+8
-0
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchExpressionSymbol.java
...g/monticar/cnnarch/_symboltable/ArchExpressionSymbol.java
+30
-26
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchRangeExpressionSymbol.java
...ticar/cnnarch/_symboltable/ArchRangeExpressionSymbol.java
+17
-11
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchSequenceExpressionSymbol.java
...ar/cnnarch/_symboltable/ArchSequenceExpressionSymbol.java
+18
-11
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchSimpleExpressionSymbol.java
...icar/cnnarch/_symboltable/ArchSimpleExpressionSymbol.java
+73
-49
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchitectureSymbol.java
...ang/monticar/cnnarch/_symboltable/ArchitectureSymbol.java
+16
-0
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArgumentSymbol.java
...re/lang/monticar/cnnarch/_symboltable/ArgumentSymbol.java
+27
-3
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java
...ticar/cnnarch/_symboltable/CNNArchSymbolTableCreator.java
+16
-13
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/CompositeLayerSymbol.java
...g/monticar/cnnarch/_symboltable/CompositeLayerSymbol.java
+22
-13
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/DimensionKind.java
...ore/lang/monticar/cnnarch/_symboltable/DimensionKind.java
+0
-39
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/DimensionSymbol.java
...e/lang/monticar/cnnarch/_symboltable/DimensionSymbol.java
+0
-71
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/IODeclarationSymbol.java
...ng/monticar/cnnarch/_symboltable/IODeclarationSymbol.java
+1
-1
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/IOLayerSymbol.java
...ore/lang/monticar/cnnarch/_symboltable/IOLayerSymbol.java
+38
-20
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/LayerSymbol.java
...icore/lang/monticar/cnnarch/_symboltable/LayerSymbol.java
+21
-16
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/MethodDeclarationSymbol.java
...onticar/cnnarch/_symboltable/MethodDeclarationSymbol.java
+35
-21
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/MethodLayerSymbol.java
...lang/monticar/cnnarch/_symboltable/MethodLayerSymbol.java
+91
-79
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ShapeSymbol.java
...icore/lang/monticar/cnnarch/_symboltable/ShapeSymbol.java
+87
-69
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/VariableSymbol.java
...re/lang/monticar/cnnarch/_symboltable/VariableSymbol.java
+3
-2
src/test/java/de/monticore/lang/monticar/cnnarch/SymtabTest.java
...t/java/de/monticore/lang/monticar/cnnarch/SymtabTest.java
+33
-6
src/test/java/de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java
...de/monticore/lang/monticar/cnnarch/cocos/AllCoCoTest.java
+4
-0
src/test/resources/architectures/Alexnet.cnna
src/test/resources/architectures/Alexnet.cnna
+2
-2
src/test/resources/architectures/Alexnet_alt.cnna
src/test/resources/architectures/Alexnet_alt.cnna
+4
-4
src/test/resources/architectures/ResNeXt50.cnna
src/test/resources/architectures/ResNeXt50.cnna
+2
-2
src/test/resources/architectures/ThreeInputCNN_M14.cnna
src/test/resources/architectures/ThreeInputCNN_M14.cnna
+4
-4
src/test/resources/valid_tests/Fixed_Alexnet.cnna
src/test/resources/valid_tests/Fixed_Alexnet.cnna
+5
-5
src/test/resources/valid_tests/Fixed_ResNeXt50.cnna
src/test/resources/valid_tests/Fixed_ResNeXt50.cnna
+11
-11
src/test/resources/valid_tests/Fixed_ThreeInputCNN_M14.cnna
src/test/resources/valid_tests/Fixed_ThreeInputCNN_M14.cnna
+27
-0
No files found.
pom.xml
View file @
6096077b
...
@@ -30,7 +30,7 @@
...
@@ -30,7 +30,7 @@
<groupId>
de.monticore.lang.monticar
</groupId>
<groupId>
de.monticore.lang.monticar
</groupId>
<artifactId>
cnn-arch
</artifactId>
<artifactId>
cnn-arch
</artifactId>
<version>
0.
0.2
-SNAPSHOT
</version>
<version>
0.
1.0
-SNAPSHOT
</version>
<!-- == PROJECT DEPENDENCIES ============================================= -->
<!-- == PROJECT DEPENDENCIES ============================================= -->
...
...
src/main/grammars/de/monticore/lang/monticar/CNNArch.mc4
View file @
6096077b
...
@@ -57,9 +57,11 @@ grammar CNNArch extends de.monticore.lang.math.Math {
...
@@ -57,9 +57,11 @@ grammar CNNArch extends de.monticore.lang.math.Math {
ArchSerialSequence
=
serialValues
:(
ArchSimpleExpression
||
"->"
)+;
ArchSerialSequence
=
serialValues
:(
ArchSimpleExpression
||
"->"
)+;
ArchValueRange
implements
ArchValueSequence
=
"["
start
:
ArchSimpleExpression
ArchValueRange
implements
ArchValueSequence
=
start
:
ArchSimpleExpression
(
serial
:
"->"
|
parallel
:
"|"
)
(
serial
:
"->"
|
parallel
:
"|"
)
":"
end
:
ArchSimpleExpression
"]"
;
".."
(
serial2
:
"->"
|
parallel2
:
"|"
)
end
:
ArchSimpleExpression
;
ArchSimpleExpression
=
(
arithmeticExpression
:
MathArithmeticExpression
ArchSimpleExpression
=
(
arithmeticExpression
:
MathArithmeticExpression
...
...
src/main/java/de/monticore/lang/monticar/cnnarch/Constraint.java
View file @
6096077b
...
@@ -51,28 +51,60 @@ public enum Constraint {
...
@@ -51,28 +51,60 @@ public enum Constraint {
INTEGER_TUPLE
{
INTEGER_TUPLE
{
@Override
@Override
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
boolean
res
=
false
;
return
exp
.
isIntTuple
().
get
();
if
(
exp
.
isTuple
()){
//todo
}
return
false
;
}
}
},
},
POSITIVE
{
POSITIVE
{
@Override
@Override
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
if
(
exp
.
getDoubleValue
().
isPresent
()){
return
exp
.
getDoubleValue
().
get
()
>
0
;
}
else
if
(
exp
.
getDoubleTupleValues
().
isPresent
()){
boolean
isPositive
=
true
;
for
(
double
value
:
exp
.
getDoubleTupleValues
().
get
()){
if
(
value
<=
0
){
isPositive
=
false
;
}
}
return
isPositive
;
}
return
false
;
return
false
;
}
}
},
},
NON_NEGATIVE
{
NON_NEGATIVE
{
@Override
@Override
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
if
(
exp
.
getDoubleValue
().
isPresent
()){
return
exp
.
getDoubleValue
().
get
()
>=
0
;
}
else
if
(
exp
.
getDoubleTupleValues
().
isPresent
()){
boolean
isPositive
=
true
;
for
(
double
value
:
exp
.
getDoubleTupleValues
().
get
()){
if
(
value
<
0
){
isPositive
=
false
;
}
}
return
isPositive
;
}
return
false
;
return
false
;
}
}
},
},
BETWEEN_ZERO_AND_ONE
{
BETWEEN_ZERO_AND_ONE
{
@Override
@Override
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
public
boolean
check
(
ArchSimpleExpressionSymbol
exp
)
{
if
(
exp
.
getDoubleValue
().
isPresent
()){
return
exp
.
getDoubleValue
().
get
()
>=
0
&&
exp
.
getDoubleValue
().
get
()
<=
1
;
}
else
if
(
exp
.
getDoubleTupleValues
().
isPresent
()){
boolean
isPositive
=
true
;
for
(
double
value
:
exp
.
getDoubleTupleValues
().
get
()){
if
(
value
<
0
||
value
>
1
){
isPositive
=
false
;
}
}
return
isPositive
;
}
return
false
;
return
false
;
}
}
};
};
...
...
src/main/java/de/monticore/lang/monticar/cnnarch/PredefinedMethods.java
View file @
6096077b
...
@@ -41,7 +41,7 @@ public class PredefinedMethods {
...
@@ -41,7 +41,7 @@ public class PredefinedMethods {
public
static
final
String
AVG_POOLING_NAME
=
"AveragePooling"
;
public
static
final
String
AVG_POOLING_NAME
=
"AveragePooling"
;
public
static
final
String
LRN_NAME
=
"Lrn"
;
public
static
final
String
LRN_NAME
=
"Lrn"
;
public
static
final
String
BATCHNORM_NAME
=
"BatchNorm"
;
public
static
final
String
BATCHNORM_NAME
=
"BatchNorm"
;
public
static
final
String
SPLIT_NAME
=
"Split"
;
public
static
final
String
SPLIT_NAME
=
"Split
Data
"
;
public
static
final
String
GET_NAME
=
"Get"
;
public
static
final
String
GET_NAME
=
"Get"
;
public
static
final
String
ADD_NAME
=
"Add"
;
public
static
final
String
ADD_NAME
=
"Add"
;
public
static
final
String
CONCATENATE_NAME
=
"Concatenate"
;
public
static
final
String
CONCATENATE_NAME
=
"Concatenate"
;
...
@@ -323,6 +323,15 @@ public class PredefinedMethods {
...
@@ -323,6 +323,15 @@ public class PredefinedMethods {
}
}
private
static
List
<
ShapeSymbol
>
strideShapeFunction
(
ShapeSymbol
inputShape
,
MethodLayerSymbol
method
,
int
channels
)
{
private
static
List
<
ShapeSymbol
>
strideShapeFunction
(
ShapeSymbol
inputShape
,
MethodLayerSymbol
method
,
int
channels
)
{
Optional
<
Boolean
>
optGlobal
=
method
.
getBooleanValue
(
"global"
);
if
(
optGlobal
.
isPresent
()
&&
optGlobal
.
get
()){
return
Collections
.
singletonList
(
new
ShapeSymbol
.
Builder
()
.
height
(
1
)
.
width
(
1
)
.
channels
(
channels
)
.
build
());
}
else
{
int
strideHeight
=
method
.
getIntTupleValue
(
"stride"
).
get
().
get
(
0
);
int
strideHeight
=
method
.
getIntTupleValue
(
"stride"
).
get
().
get
(
0
);
int
strideWidth
=
method
.
getIntTupleValue
(
"stride"
).
get
().
get
(
1
);
int
strideWidth
=
method
.
getIntTupleValue
(
"stride"
).
get
().
get
(
1
);
int
kernelHeight
=
method
.
getIntTupleValue
(
"kernel"
).
get
().
get
(
0
);
int
kernelHeight
=
method
.
getIntTupleValue
(
"kernel"
).
get
().
get
(
0
);
...
@@ -331,8 +340,12 @@ public class PredefinedMethods {
...
@@ -331,8 +340,12 @@ public class PredefinedMethods {
int
inputWidth
=
inputShape
.
getWidth
().
get
();
int
inputWidth
=
inputShape
.
getWidth
().
get
();
//assume padding with border_mode='same'
//assume padding with border_mode='same'
int
outputWidth
=
1
+
((
inputWidth
-
kernelWidth
+
strideWidth
-
1
)
/
strideWidth
);
int
outputWidth
=
inputWidth
/
strideWidth
;
int
outputHeight
=
1
+
((
inputHeight
-
kernelHeight
+
strideHeight
-
1
)
/
strideHeight
);
int
outputHeight
=
inputHeight
/
strideHeight
;
//border_mode=valid
//int outputWidth = 1 + Math.max(0, ((inputWidth - kernelWidth + strideWidth - 1) / strideWidth));
//int outputHeight = 1 + Math.max(0, ((inputHeight - kernelHeight + strideHeight - 1) / strideHeight));
return
Collections
.
singletonList
(
new
ShapeSymbol
.
Builder
()
return
Collections
.
singletonList
(
new
ShapeSymbol
.
Builder
()
.
height
(
outputHeight
)
.
height
(
outputHeight
)
...
@@ -340,6 +353,7 @@ public class PredefinedMethods {
...
@@ -340,6 +353,7 @@ public class PredefinedMethods {
.
channels
(
channels
)
.
channels
(
channels
)
.
build
());
.
build
());
}
}
}
private
static
List
<
ShapeSymbol
>
splitShapeFunction
(
ShapeSymbol
inputShape
,
MethodLayerSymbol
method
)
{
private
static
List
<
ShapeSymbol
>
splitShapeFunction
(
ShapeSymbol
inputShape
,
MethodLayerSymbol
method
)
{
int
numberOfSplits
=
method
.
getIntValue
(
"n"
).
get
();
int
numberOfSplits
=
method
.
getIntValue
(
"n"
).
get
();
...
...
src/main/java/de/monticore/lang/monticar/cnnarch/PredefinedVariables.java
View file @
6096077b
...
@@ -27,6 +27,7 @@ public class PredefinedVariables {
...
@@ -27,6 +27,7 @@ public class PredefinedVariables {
public
static
final
String
IF_NAME
=
"_if"
;
public
static
final
String
IF_NAME
=
"_if"
;
public
static
final
String
FOR_NAME
=
"_for"
;
public
static
final
String
FOR_NAME
=
"_for"
;
public
static
final
String
CARDINALITY_NAME
=
"_cardinality"
;
public
static
final
String
TRUE_NAME
=
"true"
;
public
static
final
String
TRUE_NAME
=
"true"
;
public
static
final
String
FALSE_NAME
=
"false"
;
public
static
final
String
FALSE_NAME
=
"false"
;
...
@@ -45,6 +46,13 @@ public class PredefinedVariables {
...
@@ -45,6 +46,13 @@ public class PredefinedVariables {
.
build
();
.
build
();
}
}
public
static
VariableSymbol
createCardinalityParameter
(){
return
new
VariableSymbol
.
Builder
()
.
name
(
CARDINALITY_NAME
)
.
defaultValue
(
1
)
.
build
();
}
//necessary because true is currently only a name in MontiMath and it needs to be evaluated at compile time for this language
//necessary because true is currently only a name in MontiMath and it needs to be evaluated at compile time for this language
public
static
VariableSymbol
createTrueConstant
(){
public
static
VariableSymbol
createTrueConstant
(){
return
new
VariableSymbol
.
Builder
()
return
new
VariableSymbol
.
Builder
()
...
...
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchExpressionSymbol.java
View file @
6096077b
...
@@ -22,9 +22,7 @@ package de.monticore.lang.monticar.cnnarch._symboltable;
...
@@ -22,9 +22,7 @@ package de.monticore.lang.monticar.cnnarch._symboltable;
import
de.monticore.symboltable.CommonSymbol
;
import
de.monticore.symboltable.CommonSymbol
;
import
de.monticore.symboltable.MutableScope
;
import
de.monticore.symboltable.MutableScope
;
import
de.monticore.symboltable.Scope
;
import
de.monticore.symboltable.Symbol
;
import
de.monticore.symboltable.Symbol
;
import
de.se_rwth.commons.logging.Log
;
import
java.util.*
;
import
java.util.*
;
...
@@ -32,7 +30,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -32,7 +30,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
public
static
final
ArchExpressionKind
KIND
=
new
ArchExpressionKind
();
public
static
final
ArchExpressionKind
KIND
=
new
ArchExpressionKind
();
private
Set
<
String
>
unresolvableNam
es
=
null
;
private
Set
<
VariableSymbol
>
unresolvableVariabl
es
=
null
;
public
ArchExpressionSymbol
()
{
public
ArchExpressionSymbol
()
{
super
(
""
,
KIND
);
super
(
""
,
KIND
);
...
@@ -40,25 +38,28 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -40,25 +38,28 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
protected
Boolean
isResolvable
(){
protected
Boolean
isResolvable
(){
Set
<
String
>
set
=
getUnresolvableNam
es
();
Set
<
VariableSymbol
>
set
=
getUnresolvableVariabl
es
();
return
set
!=
null
&&
set
.
isEmpty
();
return
set
!=
null
&&
set
.
isEmpty
();
}
}
public
Set
<
String
>
getUnresolvableNam
es
()
{
public
Set
<
VariableSymbol
>
getUnresolvableVariabl
es
()
{
if
(
unresolvable
Nam
es
==
null
){
if
(
unresolvable
Variabl
es
==
null
){
checkIfResolvable
();
checkIfResolvable
(
new
HashSet
<>()
);
}
}
return
unresolvable
Nam
es
;
return
unresolvable
Variabl
es
;
}
}
protected
void
setUnresolvable
Names
(
Set
<
String
>
unresolvableNam
es
){
protected
void
setUnresolvable
Variables
(
Set
<
VariableSymbol
>
unresolvableVariabl
es
){
this
.
unresolvable
Names
=
unresolvableNam
es
;
this
.
unresolvable
Variables
=
unresolvableVariabl
es
;
}
}
public
void
checkIfResolvable
(){
public
void
checkIfResolvable
(
Set
<
VariableSymbol
>
seenVariables
){
setUnresolvableNames
(
computeUnresolvableNames
());
Set
<
VariableSymbol
>
unresolvableVariables
=
new
HashSet
<>();
computeUnresolvableVariables
(
unresolvableVariables
,
seenVariables
);
setUnresolvableVariables
(
unresolvableVariables
);
}
}
/**
/**
* Checks whether the value is a boolean. If true getValue() will return a Boolean if present.
* Checks whether the value is a boolean. If true getValue() will return a Boolean if present.
*
*
...
@@ -99,21 +100,21 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -99,21 +100,21 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
public
Optional
<
Boolean
>
isIntTuple
(){
public
Optional
<
Boolean
>
isIntTuple
(){
if
(
getValue
().
isPresent
()){
if
(
getValue
().
isPresent
()){
return
Optional
.
of
(
getIntTupleValue
().
isPresent
());
return
Optional
.
of
(
getIntTupleValue
s
().
isPresent
());
}
}
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
Boolean
>
isNumberTuple
(){
public
Optional
<
Boolean
>
isNumberTuple
(){
if
(
getValue
().
isPresent
()){
if
(
getValue
().
isPresent
()){
return
Optional
.
of
(
getDoubleTupleValue
().
isPresent
());
return
Optional
.
of
(
getDoubleTupleValue
s
().
isPresent
());
}
}
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
Boolean
>
isBooleanTuple
(){
public
Optional
<
Boolean
>
isBooleanTuple
(){
if
(
getValue
().
isPresent
()){
if
(
getValue
().
isPresent
()){
return
Optional
.
of
(
getBooleanTupleValue
().
isPresent
());
return
Optional
.
of
(
getBooleanTupleValue
s
().
isPresent
());
}
}
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
...
@@ -194,8 +195,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -194,8 +195,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
List
<
Integer
>>
getIntTupleValue
(){
public
Optional
<
List
<
Integer
>>
getIntTupleValue
s
(){
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
();
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
s
();
if
(
optValue
.
isPresent
()){
if
(
optValue
.
isPresent
()){
List
<
Integer
>
list
=
new
ArrayList
<>();
List
<
Integer
>
list
=
new
ArrayList
<>();
for
(
Object
value
:
optValue
.
get
())
{
for
(
Object
value
:
optValue
.
get
())
{
...
@@ -211,8 +212,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -211,8 +212,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
List
<
Double
>>
getDoubleTupleValue
()
{
public
Optional
<
List
<
Double
>>
getDoubleTupleValue
s
()
{
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
();
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
s
();
if
(
optValue
.
isPresent
()){
if
(
optValue
.
isPresent
()){
List
<
Double
>
list
=
new
ArrayList
<>();
List
<
Double
>
list
=
new
ArrayList
<>();
for
(
Object
value
:
optValue
.
get
())
{
for
(
Object
value
:
optValue
.
get
())
{
...
@@ -231,8 +232,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -231,8 +232,8 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
List
<
Boolean
>>
getBooleanTupleValue
()
{
public
Optional
<
List
<
Boolean
>>
getBooleanTupleValue
s
()
{
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
();
Optional
<
List
<
Object
>>
optValue
=
getTupleValue
s
();
if
(
optValue
.
isPresent
()){
if
(
optValue
.
isPresent
()){
List
<
Boolean
>
list
=
new
ArrayList
<>();
List
<
Boolean
>
list
=
new
ArrayList
<>();
for
(
Object
value
:
optValue
.
get
())
{
for
(
Object
value
:
optValue
.
get
())
{
...
@@ -248,9 +249,10 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -248,9 +249,10 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
return
Optional
.
empty
();
return
Optional
.
empty
();
}
}
public
Optional
<
List
<
Object
>>
getTupleValue
(){
public
Optional
<
List
<
Object
>>
getTupleValue
s
(){
if
(
getValue
().
isPresent
()){
if
(
getValue
().
isPresent
()){
if
(
isTuple
()){
Optional
<
Object
>
optValue
=
getValue
();
if
(
optValue
.
isPresent
()
&&
(
optValue
.
get
()
instanceof
List
)){
@SuppressWarnings
(
"unchecked"
)
@SuppressWarnings
(
"unchecked"
)
List
<
Object
>
list
=
(
List
<
Object
>)
getValue
().
get
();
List
<
Object
>
list
=
(
List
<
Object
>)
getValue
().
get
();
return
Optional
.
of
(
list
);
return
Optional
.
of
(
list
);
...
@@ -300,7 +302,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -300,7 +302,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
public
void
resolveOrError
(){
public
void
resolveOrError
(){
resolve
();
resolve
();
if
(!
isResolved
()){
if
(!
isResolved
()){
throw
new
IllegalStateException
(
"The following names could not be resolved: "
+
getUnresolvable
Nam
es
());
throw
new
IllegalStateException
(
"The following names could not be resolved: "
+
getUnresolvable
Variabl
es
());
}
}
}
}
...
@@ -315,13 +317,15 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -315,13 +317,15 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
*/
*/
abstract
public
Optional
<
Object
>
getValue
();
abstract
public
Optional
<
Object
>
getValue
();
abstract
public
void
reset
();
/**
/**
* Replaces all variable names in this values expression if possible.
* Replaces all variable names in this values expression if possible.
* The values of the variables depend on the current scope. The replacement is irreversible if successful.
* The values of the variables depend on the current scope. The replacement is irreversible if successful.
*
*
* @return returns a set of all names which could not be resolved.
* @return returns a set of all names which could not be resolved.
*/
*/
abstract
public
Set
<
String
>
resolve
();
abstract
public
Set
<
VariableSymbol
>
resolve
();
/**
/**
* @return returns a optional of a list(parallel) of lists(serial) of simple expressions in this sequence.
* @return returns a optional of a list(parallel) of lists(serial) of simple expressions in this sequence.
...
@@ -330,7 +334,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
...
@@ -330,7 +334,7 @@ abstract public class ArchExpressionSymbol extends CommonSymbol {
*/
*/
abstract
public
Optional
<
List
<
List
<
ArchSimpleExpressionSymbol
>>>
getElements
();
abstract
public
Optional
<
List
<
List
<
ArchSimpleExpressionSymbol
>>>
getElements
();
abstract
protected
Set
<
String
>
computeUnresolvableNames
(
);
abstract
protected
void
computeUnresolvableVariables
(
Set
<
VariableSymbol
>
unresolvableVariables
,
Set
<
VariableSymbol
>
allVariables
);
/**
/**
* @return returns true if the expression is resolved.
* @return returns true if the expression is resolved.
...
...
src/main/java/de/monticore/lang/monticar/cnnarch/_symboltable/ArchRangeExpressionSymbol.java
View file @
6096077b
...
@@ -21,7 +21,6 @@
...
@@ -21,7 +21,6 @@
package
de.monticore.lang.monticar.cnnarch._symboltable
;
package
de.monticore.lang.monticar.cnnarch._symboltable
;
import
de.monticore.symboltable.MutableScope
;
import
de.monticore.symboltable.MutableScope
;
import
de.monticore.symboltable.Scope
;
import
java.util.*
;
import
java.util.*
;
import
java.util.stream.Collectors
;
import
java.util.stream.Collectors
;
...
@@ -63,6 +62,13 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
...
@@ -63,6 +62,13 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
this
.
parallel
=
parallel
;
this
.
parallel
=
parallel
;
}
}
@Override
public
void
reset
()
{
getStartSymbol
().
reset
();
getEndSymbol
().
reset
();
setUnresolvableVariables
(
null
);
}
@Override
@Override
public
boolean
isParallelSequence
()
{
public
boolean
isParallelSequence
()
{
return
isParallel
();
return
isParallel
();
...
@@ -88,16 +94,15 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
...
@@ -88,16 +94,15 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
}*/
}*/
@Override
@Override
public
Set
<
String
>
resolve
()
{
public
Set
<
VariableSymbol
>
resolve
()
{
if
(!
isResolved
()){
if
(!
isResolved
()){
checkIfResolvable
();
if
(
isResolvable
()){
if
(
isResolvable
()){
getStartSymbol
().
resolveOrError
();
getStartSymbol
().
resolveOrError
();
getEndSymbol
().
resolveOrError
();
getEndSymbol
().
resolveOrError
();
}
}
}
}
return
getUnresolvable
Nam
es
();
return
getUnresolvable
Variabl
es
();
}
}
@Override
@Override
...
@@ -142,11 +147,11 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
...
@@ -142,11 +147,11 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
}
}
@Override
@Override
protected
Set
<
String
>
computeUnresolvableNames
(
)
{
protected
void
computeUnresolvableVariables
(
Set
<
VariableSymbol
>
unresolvableVariables
,
Set
<
VariableSymbol
>
allVariables
)
{
Set
<
String
>
unresolvableNames
=
new
HashSet
<>(
);
getStartSymbol
().
checkIfResolvable
(
allVariables
);
unresolvable
Names
.
addAll
(
getStartSymbol
().
computeUnresolvableNam
es
());
unresolvable
Variables
.
addAll
(
getStartSymbol
().
getUnresolvableVariabl
es
());
unresolvableNames
.
addAll
(
getEndSymbol
().
computeUnresolvableNames
()
);
getEndSymbol
().
checkIfResolvable
(
allVariables
);
return
unresolvableNames
;
unresolvableVariables
.
addAll
(
getEndSymbol
().
getUnresolvableVariables
())
;
}
}
public
ArchRangeExpressionSymbol
copy
(){
public
ArchRangeExpressionSymbol
copy
(){
...
@@ -154,7 +159,7 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
...
@@ -154,7 +159,7 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
copy
.
setParallel
(
isParallel
());
copy
.
setParallel
(
isParallel
());
copy
.
setStartSymbol
(
getStartSymbol
().
copy
());
copy
.
setStartSymbol
(
getStartSymbol
().
copy
());
copy
.
setEndSymbol
(
getEndSymbol
().
copy
());
copy
.
setEndSymbol
(
getEndSymbol
().
copy
());
copy
.
setUnresolvable
Names
(
getUnresolvableNam
es
());
copy
.
setUnresolvable
Variables
(
getUnresolvableVariabl
es
());
return
copy
;
return
copy
;
}
}
...
@@ -165,10 +170,11 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
...
@@ -165,10 +170,11 @@ public class ArchRangeExpressionSymbol extends ArchAbstractSequenceExpression {
getEndSymbol
().
putInScope
(
scope
);
getEndSymbol
().
putInScope
(
scope
);
}
}
public
static
ArchRangeExpressionSymbol
of
(
ArchSimpleExpressionSymbol
start
,
ArchSimpleExpressionSymbol
end
){
public
static
ArchRangeExpressionSymbol
of
(
ArchSimpleExpressionSymbol
start
,
ArchSimpleExpressionSymbol
end
,
boolean
parallel
){
ArchRangeExpressionSymbol
sym
=
new
ArchRangeExpressionSymbol
();
ArchRangeExpressionSymbol
sym
=
new
ArchRangeExpressionSymbol
();
sym
.
setStartSymbol
(
start
);
sym
.
setStartSymbol
(
start
);
sym
.
setEndSymbol
(
end
);
sym
.
setEndSymbol
(
end
);
sym
.
setParallel
(
parallel
);