Skip to content

Commit 78c0d19

Browse files
committed
Add tests & fix 'c_analysis' rsm
1 parent 72a44cb commit 78c0d19

25 files changed

Lines changed: 247 additions & 104 deletions

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66

77
group = "vadyushkins"
88

9-
version = "1.0.7"
9+
version = "1.0.8"
1010

1111
repositories { mavenCentral() }
1212

src/main/kotlin/org/kotgll/rsm/grammar/RSMRead.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@ fun readRSMFromTXT(pathToTXT: String): RSMState {
1818
return rsmStates[y.hashCode]!!
1919
}
2020

21-
val nonterminals: HashMap<Int, Nonterminal> = HashMap()
21+
val nonterminals: HashMap<Nonterminal, Nonterminal> = HashMap()
2222
fun makeNonterminal(name: String): Nonterminal {
2323
val y = Nonterminal(name)
24-
if (!nonterminals.containsKey(y.hashCode)) nonterminals[y.hashCode] = y
25-
return nonterminals[y.hashCode]!!
24+
if (!nonterminals.contains(y)) nonterminals[y] = y
25+
return nonterminals[y]!!
2626
}
2727

2828
val startStateRegex =

src/test/kotlin/cli/TestCFGReadWriteTXT.kt

Lines changed: 83 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -136,15 +136,13 @@ class TestCFGReadWriteTXT {
136136
}
137137

138138
@Test
139-
fun `'reg1' cfg`() {
139+
fun `'rdf_reg1' cfg`() {
140140
val nonterminalS = Nonterminal("S")
141141

142142
nonterminalS.addAlternative(Alternative(listOf()))
143-
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"))))
144-
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"))))
145-
nonterminalS.addAlternative(Alternative(listOf(nonterminalS, nonterminalS)))
143+
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalS)))
146144

147-
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg1.txt"
145+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg1.txt"
148146
writeCFGToTXT(nonterminalS, pathToTXT)
149147
val actualNonterminal = readCFGFromTXT(pathToTXT)
150148

@@ -153,17 +151,33 @@ class TestCFGReadWriteTXT {
153151
}
154152

155153
@Test
156-
fun `'reg2' cfg`() {
154+
fun `'rdf_reg2' cfg`() {
157155
val nonterminalS = Nonterminal("S")
156+
val nonterminalA = Nonterminal("A")
158157

159158
nonterminalS.addAlternative(Alternative(listOf()))
160-
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"))))
161-
nonterminalS.addAlternative(Alternative(listOf(Terminal("type_r"))))
162-
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"))))
163-
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf_r"))))
164-
nonterminalS.addAlternative(Alternative(listOf(nonterminalS, nonterminalS)))
159+
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalA)))
160+
161+
nonterminalA.addAlternative(Alternative(listOf()))
162+
nonterminalA.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalA)))
163+
164+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg2.txt"
165+
writeCFGToTXT(nonterminalS, pathToTXT)
166+
val actualNonterminal = readCFGFromTXT(pathToTXT)
167+
168+
assertEquals(expected = nonterminalS, actual = actualNonterminal)
169+
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
170+
}
171+
172+
@Test
173+
fun `'rdf_reg3' cfg`() {
174+
val nonterminalS = Nonterminal("S")
175+
176+
nonterminalS.addAlternative(Alternative(listOf()))
177+
nonterminalS.addAlternative(Alternative(listOf(Terminal("type"), nonterminalS)))
178+
nonterminalS.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalS)))
165179

166-
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg2.txt"
180+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg3.txt"
167181
writeCFGToTXT(nonterminalS, pathToTXT)
168182
val actualNonterminal = readCFGFromTXT(pathToTXT)
169183

@@ -172,7 +186,7 @@ class TestCFGReadWriteTXT {
172186
}
173187

174188
@Test
175-
fun `'reg3' cfg`() {
189+
fun `'rdf_reg4' cfg`() {
176190
val nonterminalS = Nonterminal("S")
177191
val nonterminalA = Nonterminal("A")
178192
val nonterminalB = Nonterminal("B")
@@ -185,7 +199,22 @@ class TestCFGReadWriteTXT {
185199
nonterminalB.addAlternative(Alternative(listOf()))
186200
nonterminalB.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalB)))
187201

188-
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg3.txt"
202+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/rdf_reg4.txt"
203+
writeCFGToTXT(nonterminalS, pathToTXT)
204+
val actualNonterminal = readCFGFromTXT(pathToTXT)
205+
206+
assertEquals(expected = nonterminalS, actual = actualNonterminal)
207+
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
208+
}
209+
210+
@Test
211+
fun `'c_analysis_reg1' cfg`() {
212+
val nonterminalS = Nonterminal("S")
213+
214+
nonterminalS.addAlternative(Alternative(listOf()))
215+
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalS)))
216+
217+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg1.txt"
189218
writeCFGToTXT(nonterminalS, pathToTXT)
190219
val actualNonterminal = readCFGFromTXT(pathToTXT)
191220

@@ -194,29 +223,55 @@ class TestCFGReadWriteTXT {
194223
}
195224

196225
@Test
197-
fun `'reg5' cfg`() {
226+
fun `'c_analysis_reg2' cfg`() {
198227
val nonterminalS = Nonterminal("S")
199228
val nonterminalA = Nonterminal("A")
200-
val nonterminalB = Nonterminal("B")
201-
val nonterminalC = Nonterminal("C")
202-
val nonterminalD = Nonterminal("D")
203229

204-
nonterminalS.addAlternative(
205-
Alternative(listOf(nonterminalA, nonterminalB, nonterminalC, nonterminalD)))
230+
nonterminalS.addAlternative(Alternative(listOf()))
231+
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalA)))
206232

207233
nonterminalA.addAlternative(Alternative(listOf()))
208-
nonterminalA.addAlternative(Alternative(listOf(Terminal("type"), nonterminalA)))
234+
nonterminalA.addAlternative(Alternative(listOf(Terminal("d"), nonterminalA)))
209235

210-
nonterminalB.addAlternative(Alternative(listOf()))
211-
nonterminalB.addAlternative(Alternative(listOf(Terminal("subClassOf"), nonterminalB)))
236+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg2.txt"
237+
writeCFGToTXT(nonterminalS, pathToTXT)
238+
val actualNonterminal = readCFGFromTXT(pathToTXT)
239+
240+
assertEquals(expected = nonterminalS, actual = actualNonterminal)
241+
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
242+
}
243+
244+
@Test
245+
fun `'c_analysis_reg3' cfg`() {
246+
val nonterminalS = Nonterminal("S")
247+
248+
nonterminalS.addAlternative(Alternative(listOf()))
249+
nonterminalS.addAlternative(Alternative(listOf(Terminal("a"), nonterminalS)))
250+
nonterminalS.addAlternative(Alternative(listOf(Terminal("d"), nonterminalS)))
212251

213-
nonterminalC.addAlternative(Alternative(listOf()))
214-
nonterminalC.addAlternative(Alternative(listOf(Terminal("subClassOf_r"), nonterminalC)))
252+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg3.txt"
253+
writeCFGToTXT(nonterminalS, pathToTXT)
254+
val actualNonterminal = readCFGFromTXT(pathToTXT)
255+
256+
assertEquals(expected = nonterminalS, actual = actualNonterminal)
257+
assertEquals(expected = nonterminalS.alternatives, actual = actualNonterminal.alternatives)
258+
}
259+
260+
@Test
261+
fun `'c_analysis_reg4' cfg`() {
262+
val nonterminalS = Nonterminal("S")
263+
val nonterminalA = Nonterminal("A")
264+
val nonterminalB = Nonterminal("B")
265+
266+
nonterminalS.addAlternative(Alternative(listOf(nonterminalA, nonterminalB)))
267+
268+
nonterminalA.addAlternative(Alternative(listOf()))
269+
nonterminalA.addAlternative(Alternative(listOf(Terminal("a"), nonterminalA)))
215270

216-
nonterminalD.addAlternative(Alternative(listOf()))
217-
nonterminalD.addAlternative(Alternative(listOf(Terminal("type_r"), nonterminalD)))
271+
nonterminalB.addAlternative(Alternative(listOf()))
272+
nonterminalB.addAlternative(Alternative(listOf(Terminal("d"), nonterminalB)))
218273

219-
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/reg4.txt"
274+
val pathToTXT = "src/test/resources/cli/TestCFGReadWriteTXT/c_analysis_reg4.txt"
220275
writeCFGToTXT(nonterminalS, pathToTXT)
221276
val actualNonterminal = readCFGFromTXT(pathToTXT)
222277

src/test/kotlin/cli/TestRSMReadWriteTXT.kt

Lines changed: 102 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,9 @@ class TestRSMReadWriteTXT {
366366
rsmState2.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState3))
367367

368368
rsmState4.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a_r"), head = rsmState6))
369+
rsmState4.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState8))
369370
rsmState4.addNonterminalEdge(RSMNonterminalEdge(nonterminal = nonterminalS, head = rsmState5))
371+
rsmState4.addNonterminalEdge(RSMNonterminalEdge(nonterminal = nonterminalS, head = rsmState7))
370372

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

@@ -395,16 +397,38 @@ class TestRSMReadWriteTXT {
395397
}
396398

397399
@Test
398-
fun `'reg1' rsm`() {
400+
fun `'rdf_reg1' rsm`() {
399401
val nonterminalS = Nonterminal("S")
400402
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
401403

402404
nonterminalS.startState = rsmState0
403405

404406
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
405-
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState0))
406407

407-
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg1.txt"
408+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg1.txt"
409+
writeRSMToTXT(rsmState0, pathToTXT)
410+
val actualRSMState = readRSMFromTXT(pathToTXT)
411+
412+
assertEquals(expected = rsmState0, actual = actualRSMState)
413+
assertEquals(
414+
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
415+
assertEquals(
416+
expected = rsmState0.outgoingNonterminalEdges,
417+
actual = actualRSMState.outgoingNonterminalEdges)
418+
}
419+
420+
@Test
421+
fun `'rdf_reg2' rsm`() {
422+
val nonterminalS = Nonterminal("S")
423+
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true)
424+
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)
425+
426+
nonterminalS.startState = rsmState0
427+
428+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState1))
429+
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))
430+
431+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg2.txt"
408432
writeRSMToTXT(rsmState0, pathToTXT)
409433
val actualRSMState = readRSMFromTXT(pathToTXT)
410434

@@ -417,19 +441,16 @@ class TestRSMReadWriteTXT {
417441
}
418442

419443
@Test
420-
fun `'reg2' rsm`() {
444+
fun `'rdf_reg3' rsm`() {
421445
val nonterminalS = Nonterminal("S")
422446
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
423447

424448
nonterminalS.startState = rsmState0
425449

426450
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
427-
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState0))
428451
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState0))
429-
rsmState0.addTerminalEdge(
430-
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState0))
431452

432-
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg2.txt"
453+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg3.txt"
433454
writeRSMToTXT(rsmState0, pathToTXT)
434455
val actualRSMState = readRSMFromTXT(pathToTXT)
435456

@@ -442,10 +463,10 @@ class TestRSMReadWriteTXT {
442463
}
443464

444465
@Test
445-
fun `'reg3' rsm`() {
466+
fun `'rdf_reg4' rsm`() {
446467
val nonterminalS = Nonterminal("S")
447468
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
448-
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isStart = true, isFinal = true)
469+
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)
449470

450471
nonterminalS.startState = rsmState0
451472

@@ -454,7 +475,7 @@ class TestRSMReadWriteTXT {
454475

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

457-
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg3.txt"
478+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/rdf_reg4.txt"
458479
writeRSMToTXT(rsmState0, pathToTXT)
459480
val actualRSMState = readRSMFromTXT(pathToTXT)
460481

@@ -467,33 +488,85 @@ class TestRSMReadWriteTXT {
467488
}
468489

469490
@Test
470-
fun `'reg4' rsm`() {
491+
fun `'c_analysis_reg1' rsm`() {
471492
val nonterminalS = Nonterminal("S")
472493
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
473-
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isStart = true, isFinal = true)
474-
val rsmState2 = RSMState(id = 2, nonterminal = nonterminalS, isStart = true, isFinal = true)
475-
val rsmState3 = RSMState(id = 3, nonterminal = nonterminalS, isStart = true, isFinal = true)
476494

477495
nonterminalS.startState = rsmState0
478496

479-
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type"), head = rsmState0))
480-
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))
481-
rsmState0.addTerminalEdge(
482-
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
483-
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
497+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))
484498

485-
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("subClassOf"), head = rsmState1))
486-
rsmState1.addTerminalEdge(
487-
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
488-
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
499+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg1.txt"
500+
writeRSMToTXT(rsmState0, pathToTXT)
501+
val actualRSMState = readRSMFromTXT(pathToTXT)
489502

490-
rsmState2.addTerminalEdge(
491-
RSMTerminalEdge(terminal = Terminal("subClassOf_r"), head = rsmState2))
492-
rsmState2.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
503+
assertEquals(expected = rsmState0, actual = actualRSMState)
504+
assertEquals(
505+
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
506+
assertEquals(
507+
expected = rsmState0.outgoingNonterminalEdges,
508+
actual = actualRSMState.outgoingNonterminalEdges)
509+
}
510+
511+
@Test
512+
fun `'c_analysis_reg2' rsm`() {
513+
val nonterminalS = Nonterminal("S")
514+
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true)
515+
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)
516+
517+
nonterminalS.startState = rsmState0
518+
519+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState1))
520+
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))
521+
522+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg2.txt"
523+
writeRSMToTXT(rsmState0, pathToTXT)
524+
val actualRSMState = readRSMFromTXT(pathToTXT)
525+
526+
assertEquals(expected = rsmState0, actual = actualRSMState)
527+
assertEquals(
528+
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
529+
assertEquals(
530+
expected = rsmState0.outgoingNonterminalEdges,
531+
actual = actualRSMState.outgoingNonterminalEdges)
532+
}
533+
534+
@Test
535+
fun `'c_analysis_reg3' rsm`() {
536+
val nonterminalS = Nonterminal("S")
537+
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
538+
539+
nonterminalS.startState = rsmState0
540+
541+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))
542+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState0))
543+
544+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg3.txt"
545+
writeRSMToTXT(rsmState0, pathToTXT)
546+
val actualRSMState = readRSMFromTXT(pathToTXT)
547+
548+
assertEquals(expected = rsmState0, actual = actualRSMState)
549+
assertEquals(
550+
expected = rsmState0.outgoingTerminalEdges, actual = actualRSMState.outgoingTerminalEdges)
551+
assertEquals(
552+
expected = rsmState0.outgoingNonterminalEdges,
553+
actual = actualRSMState.outgoingNonterminalEdges)
554+
}
555+
556+
@Test
557+
fun `'c_analysis_reg4' rsm`() {
558+
val nonterminalS = Nonterminal("S")
559+
val rsmState0 = RSMState(id = 0, nonterminal = nonterminalS, isStart = true, isFinal = true)
560+
val rsmState1 = RSMState(id = 1, nonterminal = nonterminalS, isFinal = true)
561+
562+
nonterminalS.startState = rsmState0
563+
564+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("a"), head = rsmState0))
565+
rsmState0.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))
493566

494-
rsmState3.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("type_r"), head = rsmState3))
567+
rsmState1.addTerminalEdge(RSMTerminalEdge(terminal = Terminal("d"), head = rsmState1))
495568

496-
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/reg4.txt"
569+
val pathToTXT = "src/test/resources/cli/TestRSMReadWriteTXT/c_analysis_reg4.txt"
497570
writeRSMToTXT(rsmState0, pathToTXT)
498571
val actualRSMState = readRSMFromTXT(pathToTXT)
499572

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
StartNonterminal("S")
2+
Nonterminal("S") ->
3+
Nonterminal("S") -> Terminal("a") Nonterminal("S")
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
StartNonterminal("S")
2+
Nonterminal("S") ->
3+
Nonterminal("S") -> Terminal("a") Nonterminal("A")
4+
Nonterminal("A") ->
5+
Nonterminal("A") -> Terminal("d") Nonterminal("A")

0 commit comments

Comments
 (0)