Skip to content
Snippets Groups Projects
Commit 7ec7b737 authored by Johannes Mey's avatar Johannes Mey
Browse files

huge rewrite of expressions: now, shortcut notations are possible and...

huge rewrite of expressions: now, shortcut notations are possible and expression cascades are minimised.
parent 5565bc72
No related branches found
No related tags found
No related merge requests found
......@@ -11,7 +11,7 @@ jastadd: ast
rm -f src-gen/org/tud/forty/ast/*
sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/Printing.jadd
sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/OmpPrinting.jadd
cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --package="org.tud.forty.ast" --indent='2space' --rewrite=regular ../spec-gen/*.ast ../spec/*.jadd ../spec/*.jrag
cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --package="org.tud.forty.ast" --indent='2space' --rewrite=regular ../spec/*.ast ../spec-gen/*.ast ../spec/*.jadd ../spec/*.jrag
sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/Printing.jadd
sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/OmpPrinting.jadd
......@@ -32,7 +32,7 @@ clean:
dot:
sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/Printing.jadd
sed -i 's|class PrettyPrint|aspect PrettyPrint|' spec/OmpPrinting.jadd
cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --dot --package="org.tud.forty.ast" --indent='4space' ../spec-gen/*.ast ../spec/*.jadd
cd src-gen; java -jar ../tools/jastadd/jastadd2.jar --dot --package="org.tud.forty.ast" --indent='4space' ../spec/*.ast ../spec-gen/*.ast ../spec/*.jadd
sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/Printing.jadd
sed -i 's|aspect PrettyPrint|class PrettyPrint|' spec/OmpPrinting.jadd
......
aspect ExprRewrites {
rewrite Level6Expr {
when (getDefBinOpExprList().numChildren() == 0)
to AbstractLevel5Expr {
return getLevel5Expr();
}
}
// TODO check if actually can be rewritten!
rewrite Level5Expr {
when (getAbstractEquivOperandList().numChildren() == 1)
to AbstractAbstractEquivOperand {
return getAbstractEquivOperand(0).getEquivOperand();
}
}
rewrite EquivOperand {
when (getOrOperandList().numChildren() == 1)
to AbstractOrOperand {
return getOrOperand(0);
}
}
rewrite OrOperand {
when (getAndOperandList().numChildren() == 1)
to AbstractAndOperand {
return getAndOperand(0);
}
}
rewrite AndOperand {
when (!(this instanceof NotAndOperand))
to AbstractLevel4Expr {
return getLevel4Expr();
}
}
rewrite AtomicLevel4Expr {
// when (true) // condition encoded in 'Atomic'
to AbstractLevel3Expr {
return getLevel3Expr();
}
}
rewrite Level3Expr {
when (getLevel2ExprList().numChildren() == 1)
to AbstractLevel2Expr {
return getLevel2Expr(0);
}
}
rewrite Level2Expr {
when (getAbstractAddOperandList().numChildren() == 1 && (getAbstractAddOperand(0) instanceof SimpleAddOperand))
to AbstractAbstractAddOperand {
return getAbstractAddOperand(0).getAddOperand();
}
}
rewrite AddOperand {
when (getAbstractMultOperandList().numChildren() == 1 && (getAbstractMultOperand(0) instanceof SimpleMultOperand))
to AbstractAbstractMultOperand {
return getAbstractMultOperand(0).getMultOperand();
}
}
rewrite MultOperand {
when (getLevel1ExprList().numChildren() == 1)
to AbstractLevel1Expr {
return getLevel1Expr(0);
}
}
rewrite Level1Expr {
when (!hasDefinedUnaryOp())
to Primary {
return getPrimary();
}
}
// rewrite Level5Expr {
// to SimpleExpr {
// List<OpOp> operands = new List<OpOp>();
// for (AbstractEquivOperand eo : getAbstractEquivOperandList()) {
// if (eo instanceof SimpleEquivOperand) {
// operands.add(new OpOpOperand(eo.getEquivOperand()));
// } else if (eo instanceof EqEquivOperand) {
// operands.add(new OpOpPair(new EqvOp(), eo.getEquivOperand()));
// } else if (eo instanceof NeqEquivOperand) {
// operands.add(new OpOpPair(new EqvOp(), eo.getEquivOperand()));
// }
// }
// return new ComplexExpr(operands);
// }
// }
//
// syn boolean OpOp.isOperand();
// eq OpOpPair.isOperand() = false;
// eq OpOpOperand.isOperand() = true;
//
// rewrite ComplexExpr {
// when (getOpOpList().numChildren() == 1 && getOpOp(0).isOperand())
// to AbstractExpr {
// return getOpOp(0).getAbstractExpr();
// }
// }
}
\ No newline at end of file
......@@ -131,7 +131,7 @@ ProgramUnit program_unit =
;
//// // R203
//// ExternalSubprogram:ProgramUnit ;
//// abstract ExternalSubprogram:ProgramUnit ;
//// FunctionSubprogram_ExternalSubprogram:ExternalSubprogram ::= FunctionSubprogram ;
//// SubroutineSubprogram_ExternalSubprogram:ExternalSubprogram ::= SubroutineSubprogram ;
ExternalSubprogram external_subprogram =
......@@ -576,7 +576,8 @@ IntConstant int_constant =
//// // TODO MISSING RULE 308
//// // R309
//// abstract IntrinsicOperator ;
//// abstract Operator ;
//// abstract IntrinsicOperator:Operator ;
IntrinsicOperator intrinsic_operator =
power_op
/ concat_op
......@@ -590,7 +591,7 @@ IntrinsicOperator intrinsic_operator =
;
//// // R310
//// abstract DefinedOperator ;
//// abstract DefinedOperator:Operator ;
DefinedOperator defined_operator =
defined_unary_op
/ defined_binary_op
......@@ -801,8 +802,7 @@ KindSelector kind_selector =
OrOperand oo = new OrOperand(new List().add(ao));
EquivOperand eo = new EquivOperand(new List().add(oo));
Level5Expr l5e = new Level5Expr(new List().add(new SimpleEquivOperand(eo)));
Level6Expr l6e = new Level6Expr(l5e, new List());
Expr e = new Level6ExprExpr(l6e);
Expr e = new Level6Expr(l5e, new List());
yyValue = new KindSelector(e);
}
;
......@@ -3165,7 +3165,7 @@ DeallocOpt dealloc_opt =
// =============================================================================
//// // R701
//// abstract Primary ;
//// abstract Primary:AbstractLevel1Expr ;
//// TypeParamName_Primary:Primary ::= Name ;
//// ExprPrimary_Primary:Primary ::= Expr ;
// ! Modified!
......@@ -3257,7 +3257,8 @@ GenericPrimary generic_primary =
//// // R702
//// Level1Expr ::= [DefinedUnaryOp] Primary ;
//// abstract AbstractLevel1Expr:AbstractAbstractMultOperand ;
//// Level1Expr:AbstractLevel1Expr ::= [DefinedUnaryOp] Primary ;
Level1Expr level_1_expr =
u:(yyValue:defined_unary_op)? p:primary
{
......@@ -3282,8 +3283,9 @@ DefinedUnaryOp defined_unary_op =
}
;
//// // R704
//// MultOperand ::= Level1Expr* ;
//// // R704]
//// abstract AbstractAbstractMultOperand:AbstractAbstractAddOperand ;
//// MultOperand:AbstractAbstractMultOperand ::= Level1Expr:AbstractLevel1Expr* ;
MultOperand mult_operand =
l:level_1_expr POW r:mult_operand
{
......@@ -3310,8 +3312,9 @@ MultOperand mult_operand_without_dot =
;
//// // R705
//// AddOperand ::= AbstractMultOperand*;
//// abstract AbstractMultOperand ::= MultOperand ;
//// abstract AbstractAbstractAddOperand:AbstractLevel2Expr ;
//// AddOperand:AbstractAbstractAddOperand ::= AbstractMultOperand*;
//// abstract AbstractMultOperand:AbstractAbstractMultOperand ::= MultOperand:AbstractAbstractMultOperand ;
//// SimpleMultOperand:AbstractMultOperand ;
//// MultMultOperand:AbstractMultOperand ;
//// DivMultOperand:AbstractMultOperand ;
......@@ -3389,8 +3392,9 @@ AddOperand add_operand_rest_without_dot =
;
//// // R706
//// Level2Expr ::= AbstractAddOperand* ;
//// abstract AbstractAddOperand ::= AddOperand ;
//// abstract AbstractLevel2Expr:AbstractLevel3Expr ;
//// Level2Expr:AbstractLevel2Expr ::= AbstractAddOperand* ;
//// abstract AbstractAddOperand:AbstractAbstractAddOperand ::= AddOperand:AbstractAbstractAddOperand ;
//// SimpleAddOperand:AbstractAddOperand ;
//// PlusAddOperand:AbstractAddOperand ;
//// MinusAddOperand:AbstractAddOperand ;
......@@ -3508,7 +3512,8 @@ AddOp add_op =
;
//// // R710
//// Level3Expr ::= Level2Expr* ;
//// abstract AbstractLevel3Expr:AbstractLevel4Expr ;
//// Level3Expr:AbstractLevel3Expr ::= Level2Expr:AbstractLevel2Expr* ;
Level3Expr level_3_expr =
e:level_2_expr el:(DOUBLESLASH yyValue:level_2_expr)*
{
......@@ -3538,9 +3543,10 @@ ConcatOp concat_op =
;
//// // R712
//// abstract Level4Expr ;
//// AtomicLevel4Expr:Level4Expr ::= Level3Expr ;
//// abstract BinaryLevel4Expr:Level4Expr ::= Left:Level3Expr Right:Level3Expr ;
//// abstract AbstractLevel4Expr:AbstractAndOperand ;
//// abstract Level4Expr:AbstractLevel4Expr ;
//// AtomicLevel4Expr:Level4Expr ::= Level3Expr:AbstractLevel3Expr ;
//// abstract BinaryLevel4Expr:Level4Expr ::= Left:AbstractLevel3Expr Right:AbstractLevel3Expr ;
//// EQLevel4Expr:BinaryLevel4Expr ;
//// NELevel4Expr:BinaryLevel4Expr ;
//// LTLevel4Expr:BinaryLevel4Expr ;
......@@ -3764,7 +3770,8 @@ RelOp rel_op =
;
//// // R714
//// AndOperand ::= Level4Expr ;
//// abstract AbstractAndOperand:AbstractOrOperand ;
//// AndOperand:AbstractAndOperand ::= Level4Expr:AbstractLevel4Expr ;
//// NotAndOperand:AndOperand ;
AndOperand and_operand =
NOT o:level_4_expr
......@@ -3789,7 +3796,8 @@ AndOperand and_operand_without_dot =
//// // R715
//// OrOperand ::= AndOperand* ;
//// abstract AbstractOrOperand:AbstractAbstractEquivOperand ;
//// OrOperand:AbstractOrOperand ::= AndOperand:AbstractAndOperand* ;
OrOperand or_operand =
a:and_operand r:or_operand_rest
{
......@@ -3865,7 +3873,8 @@ OrOperand or_operand_rest_without_dot =
//// // R716
//// EquivOperand ::= OrOperand*;
//// abstract AbstractAbstractEquivOperand:AbstractLevel5Expr ;
//// EquivOperand:AbstractAbstractEquivOperand ::= OrOperand:AbstractOrOperand*;
EquivOperand equiv_operand =
o:or_operand r:equiv_operand_rest
{
......@@ -3940,8 +3949,9 @@ EquivOperand equiv_operand_rest_without_dot =
;
//// // R717
//// Level5Expr ::= AbstractEquivOperand* ;
//// abstract AbstractEquivOperand ::= EquivOperand ;
//// abstract AbstractLevel5Expr:AbstractLevel6Expr ;
//// Level5Expr:AbstractLevel5Expr ::= AbstractEquivOperand* ;
//// AbstractEquivOperand:AbstractAbstractEquivOperand ::= EquivOperand:AbstractAbstractEquivOperand ;
//// SimpleEquivOperand:AbstractEquivOperand ;
//// EqEquivOperand:AbstractEquivOperand ;
//// NeqEquivOperand:AbstractEquivOperand ;
......@@ -4101,11 +4111,11 @@ EquivOp equiv_op =
;
//// // R722
//// Level6Expr ::= Level5Expr DefBinOpExpr* ;
//// DefBinOpExpr ::= DefinedBinaryOp Level5Expr ;
//// abstract AbstractLevel6Expr:Expr ;
//// Level6Expr:AbstractLevel6Expr ::= Level5Expr:AbstractLevel5Expr DefBinOpExpr* ;
//// DefBinOpExpr ::= DefinedBinaryOp Level5Expr:AbstractLevel5Expr ;
//// // splitting Expr is necessary because of the inheritance in rules 724-731
//// abstract Expr ;
//// Level6ExprExpr:Expr ::= Level6Expr ;
Level6Expr level_6_expr =
e:level_5_expr r:level_6_expr_rest
{
......@@ -4142,10 +4152,7 @@ List<DefBinOpExpr> level_6_expr_rest =
Expr expr =
<BEGINNING>
e:level_6_expr
{
yyValue = new Level6ExprExpr(e);
}
yyValue:level_6_expr
;
// // R723
......@@ -7039,7 +7046,8 @@ PrefixSpec prefix_spec =
;
//// // R1227
//// FunctionSubprogram ::= FunctionStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndFunctionStmt ;
//// abstract ProcedureSubprogram ;
//// FunctionSubprogram:ProcedureSubprogram ::= FunctionStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndFunctionStmt ;
FunctionSubprogram function_subprogram =
f:function_stmt
s:specification_part
......@@ -7114,7 +7122,7 @@ EndFunctionStmt end_function_stmt =
;
//// // R1233
//// SubroutineSubprogram ::= SubroutineStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndSubroutineStmt ;
//// SubroutineSubprogram:ProcedureSubprogram ::= SubroutineStmt [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndSubroutineStmt ;
SubroutineSubprogram subroutine_subprogram =
f:subroutine_stmt
s:specification_part
......@@ -7178,7 +7186,7 @@ EndSubroutineStmt end_subroutine_stmt =
;
//// // R1237
//// SeparateModuleSubprogram ::= [MpSubprogramStmt] [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndMpSubprogramStmt ;
//// SeparateModuleSubprogram:ProcedureSubprogram ::= [MpSubprogramStmt] [SpecificationPart] [ExecutionPart] [InternalSubprogramPart] EndMpSubprogramStmt ;
SeparateModuleSubprogram separate_module_subprogram =
p:mp_subprogram_stmt s:specification_part e:execution_part? i:internal_subprogram_part? x:end_mp_subprogram_stmt
{
......
......@@ -2382,7 +2382,7 @@ class PrettyPrint {
// R710
public void Level3Expr.prettyPrint(PrettyPrinter s) {
boolean first = true;
for (Level2Expr o : getLevel2ExprList()) {
for (AbstractLevel2Expr o : getLevel2ExprList()) {
if (first) {
first = false;
} else {
......@@ -2471,7 +2471,7 @@ class PrettyPrint {
// R715
public void OrOperand.prettyPrint(PrettyPrinter s) {
boolean first = true;
for (AndOperand o : getAndOperandList()) {
for (AbstractAndOperand o : getAndOperandList()) {
if (first) {
first = false;
} else {
......@@ -2549,9 +2549,6 @@ class PrettyPrint {
getDefinedBinaryOp().prettyPrint(s);
getLevel5Expr().prettyPrint(s);
}
public void Level6ExprExpr.prettyPrint(PrettyPrinter s) {
getLevel6Expr().prettyPrint(s);
}
// R723
// DefinedBinaryOp:DefinedOperator ::= <String> ;
......
aspect Types {
// ===============================================================================================
// DECLARATIONS
// ===============================================================================================
syn ASTNode Name.declaration();
eq Name.declaration() {
java.util.Set<ASTNode> decls = enclosingScope().localDeclarations();
for(ASTNode decl : decls) {
java.util.Set<Name> names = decl.declaredSimpleNames();
for (Name name : names) {
if (name.getString().equals(this.getString())) {
return decl;
}
}
}
return null;
}
// ===============================================================================================
// LOCAL DECLARATIONS
// ===============================================================================================
// collection attribute to collect all declarations in the local scope
coll java.util.Set<ASTNode> ASTNode.localDeclarations() [new java.util.HashSet<ASTNode>()] with add;
// everything that is a declared MUST have a name. Of course, the actual name of a thing can be
// a complex one (cf. DataRef), but the simple on has to and can be specified in a simple way.
syn java.util.Set<Name> ASTNode.declaredSimpleNames();
eq ASTNode.declaredSimpleNames() {
return java.util.Collections.emptySet();
}
// handle all declaration constructs (R207)
DerivedTypeDef contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq DerivedTypeDef.declaredSimpleNames() {
return java.util.Collections.singleton(getDerivedTypeStmt().getTypeName());
}
EntryStmt contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq EntryStmt.declaredSimpleNames() {
return java.util.Collections.singleton(getName());
}
// TODO implement EnumDef
// EnumDef contributes this
// to ASTNode.localDeclarations()
// for enclosingScope();
// FormatStmt is not necessary, because it declares nothing. however, it can be referenced with a
// label.
// not sure how to handle an InterfaceBlock. Currently, all interface bodies are used as
// declarations
InterfaceBody contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq FunctionInterfaceBody.declaredSimpleNames() {
return java.util.Collections.singleton(getFunctionStmt().getName());
}
eq SubroutineInterfaceBody.declaredSimpleNames() {
return java.util.Collections.singleton(getSubroutineStmt().getName());
}
ProcedureInterfaceSpecification contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq ProcedureInterfaceSpecification.declaredSimpleNames() {
java.util.Set<Name> names = new java.util.HashSet<Name>();
for (Name name : getProcedureStmt().getNameList()) {
names.add(name);
}
return names;
}
ParameterStmt contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq ParameterStmt.declaredSimpleNames() {
java.util.Set<Name> names = new java.util.HashSet<Name>();
for (NamedConstantDef def : getNamedConstantDefList()) {
names.add(def.getNamedConstant().getName());
}
return names;
}
ProcedureDeclarationStmt contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq ProcedureDeclarationStmt.declaredSimpleNames() {
java.util.Set<Name> names = new java.util.HashSet<Name>();
for (ProcDecl decl : getProcDeclList()) {
names.add(decl.getName());
}
return names;
}
// for the OtherSpecificationStmts, see below
TypeDeclarationStmt contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq TypeDeclarationStmt.declaredSimpleNames() {
java.util.Set<Name> names = new java.util.HashSet<Name>();
for (EntityDecl decl : getEntityDeclList()) {
names.add(decl.getObjectName().getName());
}
return names;
}
// TODO implement StmtFunctionStmt
// handle OtherSpecificationStmt (R212)
// TODO handle OtherSpecificationStmt (R212). These Stmts are not really declarations, I think
// handle subprograms
SubroutineSubprogram contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq SubroutineSubprogram.declaredSimpleNames() {
return java.util.Collections.singleton(getSubroutineStmt().getName());
}
FunctionSubprogram contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq FunctionSubprogram.declaredSimpleNames() {
return java.util.Collections.singleton(getFunctionStmt().getName());
}
SeparateModuleSubprogram contributes this
to ASTNode.localDeclarations()
for enclosingScope();
eq SeparateModuleSubprogram.declaredSimpleNames() {
if (hasMpSubprogramStmt()) {
return java.util.Collections.singleton(getMpSubprogramStmt().getName());
} else {
return java.util.Collections.emptySet();
}
}
// TODO think of other things with names
// ===============================================================================================
// SCOPING
// ===============================================================================================
inh ASTNode ASTNode.enclosingScope();
syn ASTNode Root.enclosingScope() = null;
// first, the unncessary ones
eq Program.getProgramUnit(int i).enclosingScope() {
return null; //throw new RuntimeException("Could not find enclosing scope!");
}
eq Root.getProgram().enclosingScope() {
return null; //throw new RuntimeException("Could not find enclosing scope!");
}
eq Root.getPreamble(int i).enclosingScope() {
return null; //throw new RuntimeException("Could not find enclosing scope!");
}
eq SubroutineSubprogram.getSubroutineStmt().enclosingScope() = this;
eq SubroutineSubprogram.getSpecificationPart().enclosingScope() = this;
eq SubroutineSubprogram.getExecutionPart().enclosingScope() = this;
eq SubroutineSubprogram.getInternalSubprogramPart().enclosingScope() = this;
eq SubroutineSubprogram.getEndSubroutineStmt().enclosingScope() = this;
eq FunctionSubprogram.getFunctionStmt().enclosingScope() = this;
eq FunctionSubprogram.getSpecificationPart().enclosingScope() = this;
eq FunctionSubprogram.getExecutionPart().enclosingScope() = this;
eq FunctionSubprogram.getInternalSubprogramPart().enclosingScope() = this;
eq FunctionSubprogram.getEndFunctionStmt().enclosingScope() = this;
eq SeparateModuleSubprogram.getMpSubprogramStmt().enclosingScope() = this;
eq SeparateModuleSubprogram.getSpecificationPart().enclosingScope() = this;
eq SeparateModuleSubprogram.getExecutionPart().enclosingScope() = this;
eq SeparateModuleSubprogram.getInternalSubprogramPart().enclosingScope() = this;
eq SeparateModuleSubprogram.getEndMpSubprogramStmt().enclosingScope() = this;
eq BlockConstruct.getBlockStmt().enclosingScope() = this;
eq BlockConstruct.getSpecificationPart().enclosingScope() = this;
eq BlockConstruct.getBlock().enclosingScope() = this;
eq BlockConstruct.getEndBlockStmt().enclosingScope() = this;
eq MainProgram.getProgramStmt().enclosingScope() = this;
eq MainProgram.getSpecificationPart().enclosingScope() = this;
eq MainProgram.getExecutionPart().enclosingScope() = this;
eq MainProgram.getInternalSubprogramPart().enclosingScope() = this;
eq MainProgram.getEndProgramStmt().enclosingScope() = this;
eq Module.getModuleStmt().enclosingScope() = this;
eq Module.getSpecificationPart().enclosingScope() = this;
eq Module.getModuleSubprogramPart().enclosingScope() = this;
eq Module.getEndModuleStmt().enclosingScope() = this;
// questionable interface stuff
eq FunctionInterfaceBody.getFunctionStmt().enclosingScope() = this;
eq FunctionInterfaceBody.getSpecificationPart().enclosingScope() = this;
eq FunctionInterfaceBody.getEndFunctionStmt().enclosingScope() = this;
eq SubroutineInterfaceBody.getSubroutineStmt().enclosingScope() = this;
eq SubroutineInterfaceBody.getSpecificationPart().enclosingScope() = this;
eq SubroutineInterfaceBody.getEndSubroutineStmt().enclosingScope() = this;
// COMMON block bullshit
eq BlockData.getBlockDataStmt().enclosingScope() = this;
eq BlockData.getSpecificationPart().enclosingScope() = this;
eq BlockData.getEndBlockDataStmt().enclosingScope() = this;
// TODO do not forget the COMMON block
}
\ No newline at end of file
......@@ -29,6 +29,7 @@ public class DrFort {
Result r = parser.proot(0);
if (r.hasValue()) {
((org.tud.forty.ast.ASTNode)(r.semanticValue())).fixTreeStructure();
drast.views.gui.DrASTGUI debugger = new drast.views.gui.DrASTGUI(r.semanticValue());
debugger.run();
} else {
......
real :: a(10)
a(2) = a(1)
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment