Skip to content

Commit

Permalink
Merge pull request #124 from smeup/continued-indicators-impl
Browse files Browse the repository at this point in the history
Continued indicators impl
  • Loading branch information
f-lombardo authored Mar 12, 2020
2 parents 854f3aa + 9ac7ce7 commit 973192a
Show file tree
Hide file tree
Showing 4 changed files with 171 additions and 1 deletion.
78 changes: 78 additions & 0 deletions mutes_for_ci/MUTE16_04.rpgle
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
V*=====================================================================
V* MODIFICHE Ril. T Au Descrizione
V* gg/mm/aa nn.mm i xx Breve descrizione
V*=====================================================================
V* 11/03/20 V5R1 FP Creato
V*=====================================================================
D FACTOR2 S 1 0
*---------------------------------------------------------------
* M A I N
*---------------------------------------------------------------
C SETOFF 34
C Z-ADD 0 FACTOR2
C 34 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 34
C Z-ADD 0 FACTOR2
C N34 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(2) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 3435
C Z-ADD 0 FACTOR2
C 34
COR 35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 3435
C Z-ADD 0 FACTOR2
C 34
CORN35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(2) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 3435
C Z-ADD 0 FACTOR2
C 34
CANN35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 3435
C Z-ADD 0 FACTOR2
C 34
CAN 35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 3435
C Z-ADD 0 FACTOR2
C N34
CANN35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(2) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETON 3435
C Z-ADD 0 FACTOR2
C N34
CANN35 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETOFF 343536
C SETOFF 373839
C Z-ADD 0 FACTOR2
C 34
CAN 35
CANN36
COR 37
CAN 38
CANN39 Z-ADD 1 FACTOR2
MU* VAL1(FACTOR2) VAL2(1) COMP(EQ)
C EVAL FACTOR2+=1
*
C SETON LR
*---------------------------------------------------------------
Original file line number Diff line number Diff line change
Expand Up @@ -388,11 +388,69 @@ class InternalInterpreter(val systemInterface: SystemInterface) : InterpreterCor
return if (negate) !indicator else indicator
}

data class SolvedIndicatorCondition(val key: Int, val value: Boolean, val operator: String)

private fun Statement.solveIndicatorValues(): List<SolvedIndicatorCondition> =
this.continuedIndicators.map { (indicatorKey, continuedIndicator) ->
val indicator = indicator(indicatorKey).value
var condition: Boolean = if (continuedIndicator.negate) !indicator else indicator
val solvedIndicatorCondition = SolvedIndicatorCondition(indicatorKey, condition, continuedIndicator.level)
println("Indicator:${continuedIndicator.key}(negate=${continuedIndicator.negate}, operator=${solvedIndicatorCondition.operator}) PredefinedValue(from Symboltable)=${indicator(indicatorKey)} --> Is condition verified: ${solvedIndicatorCondition.value}")
solvedIndicatorCondition
}

private fun getMapOfORs(indicatorValues: List<SolvedIndicatorCondition>): ArrayList<ArrayList<Boolean>> {
val mapOfORs = ArrayList<ArrayList<Boolean>>()
val reversed = indicatorValues.reversed()
var previousOperator: String = ""
var loops = 0
var idxOfMapOfANDs = 0
reversed.forEach { solvedIndicator ->
if (loops == 0) {
mapOfORs.add(ArrayList<Boolean>())
mapOfORs.get(idxOfMapOfANDs).add(solvedIndicator.value)
} else {
if (previousOperator == "AND") {
mapOfORs.get(idxOfMapOfANDs).add(solvedIndicator.value)
} else {
mapOfORs.add(ArrayList<Boolean>())
idxOfMapOfANDs++
mapOfORs.get(idxOfMapOfANDs).add(solvedIndicator.value)
}
}
previousOperator = solvedIndicator.operator
loops++
}
return mapOfORs
}

private fun Statement.shouldBeExecuted(): Boolean = this.indicatorCondition.shouldExecuteStatement()

private fun Statement.isStatementExecutable(mapOfORs: ArrayList<ArrayList<Boolean>>): Boolean {
var isExecutable = false
// True if at least one of "mapOfANDs" relations contains only true values
// loop through "mapOfORs" relations
for (mapOfANDs in mapOfORs) {
// loop through map of "AND" relations
for (b in mapOfANDs) {
if (!b) {
isExecutable = false
break
}
isExecutable = true
}
if (isExecutable) break
}
// Empty mapOfORs means no leftIndicator
if (mapOfORs.isEmpty()) {
isExecutable = this.shouldBeExecuted()
}
return isExecutable
}

private fun execute(statement: Statement) {
try {
if (!statement.shouldBeExecuted()) return
if (!statement.isStatementExecutable(getMapOfORs(statement.solveIndicatorValues()))) return
when (statement) {
is ExecuteSubroutine -> {
log(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import com.smeup.rpgparser.parsing.parsetreetoast.acceptBody
import com.smeup.rpgparser.parsing.parsetreetoast.toAst
import com.smeup.rpgparser.utils.ComparisonOperator
import com.strumenta.kolasu.model.*
import java.util.HashMap

interface StatementThatCanDefineData {
fun dataDefinition(): List<InStatementDataDefinition>
Expand All @@ -25,6 +26,7 @@ enum class AssignmentOperator(val text: String) {

typealias IndicatorKey = Int
data class IndicatorCondition(val key: IndicatorKey, val negate: Boolean)
data class ContinuedIndicator(val key: IndicatorKey, val negate: Boolean, val level: String)

abstract class Statement(
override val position: Position? = null,
Expand Down Expand Up @@ -52,6 +54,7 @@ abstract class Statement(
open fun simpleDescription() = "Issue executing ${javaClass.simpleName} at line ${startLine()}."

var indicatorCondition: IndicatorCondition? = null
var continuedIndicators: HashMap<Int, ContinuedIndicator> = HashMap<Int, ContinuedIndicator>()
}

data class ExecuteSubroutine(var subroutine: ReferenceByName<Subroutine>, override val position: Position? = null) : Statement(position)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,37 @@ internal fun Cspec_fixedContext.toAst(conf: ToAstConfiguration = ToAstConfigurat
this.cspec_fixed_standard().toAst(conf)
.also {
it.indicatorCondition = this.toIndicatorCondition(conf)
if (it.indicatorCondition != null) {
val continuedIndicators = (this as Cspec_fixedContext).cspec_continuedIndicators()
// loop over continued indicators (WARNING: continuedIndicators not contains inline indicator)
for (i in 0 until continuedIndicators.size) {
val indicator = continuedIndicators[i].indicators.children[0].toString().toInt()
var onOff = false
if (!continuedIndicators[i].indicatorsOff.children[0].toString().isEmptyTrim()) {
onOff = true
}
val controlLevel = when (continuedIndicators[i].start.type) {
AndIndicator -> "AND"
OrIndicator -> "OR"
else -> ""
}
val continuedIndicator = ContinuedIndicator(indicator, onOff, controlLevel)
it.continuedIndicators.put(indicator, continuedIndicator)
}

// Add indicatorCondition (inline indicator) also
var controlLevel = ((this as Cspec_fixedContext).children[continuedIndicators.size + 1] as Cs_controlLevelContext).children[0].toString()
if (controlLevel == "AN") {
controlLevel = "AND"
}
var onOff = false
if (!((this as Cspec_fixedContext).children[continuedIndicators.size + 2] as OnOffIndicatorsFlagContext).children[0].toString().isEmptyTrim()) {
onOff = true
}
val indicator = ((this as Cspec_fixedContext).children[continuedIndicators.size + 3] as Cs_indicatorsContext).children[0].toString().toInt()
val continuedIndicator = ContinuedIndicator(indicator, onOff, controlLevel)
it.continuedIndicators.put(indicator, continuedIndicator)
}
}
else -> TODO(this.text.toString())
}
Expand Down

0 comments on commit 973192a

Please sign in to comment.