Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
T
tla2bAST
Manage
Activity
Members
Labels
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Analyze
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
GitLab community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
general
stups
tla2bAST
Commits
4828c50c
Commit
4828c50c
authored
6 months ago
by
Jan Gruteser
Browse files
Options
Downloads
Patches
Plain Diff
refactor instance transformation
parent
5eee515d
No related branches found
No related tags found
No related merge requests found
Pipeline
#148348
passed
6 months ago
Stage: test
Stage: deploy
Changes
1
Pipelines
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/main/java/de/tla2b/analysis/InstanceTransformation.java
+60
-58
60 additions, 58 deletions
src/main/java/de/tla2b/analysis/InstanceTransformation.java
with
60 additions
and
58 deletions
src/main/java/de/tla2b/analysis/InstanceTransformation.java
+
60
−
58
View file @
4828c50c
...
@@ -3,9 +3,11 @@ package de.tla2b.analysis;
...
@@ -3,9 +3,11 @@ package de.tla2b.analysis;
import
de.tla2b.global.BBuiltInOPs
;
import
de.tla2b.global.BBuiltInOPs
;
import
de.tla2b.util.TlaUtils
;
import
de.tla2b.util.TlaUtils
;
import
tla2sany.semantic.*
;
import
tla2sany.semantic.*
;
import
tla2sany.st.TreeNode
;
import
tlc2.tool.BuiltInOPs
;
import
tlc2.tool.BuiltInOPs
;
import
util.UniqueString
;
import
util.UniqueString
;
import
java.util.Arrays
;
import
java.util.Map
;
import
java.util.Map
;
/**
/**
...
@@ -14,19 +16,17 @@ import java.util.Map;
...
@@ -14,19 +16,17 @@ import java.util.Map;
* M1 == INSTANCE Counter WITH x <- c, start <- 0
* M1 == INSTANCE Counter WITH x <- c, start <- 0
* <p>
* <p>
* Example for usage in module:
* Example for usage in module:
* OpDef ==
/\
M1!Init
* OpDef == M1!Init
* <p>
* <p>
* cf. <a href="https://lamport.azurewebsites.net/tla/newmodule.html">https://lamport.azurewebsites.net/tla/newmodule.html</a>
* cf. <a href="https://lamport.azurewebsites.net/tla/newmodule.html">https://lamport.azurewebsites.net/tla/newmodule.html</a>
*/
*/
public
class
InstanceTransformation
extends
BuiltInOPs
implements
ASTConstants
{
public
class
InstanceTransformation
extends
BuiltInOPs
implements
ASTConstants
{
private
final
OpDefNode
[]
defs
;
private
final
Map
<
String
,
OpDefNode
>
defs
;
private
final
Map
<
String
,
OpDefNode
>
defsHash
;
private
final
int
substitutionId
=
11
;
private
final
int
substitutionId
=
11
;
private
InstanceTransformation
(
ModuleNode
moduleNode
)
{
private
InstanceTransformation
(
ModuleNode
moduleNode
)
{
this
.
defs
=
moduleNode
.
getOpDefs
();
this
.
defs
=
TlaUtils
.
getOpDefsMap
(
moduleNode
.
getOpDefs
());
this
.
defsHash
=
TlaUtils
.
getOpDefsMap
(
defs
);
}
}
public
static
void
run
(
ModuleNode
moduleNode
)
{
public
static
void
run
(
ModuleNode
moduleNode
)
{
...
@@ -34,30 +34,22 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -34,30 +34,22 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
}
}
/**
/**
* replace all
substitu
tions M1!Op1 by the real Op1
(?)
* replace all
defini
tions M1!Op1 by the real Op1
and add included definitions from instances
*/
*/
private
void
start
()
{
private
void
start
()
{
for
(
OpDefNode
def
:
defs
)
{
for
(
OpDefNode
def
:
defs
.
values
())
{
if
(
def
.
getSource
()
!=
def
&&
!
BBuiltInOPs
.
contains
(
def
.
getSource
().
getName
()))
{
if
(
def
.
getSource
()
!=
def
&&
!
BBuiltInOPs
.
contains
(
def
.
getSource
().
getName
())
// instance
&&
def
.
getBody
()
instanceof
SubstInNode
)
{
// name of the definition in the instance:
String
defName
=
def
.
getName
().
toString
();
String
defName
=
def
.
getName
().
toString
();
if
(
def
.
getBody
()
instanceof
SubstInNode
)
{
String
prefix
=
defName
.
substring
(
0
,
defName
.
lastIndexOf
(
'!'
)
+
1
);
String
prefix
=
defName
.
substring
(
0
,
defName
.
lastIndexOf
(
'!'
)
+
1
);
def
.
setParams
(
generateNewParams
(
def
.
getParams
()));
def
.
setParams
(
copyParams
(
def
.
getParams
()));
ExprNode
body
;
def
.
setBody
(
generateNewExprNode
(
def
.
getBody
(),
prefix
));
try
{
body
=
generateNewExprNode
(
def
.
getBody
(),
prefix
);
}
catch
(
AbortException
e
)
{
throw
new
RuntimeException
();
}
def
.
setBody
(
body
);
}
}
}
}
}
}
}
private
ExprOrOpArgNode
generateNewExprOrOpArgNode
(
ExprOrOpArgNode
n
,
String
prefix
)
throws
AbortException
{
private
ExprOrOpArgNode
generateNewExprOrOpArgNode
(
ExprOrOpArgNode
n
,
String
prefix
)
{
if
(
n
instanceof
ExprNode
)
{
if
(
n
instanceof
ExprNode
)
{
return
generateNewExprNode
((
ExprNode
)
n
,
prefix
);
return
generateNewExprNode
((
ExprNode
)
n
,
prefix
);
}
else
{
}
else
{
...
@@ -65,14 +57,18 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -65,14 +57,18 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
}
}
}
}
private
ExprNode
generateNewExprNode
(
ExprNode
n
,
String
prefix
)
throws
AbortException
{
private
ExprNode
generateNewExprNode
(
ExprNode
n
,
String
prefix
)
{
switch
(
n
.
getKind
())
{
switch
(
n
.
getKind
())
{
case
OpApplKind:
{
case
OpApplKind:
{
return
generateNewOpApplNode
((
OpApplNode
)
n
,
prefix
);
return
generateNewOpApplNode
((
OpApplNode
)
n
,
prefix
);
}
}
case
NumeralKind:
{
case
NumeralKind:
{
try
{
return
new
NumeralNode
(
n
.
toString
(),
n
.
getTreeNode
());
return
new
NumeralNode
(
n
.
toString
(),
n
.
getTreeNode
());
}
catch
(
AbortException
e
)
{
throw
new
RuntimeException
(
"Error while creating NumeralNode: "
+
e
);
}
}
}
case
DecimalKind:
{
case
DecimalKind:
{
...
@@ -109,7 +105,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -109,7 +105,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
OpDefNode
let
=
oldLetNode
.
getLets
()[
i
];
OpDefNode
let
=
oldLetNode
.
getLets
()[
i
];
UniqueString
newName
=
UniqueString
.
uniqueStringOf
(
prefix
+
let
.
getName
().
toString
());
UniqueString
newName
=
UniqueString
.
uniqueStringOf
(
prefix
+
let
.
getName
().
toString
());
OpDefNode
newLet
=
new
OpDefNode
(
newName
,
let
.
getKind
(),
OpDefNode
newLet
=
new
OpDefNode
(
newName
,
let
.
getKind
(),
generateNew
Params
(
let
.
getParams
()),
let
.
isLocal
(),
copy
Params
(
let
.
getParams
()),
let
.
isLocal
(),
generateNewExprNode
(
let
.
getBody
(),
prefix
),
generateNewExprNode
(
let
.
getBody
(),
prefix
),
let
.
getOriginallyDefinedInModuleNode
(),
null
,
let
.
getOriginallyDefinedInModuleNode
(),
null
,
let
.
getTreeNode
(),
true
,
let
.
getSource
());
let
.
getTreeNode
(),
true
,
let
.
getSource
());
...
@@ -125,7 +121,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -125,7 +121,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
throw
new
IllegalArgumentException
(
"unknown ExprNode kind "
+
n
.
getKind
());
throw
new
IllegalArgumentException
(
"unknown ExprNode kind "
+
n
.
getKind
());
}
}
private
ExprNode
generateNewOpApplNode
(
OpApplNode
n
,
String
prefix
)
throws
AbortException
{
private
ExprNode
generateNewOpApplNode
(
OpApplNode
n
,
String
prefix
)
{
switch
(
n
.
getOperator
().
getKind
())
{
switch
(
n
.
getOperator
().
getKind
())
{
case
VariableDeclKind:
case
VariableDeclKind:
case
ConstantDeclKind:
{
case
ConstantDeclKind:
{
...
@@ -139,12 +135,10 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -139,12 +135,10 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
while
(
opArg
.
getOp
().
getToolObject
(
substitutionId
)
!=
null
)
{
while
(
opArg
.
getOp
().
getToolObject
(
substitutionId
)
!=
null
)
{
opArg
=
(
OpArgNode
)
opArg
.
getOp
().
getToolObject
(
substitutionId
);
opArg
=
(
OpArgNode
)
opArg
.
getOp
().
getToolObject
(
substitutionId
);
}
}
return
new
OpApplNode
(
opArg
.
getOp
(),
generateNewArgs
(
return
createOpApplNode
(
opArg
.
getOp
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
(),
null
);
}
}
}
else
{
}
else
{
return
new
OpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
return
createOpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
(),
null
);
}
}
}
}
...
@@ -153,7 +147,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -153,7 +147,7 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
if
(
f
==
null
)
{
if
(
f
==
null
)
{
throw
new
RuntimeException
();
throw
new
RuntimeException
();
}
}
return
new
OpApplNode
(
f
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
()
,
null
);
return
create
OpApplNode
(
f
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
}
}
case
BuiltInKind:
{
case
BuiltInKind:
{
...
@@ -164,27 +158,27 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -164,27 +158,27 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
// in case of a call of a LetInNode
// in case of a call of a LetInNode
OpDefNode
letOp
=
(
OpDefNode
)
n
.
getOperator
().
getToolObject
(
substitutionId
);
OpDefNode
letOp
=
(
OpDefNode
)
n
.
getOperator
().
getToolObject
(
substitutionId
);
if
(
letOp
!=
null
)
{
if
(
letOp
!=
null
)
{
return
new
OpApplNode
(
letOp
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
()
,
null
);
return
create
OpApplNode
(
letOp
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
}
}
// in case of a call of BBuiltInOp e.g. +, -
// in case of a call of BBuiltInOp e.g. +, -
if
(
BBuiltInOPs
.
contains
(
n
.
getOperator
().
getName
()))
{
if
(
BBuiltInOPs
.
contains
(
n
.
getOperator
().
getName
()))
{
return
new
OpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
stn
,
null
);
return
create
OpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
stn
);
}
}
// normal userdefined Operator
// normal userdefined Operator
String
opName
=
prefix
+
n
.
getOperator
().
getName
().
toString
();
String
opName
=
prefix
+
n
.
getOperator
().
getName
().
toString
();
OpDefNode
op
=
defs
Hash
.
get
(
opName
);
OpDefNode
op
=
defs
.
get
(
opName
);
if
(
op
==
null
)
{
if
(
op
==
null
)
{
throw
new
RuntimeException
();
throw
new
RuntimeException
();
}
}
return
new
OpApplNode
(
op
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
()
,
null
);
return
create
OpApplNode
(
op
,
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
}
}
}
}
throw
new
RuntimeException
(
"OpApplkind not implemented yet"
);
throw
new
RuntimeException
(
"OpApplkind not implemented yet"
);
}
}
private
ExprNode
generateNewBuiltInNode
(
OpApplNode
n
,
String
prefix
)
throws
AbortException
{
private
ExprNode
generateNewBuiltInNode
(
OpApplNode
n
,
String
prefix
)
{
switch
(
getOpCode
(
n
.
getOperator
().
getName
()))
{
switch
(
getOpCode
(
n
.
getOperator
().
getName
()))
{
case
OPCODE_exc:
{
// Except
case
OPCODE_exc:
{
// Except
OpApplNode
newNode
=
new
OpApplNode
(
n
.
getOperator
().
getName
(),
null
,
n
.
getTreeNode
(),
null
);
OpApplNode
newNode
=
new
OpApplNode
(
n
.
getOperator
().
getName
(),
null
,
n
.
getTreeNode
(),
null
);
...
@@ -195,18 +189,16 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -195,18 +189,16 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
for
(
int
i
=
1
;
i
<
n
.
getArgs
().
length
;
i
++)
{
for
(
int
i
=
1
;
i
<
n
.
getArgs
().
length
;
i
++)
{
OpApplNode
pair
=
(
OpApplNode
)
n
.
getArgs
()[
i
];
OpApplNode
pair
=
(
OpApplNode
)
n
.
getArgs
()[
i
];
OpApplNode
newPair
=
new
OpApplNode
(
pair
.
getOperator
().
getName
(),
null
,
pair
.
getTreeNode
(),
null
);
OpApplNode
newPair
=
new
OpApplNode
(
pair
.
getOperator
().
getName
(),
null
,
pair
.
getTreeNode
(),
null
);
// needed for @ node: we have to set a reference from the old
// needed for @ node: we have to set a reference from the old pair to the new pair
// pair to the new pair
// before evaluating the arguments which may contain an @ node
// before evaluation the arguments which may be contains a @
// node
pair
.
setToolObject
(
substitutionId
,
newPair
);
pair
.
setToolObject
(
substitutionId
,
newPair
);
newPair
.
setArgs
(
generateNewArgs
(
pair
.
getArgs
(),
prefix
));
newPair
.
setArgs
(
generateNewArgs
(
pair
.
getArgs
(),
prefix
));
newArgs
[
i
]
=
newPair
;
newArgs
[
i
]
=
newPair
;
}
}
newNode
.
setArgs
(
newArgs
);
newNode
.
setArgs
(
newArgs
);
return
newNode
;
return
newNode
;
}
}
case
OPCODE_uc:
{
// CHOOSE x : P
case
OPCODE_uc:
{
// CHOOSE x : P
FormalParamNode
[]
oldSymbols
=
n
.
getUnbdedQuantSymbols
();
FormalParamNode
[]
oldSymbols
=
n
.
getUnbdedQuantSymbols
();
FormalParamNode
[]
newSymbols
=
new
FormalParamNode
[
oldSymbols
.
length
];
FormalParamNode
[]
newSymbols
=
new
FormalParamNode
[
oldSymbols
.
length
];
...
@@ -255,29 +247,39 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
...
@@ -255,29 +247,39 @@ public class InstanceTransformation extends BuiltInOPs implements ASTConstants {
}
}
default
:
{
// =
default
:
{
// =
return
new
OpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
()
,
null
);
return
create
OpApplNode
(
n
.
getOperator
(),
generateNewArgs
(
n
.
getArgs
(),
prefix
),
n
.
getTreeNode
());
}
}
}
}
}
}
private
ExprOrOpArgNode
[]
generateNewArgs
(
ExprOrOpArgNode
[]
args
,
String
prefix
)
throws
AbortException
{
private
ExprOrOpArgNode
[]
generateNewArgs
(
ExprOrOpArgNode
[]
args
,
String
prefix
)
{
ExprOrOpArgNode
[]
res
=
new
ExprOrOpArgNode
[
args
.
length
];
return
Arrays
.
stream
(
args
)
for
(
int
i
=
0
;
i
<
args
.
length
;
i
++)
{
.
map
(
arg
->
generateNewExprOrOpArgNode
(
arg
,
prefix
))
res
[
i
]
=
generateNewExprOrOpArgNode
(
args
[
i
],
prefix
);
.
toArray
(
ExprOrOpArgNode
[]::
new
);
}
return
res
;
}
}
private
FormalParamNode
[]
generateNewParams
(
FormalParamNode
[]
oldParams
)
{
private
FormalParamNode
[]
copyParams
(
FormalParamNode
[]
oldParams
)
{
FormalParamNode
[]
newParams
=
new
FormalParamNode
[
oldParams
.
length
];
return
Arrays
.
stream
(
oldParams
)
for
(
int
i
=
0
;
i
<
oldParams
.
length
;
i
++)
{
.
map
(
oldParam
->
{
FormalParamNode
oldParam
=
oldParams
[
i
];
FormalParamNode
newParam
=
new
FormalParamNode
(
FormalParamNode
newParam
=
new
FormalParamNode
(
oldParam
.
getName
(),
oldParam
.
getName
(),
oldParam
.
getArity
(),
oldParam
.
getTreeNode
(),
null
,
null
);
oldParam
.
getArity
(),
// set reference to the old param to the new
oldParam
.
getTreeNode
(),
null
,
null
);
// set reference of the old param to the new
oldParam
.
setToolObject
(
substitutionId
,
newParam
);
oldParam
.
setToolObject
(
substitutionId
,
newParam
);
newParams
[
i
]
=
newParam
;
return
newParam
;
})
.
toArray
(
FormalParamNode
[]::
new
);
}
private
static
OpApplNode
createOpApplNode
(
SymbolNode
operator
,
ExprOrOpArgNode
[]
args
,
TreeNode
treeNode
)
{
try
{
return
new
OpApplNode
(
operator
,
args
,
treeNode
,
null
);
}
catch
(
AbortException
e
)
{
throw
new
RuntimeException
(
"Error while creating OpApplNode: "
+
e
);
}
}
return
newParams
;
}
}
}
}
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