Skip to content

Commit 0e7c308

Browse files
committed
translate, interpreter and statements updated for csparql
1 parent 986a790 commit 0e7c308

File tree

9 files changed

+87
-8
lines changed

9 files changed

+87
-8
lines changed

src/main/kotlin/no/uio/microobject/ast/Translate.kt

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
2222
private val classifiesTable: MutableMap<String, Pair<String, String>> = mutableMapOf()
2323
private val checkClassifiesTable: MutableMap<String, MutableMap<String, Pair<String, String>>> = mutableMapOf()
2424
private val contextTable : MutableMap<String, String> = mutableMapOf()
25+
private val streamersTable : MutableMap<String, MutableMap<String, MutableSet<Expression>>> = mutableMapOf()
2526

2627
private fun translateModels(ctx : Models_blockContext) : Pair<List<Pair<Expression, String>>, String>{
2728
if(ctx is Simple_models_blockContext)
@@ -75,6 +76,11 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
7576
addClassifyQuery(cl.className.text, cl.classifies_block(), null)
7677
}
7778
}
79+
80+
// create streamer configuration
81+
if (cl.streamer != null) {
82+
streamersTable[cl.className.text] = mutableMapOf()
83+
}
7884
val inFields = if(cl.external != null) {
7985
var res = listOf<FieldInfo>()
8086
if(cl.external.fieldDecl() != null) {
@@ -141,6 +147,14 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
141147
val params = if (nm.paramList() != null) paramListTranslate(nm.paramList()) else listOf()
142148
res[nm.NAME().text] = MethodInfo(SkipStmt(ctx!!.start.line), params, nm.builtinrule != null, nm.domainrule != null, cl.className.text, metType)
143149
}
150+
if (nm.emits_block() != null) {
151+
if (!streamersTable.containsKey(cl.className.text))
152+
throw Exception("Class with methods containing emits clause must be a streamer: ${nm.NAME().text}")
153+
154+
streamersTable[cl.className.text]!![nm.NAME().text] = mutableSetOf()
155+
for(i in 0 until nm.emits_block().expression().size)
156+
streamersTable[cl.className.text]!![nm.NAME().text]!! += visit(nm.emits_block().expression(i)) as Expression
157+
}
144158
}
145159
table[cl.className.text] = Pair(fields, res)
146160
}
@@ -179,7 +193,7 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
179193

180194
return Pair(
181195
StackEntry(visit(ctx.statement()) as Statement, mutableMapOf(), Names.getObjName("_Entry_"), Names.getStackId()),
182-
StaticTable(fieldTable, methodTable, hierarchy, modelsTable, hidden, owldescr, checkClassifiesTable, contextTable)
196+
StaticTable(fieldTable, methodTable, hierarchy, modelsTable, hidden, owldescr, checkClassifiesTable, contextTable, streamersTable)
183197
)
184198
}
185199

@@ -402,6 +416,35 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
402416
return SimulationStmt(target, path, res, ctx!!.start.line, declares)
403417
}
404418

419+
override fun visitMonitor_statement(ctx: Monitor_statementContext?): ProgramElement {
420+
val target = visit(ctx!!.target) as Location
421+
if(ctx.declType != null) {
422+
val decl = getClassDecl(ctx)
423+
val className = if(decl == null) ERRORTYPE.name else decl!!.className.text
424+
val targetType = TypeChecker.translateType(ctx.declType, className, mutableMapOf())
425+
target.setType(targetType)
426+
}
427+
428+
val query = visit(ctx!!.registeredQuery) as Expression
429+
val ll = emptyList<Expression>().toMutableList()
430+
for(i in 2 until ctx!!.expression().size)
431+
ll += visit(ctx.expression(i)) as Expression
432+
433+
return MonitorStmt(target, query, ll, ctx!!.start.line, target.getType())
434+
}
435+
436+
override fun visitWindow_statement(ctx: Window_statementContext?): ProgramElement {
437+
val target = visit(ctx!!.target) as Location
438+
if(ctx.declType != null) {
439+
val decl = getClassDecl(ctx)
440+
val className = if(decl == null) ERRORTYPE.name else decl!!.className.text
441+
val targetType = TypeChecker.translateType(ctx.declType, className, mutableMapOf())
442+
target.setType(targetType)
443+
}
444+
val monitor = visit(ctx!!.monitor) as Expression
445+
return WindowStmt(target, monitor, ctx!!.start.line, declares=target.getType())
446+
}
447+
405448
override fun visitTick_statement(ctx: Tick_statementContext?): ProgramElement {
406449
return TickStmt(visit(ctx!!.fmu) as Expression, visit(ctx!!.time) as Expression )
407450
}
@@ -418,7 +461,8 @@ class Translate : WhileBaseVisitor<ProgramElement>() {
418461
val def = getClassDecl(ctx as RuleContext)
419462
val declares = if(ctx!!.declType == null) null else
420463
TypeChecker.translateType(ctx.declType, if(def != null) def!!.className.text else ERRORTYPE.name, mutableMapOf())
421-
return AssignStmt(visit(ctx!!.expression(0)) as Location, visit(ctx.expression(1)) as Expression, ctx!!.start.line, declares)
464+
val isClock = if(ctx.clock == null) false else true
465+
return AssignStmt(visit(ctx!!.expression(0)) as Location, visit(ctx.expression(1)) as Expression, isClock, ctx!!.start.line, declares)
422466
}
423467

424468
override fun visitSkip_statment(ctx: Skip_statmentContext?): ProgramElement {

src/main/kotlin/no/uio/microobject/ast/stmt/AssignStmt.kt

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import no.uio.microobject.runtime.Memory
1010
import no.uio.microobject.runtime.StackEntry
1111
import no.uio.microobject.type.BaseType
1212
import no.uio.microobject.type.Type
13+
import no.uio.microobject.type.INTTYPE
1314

1415
// Assignment, where value cannot refer to calls or object creations.
15-
data class AssignStmt(val target : Location, val value : Expression, val pos : Int = -1, val declares: Type?) :
16+
data class AssignStmt(val target : Location, val value : Expression, val isClock: Boolean = false, val pos : Int = -1, val declares: Type?) :
1617
Statement {
1718
override fun toString(): String = "$target := $value"
1819
override fun getRDF(): String {
@@ -28,7 +29,14 @@ data class AssignStmt(val target : Location, val value : Expression, val pos : I
2829
override fun eval(heapObj: Memory, stackFrame : StackEntry, interpreter: Interpreter) : EvalResult {
2930
val res = interpreter.eval(value, stackFrame)
3031
when (target) {
31-
is LocalVar -> stackFrame.store[target.name] = res
32+
is LocalVar -> {
33+
if (isClock && interpreter.streamManager.clockVar == null) {
34+
interpreter.streamManager.clockVar = target.name
35+
}
36+
if (interpreter.streamManager.clockVar != null && target.name.equals(interpreter.streamManager.clockVar)
37+
&& res.tag == INTTYPE) interpreter.streamManager.clockTimestampSec = res.literal
38+
stackFrame.store[target.name] = res
39+
}
3240
is OwnVar -> {
3341
val got = interpreter.staticInfo.fieldTable[(stackFrame.obj.tag as BaseType).name] ?: throw Exception("Cannot find class ${stackFrame.obj.tag.name}")
3442
if (!got.map {it.name} .contains(target.name))

src/main/kotlin/no/uio/microobject/ast/stmt/CallStmt.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,14 @@ data class CallStmt(val target : Location, val callee : Location, val method : S
3939
for (i in m.params.indices) {
4040
newMemory[m.params[i]] = interpreter.eval(params[i], stackFrame)
4141
}
42+
43+
var emitFromMethod: String? = null
44+
if (interpreter.staticInfo.streamersTable.containsKey(newObj.tag.name) &&
45+
interpreter.staticInfo.streamersTable[newObj.tag.name]!!.containsKey(method))
46+
emitFromMethod = method
47+
4248
return EvalResult(
43-
StackEntry(StoreReturnStmt(target), stackFrame.store, stackFrame.obj, stackFrame.id),
49+
StackEntry(StoreReturnStmt(target, emitFromMethod=emitFromMethod), stackFrame.store, stackFrame.obj, stackFrame.id),
4450
listOf(StackEntry(m.stmt, newMemory, newObj, Names.getStackId()))
4551
)
4652
}

src/main/kotlin/no/uio/microobject/ast/stmt/ConstructStmt.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ data class ConstructStmt(val target : Location, val query: Expression, val param
109109
newListMemory["next"] = list
110110
interpreter.heap[newListName] = newListMemory
111111
list = newListName
112+
if (interpreter.staticInfo.streamersTable.containsKey(className)) {
113+
interpreter.streamManager.registerStream(className, newObjName)
114+
}
112115
}
113116
}
114117
return replaceStmt(AssignStmt(target, list, declares = declares), stackFrame)

src/main/kotlin/no/uio/microobject/ast/stmt/CreateStmt.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ data class CreateStmt(val target : Location, val className: String, val params :
5050
interpreter.heap[name] = newMemory
5151
val localFrame = StackEntry(SkipStmt(), mutableMapOf(Pair("this", name)),name,0)
5252
n.filter { it.internalInit != null }.forEach { newMemory[it.name] = interpreter.eval(it.internalInit!!, localFrame) }
53+
if (interpreter.staticInfo.streamersTable.containsKey(className)) {
54+
interpreter.streamManager.registerStream(className, name)
55+
}
5356
return replaceStmt(AssignStmt(target, name, declares = declares), stackFrame)
5457
}
5558
}

src/main/kotlin/no/uio/microobject/ast/stmt/ReturnStmt.kt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import no.uio.microobject.runtime.EvalResult
55
import no.uio.microobject.runtime.Interpreter
66
import no.uio.microobject.runtime.Memory
77
import no.uio.microobject.runtime.StackEntry
8+
import no.uio.microobject.type.BaseType
89

910
// Return statement
1011
data class ReturnStmt(var value : Expression, val pos : Int = -1) : Statement {
@@ -22,6 +23,7 @@ data class ReturnStmt(var value : Expression, val pos : Int = -1) : Statement {
2223
val over = interpreter.stack.pop()
2324
if (over.active is StoreReturnStmt) {
2425
val res = interpreter.eval(value, stackFrame)
26+
checkTriggerStream(over.active, stackFrame, interpreter)
2527
return EvalResult(
2628
StackEntry(
2729
AssignStmt(over.active.target, res, declares = null),
@@ -35,8 +37,17 @@ data class ReturnStmt(var value : Expression, val pos : Int = -1) : Statement {
3537
val active = over.active.first
3638
val next = over.active.second
3739
val res = interpreter.eval(value, stackFrame)
40+
checkTriggerStream(over.active.first, stackFrame, interpreter)
3841
return replaceStmt(appendStmt(AssignStmt(active.target, res, declares = null), next), over)
3942
}
4043
throw Exception("Malformed heap")
4144
}
45+
46+
// trigger stream at the end of emission method, right before returning the result
47+
private fun checkTriggerStream(storeReturnStmt: StoreReturnStmt, stackFrame: StackEntry, interpreter: Interpreter) {
48+
if (storeReturnStmt.emitFromMethod != null) {
49+
val className = (stackFrame.obj.tag as BaseType).name
50+
interpreter.streamManager.triggerStream(className, stackFrame.obj, storeReturnStmt.emitFromMethod, stackFrame)
51+
}
52+
}
4253
}

src/main/kotlin/no/uio/microobject/ast/stmt/StoreReturnStmt.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import no.uio.microobject.runtime.Memory
88
import no.uio.microobject.runtime.StackEntry
99

1010
// This is a runtime-syntax only statement which models that we will write the return value of the next method in the stack into target
11-
data class StoreReturnStmt(val target : Location, val pos : Int = -1) : Statement {
11+
data class StoreReturnStmt(val target : Location, val pos : Int = -1, val emitFromMethod: String? = null) : Statement {
1212
override fun toString(): String = "$target <- stack"
1313
override fun getRDF(): String {
1414
return """

src/main/kotlin/no/uio/microobject/runtime/Interpreter.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ import kotlinx.coroutines.runBlocking
1414
import no.uio.microobject.ast.*
1515
import no.uio.microobject.ast.expr.LiteralExpr
1616
import no.uio.microobject.ast.stmt.ReturnStmt
17+
import no.uio.microobject.ast.stmt.MonitorObject
1718
import no.uio.microobject.data.TripleManager
19+
import no.uio.microobject.data.StreamManager
1820
import no.uio.microobject.main.Settings
1921
import no.uio.microobject.type.*
2022
import org.apache.jena.query.QueryExecution
@@ -68,6 +70,7 @@ class Interpreter(
6870

6971
// TripleManager used to provide virtual triples etc.
7072
val tripleManager : TripleManager = TripleManager(settings, staticInfo, this)
73+
val streamManager : StreamManager = StreamManager(settings, staticInfo, this)
7174

7275
/**
7376
* Evaluates a call on a method of a class

src/main/kotlin/no/uio/microobject/runtime/State.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package no.uio.microobject.runtime
33
import no.uio.microobject.ast.Expression
44
import no.uio.microobject.ast.expr.LiteralExpr
55
import no.uio.microobject.ast.Statement
6+
import no.uio.microobject.ast.stmt.MonitorObject
67
import no.uio.microobject.type.Type
78
import org.apache.jena.query.ResultSet
89

@@ -29,8 +30,8 @@ data class StaticTable(
2930
val hiddenSet: Set<String>,//This set of classes is skipped by the lifting
3031
val owldescr: MutableMap<String, String>, // This maps class names to the default models block
3132
val checkClassifiesTable: MutableMap<String, MutableMap<String, Pair<String, String>>> = mutableMapOf(), // Queries for classification
32-
val contextTable: MutableMap<String, String>
33-
33+
val contextTable: MutableMap<String, String>,
34+
val streamersTable: MutableMap<String, MutableMap<String, MutableSet<Expression>>>
3435
) {
3536
override fun toString(): String =
3637
"""

0 commit comments

Comments
 (0)