Skip to content

Commit

Permalink
Add tests & fix 'c_analysis' rsm
Browse files Browse the repository at this point in the history
  • Loading branch information
vadyushkins committed May 5, 2023
1 parent 72a44cb commit 78c0d19
Show file tree
Hide file tree
Showing 25 changed files with 247 additions and 104 deletions.
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {

group = "vadyushkins"

version = "1.0.7"
version = "1.0.8"

repositories { mavenCentral() }

Expand Down
6 changes: 3 additions & 3 deletions src/main/kotlin/org/kotgll/rsm/grammar/RSMRead.kt
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@ fun readRSMFromTXT(pathToTXT: String): RSMState {
return rsmStates[y.hashCode]!!
}

val nonterminals: HashMap<Int, Nonterminal> = HashMap()
val nonterminals: HashMap<Nonterminal, Nonterminal> = HashMap()
fun makeNonterminal(name: String): Nonterminal {
val y = Nonterminal(name)
if (!nonterminals.containsKey(y.hashCode)) nonterminals[y.hashCode] = y
return nonterminals[y.hashCode]!!
if (!nonterminals.contains(y)) nonterminals[y] = y
return nonterminals[y]!!
}

val startStateRegex =
Expand Down
111 changes: 83 additions & 28 deletions src/test/kotlin/cli/TestCFGReadWriteTXT.kt
Original file line number Diff line number Diff line change
Expand Up @@ -136,15 +136,13 @@ class TestCFGReadWriteTXT {
}

@Test
fun `'reg1' cfg`() {
fun `'rdf_reg1' cfg`() {
val nonterminalS = Nonterminal("S")

nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"))))
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"))))
nonterminalS.addAlternative(Alternative(listOf(nonterminalS, nonterminalS)))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalS)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg1.txt"
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg1.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

Expand All @@ -153,17 +151,33 @@ class TestCFGReadWriteTXT {
}

@Test
fun `'reg2' cfg`() {
fun `'rdf_reg2' cfg`() {
val nonterminalS = Nonterminal("S")
val nonterminalA = Nonterminal("A")

nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"))))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type_r"))))
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"))))
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf_r"))))
nonterminalS.addAlternative(Alternative(listOf(nonterminalS, nonterminalS)))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalA)))

nonterminalA.addAlternative(Alternative(listOf()))
nonterminalA.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalA)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg2.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

assertEquals(expected = nonterminalS, actual = actualNonterminal)
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
}

@Test
fun `'rdf_reg3' cfg`() {
val nonterminalS = Nonterminal("S")

nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalS)))
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalS)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg2.txt"
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg3.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

Expand All @@ -172,7 +186,7 @@ class TestCFGReadWriteTXT {
}

@Test
fun `'reg3' cfg`() {
fun `'rdf_reg4' cfg`() {
val nonterminalS = Nonterminal("S")
val nonterminalA = Nonterminal("A")
val nonterminalB = Nonterminal("B")
Expand All @@ -185,7 +199,22 @@ class TestCFGReadWriteTXT {
nonterminalB.addAlternative(Alternative(listOf()))
nonterminalB.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalB)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg3.txt"
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg4.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

assertEquals(expected = nonterminalS, actual = actualNonterminal)
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
}

@Test
fun `'c_analysis_reg1' cfg`() {
val nonterminalS = Nonterminal("S")

nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalS)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg1.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

Expand All @@ -194,29 +223,55 @@ class TestCFGReadWriteTXT {
}

@Test
fun `'reg5' cfg`() {
fun `'c_analysis_reg2' cfg`() {
val nonterminalS = Nonterminal("S")
val nonterminalA = Nonterminal("A")
val nonterminalB = Nonterminal("B")
val nonterminalC = Nonterminal("C")
val nonterminalD = Nonterminal("D")

nonterminalS.addAlternative(
Alternative(listOf(nonterminalA, nonterminalB, nonterminalC, nonterminalD)))
nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalA)))

nonterminalA.addAlternative(Alternative(listOf()))
nonterminalA.addAlternative(Alternative(listOf(Terminal("type"), nonterminalA)))
nonterminalA.addAlternative(Alternative(listOf(Terminal("d"), nonterminalA)))

nonterminalB.addAlternative(Alternative(listOf()))
nonterminalB.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalB)))
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg2.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

assertEquals(expected = nonterminalS, actual = actualNonterminal)
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
}

@Test
fun `'c_analysis_reg3' cfg`() {
val nonterminalS = Nonterminal("S")

nonterminalS.addAlternative(Alternative(listOf()))
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalS)))
nonterminalS.addAlternative(Alternative(listOf(Terminal("d"), nonterminalS)))

nonterminalC.addAlternative(Alternative(listOf()))
nonterminalC.addAlternative(Alternative(listOf(Terminal("subClassOf_r"), nonterminalC)))
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg3.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

assertEquals(expected = nonterminalS, actual = actualNonterminal)
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
}

@Test
fun `'c_analysis_reg4' cfg`() {
val nonterminalS = Nonterminal("S")
val nonterminalA = Nonterminal("A")
val nonterminalB = Nonterminal("B")

nonterminalS.addAlternative(Alternative(listOf(nonterminalA, nonterminalB)))

nonterminalA.addAlternative(Alternative(listOf()))
nonterminalA.addAlternative(Alternative(listOf(Terminal("a"), nonterminalA)))

nonterminalD.addAlternative(Alternative(listOf()))
nonterminalD.addAlternative(Alternative(listOf(Terminal("type_r"), nonterminalD)))
nonterminalB.addAlternative(Alternative(listOf()))
nonterminalB.addAlternative(Alternative(listOf(Terminal("d"), nonterminalB)))

val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg4.txt"
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg4.txt"
writeCFGToTXT(nonterminalS, pathToTXT)
val actualNonterminal = readCFGFromTXT(pathToTXT)

Expand Down
131 changes: 102 additions & 29 deletions src/test/kotlin/cli/TestRSMReadWriteTXT.kt
Original file line number Diff line number Diff line change
Expand Up @@ -366,7 +366,9 @@ class TestRSMReadWriteTXT {
rsmState2.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState3))

rsmState4.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a_r"), head = rsmState6))
rsmState4.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState8))
rsmState4.addNonterminalEdge(RSMNonterminalEdge(nonterminal = nonterminalS, head = rsmState5))
rsmState4.addNonterminalEdge(RSMNonterminalEdge(nonterminal = nonterminalS, head = rsmState7))

rsmState5.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a_r"), head = rsmState6))

Expand Down Expand Up @@ -395,16 +397,38 @@ class TestRSMReadWriteTXT {
}

@Test
fun `'reg1' rsm`() {
fun `'rdf_reg1' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState0))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg1.txt"
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg1.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

assertEquals(expected = rsmState0, actual = actualRSMState)
assertEquals(
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
assertEquals(
expected = rsmState0.outgoingNonterminalEdges,
actual = actualRSMState.outgoingNonterminalEdges)
}

@Test
fun `'rdf_reg2' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState1))
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg2.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

Expand All @@ -417,19 +441,16 @@ class TestRSMReadWriteTXT {
}

@Test
fun `'reg2' rsm`() {
fun `'rdf_reg3' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState0))
rsmState0.addTerminalEdge(
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState0))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg2.txt"
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg3.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

Expand All @@ -442,10 +463,10 @@ class TestRSMReadWriteTXT {
}

@Test
fun `'reg3' rsm`() {
fun `'rdf_reg4' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)

nonterminalS.startState = rsmState0

Expand All @@ -454,7 +475,7 @@ class TestRSMReadWriteTXT {

rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg3.txt"
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg4.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

Expand All @@ -467,33 +488,85 @@ class TestRSMReadWriteTXT {
}

@Test
fun `'reg4' rsm`() {
fun `'c_analysis_reg1' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState2 = RSMState(id = 2, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState3 = RSMState(id = 3, nonterminal = nonterminalS, isStart = true, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))
rsmState0.addTerminalEdge(
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))

rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))
rsmState1.addTerminalEdge(
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg1.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

rsmState2.addTerminalEdge(
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
rsmState2.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
assertEquals(expected = rsmState0, actual = actualRSMState)
assertEquals(
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
assertEquals(
expected = rsmState0.outgoingNonterminalEdges,
actual = actualRSMState.outgoingNonterminalEdges)
}

@Test
fun `'c_analysis_reg2' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState1))
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg2.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

assertEquals(expected = rsmState0, actual = actualRSMState)
assertEquals(
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
assertEquals(
expected = rsmState0.outgoingNonterminalEdges,
actual = actualRSMState.outgoingNonterminalEdges)
}

@Test
fun `'c_analysis_reg3' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState0))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg3.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

assertEquals(expected = rsmState0, actual = actualRSMState)
assertEquals(
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
assertEquals(
expected = rsmState0.outgoingNonterminalEdges,
actual = actualRSMState.outgoingNonterminalEdges)
}

@Test
fun `'c_analysis_reg4' rsm`() {
val nonterminalS = Nonterminal("S")
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)

nonterminalS.startState = rsmState0

rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))

rsmState3.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))

val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg4.txt"
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg4.txt"
writeRSMToTXT(rsmState0, pathToTXT)
val actualRSMState = readRSMFromTXT(pathToTXT)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
StartNonterminal("S")
Nonterminal("S") ->
Nonterminal("S") -> Terminal("a") Nonterminal("S")
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
StartNonterminal("S")
Nonterminal("S") ->
Nonterminal("S") -> Terminal("a") Nonterminal("A")
Nonterminal("A") ->
Nonterminal("A") -> Terminal("d") Nonterminal("A")

0 comments on commit 78c0d19

Please sign in to comment.