Skip to content

Commit 5a5d0f5

Browse files
committed
Final preparations
1 parent ad83110 commit 5a5d0f5

File tree

16 files changed

+285
-213
lines changed

16 files changed

+285
-213
lines changed

app/src/main/java/com/apochromat/codeblockmobile/logic/Arithmetics.kt

Lines changed: 62 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ package com.apochromat.codeblockmobile.logic
33
import java.util.*
44
import kotlin.math.*
55

6+
/**
7+
* Функция счета.
8+
* Принимает кучу данных и выражение, возвращает двойку: (Статус, Значение)
9+
**/
610
fun arithmetics(heap: Heap, expression: String): Pair<String, Int> {
711
val exp = expression.replace("\\s".toRegex(), "")
812
if (exp.isEmpty()) {
@@ -19,9 +23,34 @@ fun arithmetics(heap: Heap, expression: String): Pair<String, Int> {
1923
return rpnToAnswer(expressionToRPN(prepared))
2024
}
2125

22-
fun getPriority(token: Char): Int {
26+
/**
27+
* Функция, опредеделяющая переменные и массивы.
28+
* Принимает выражение, возвращает тройку: (Тип/Статус, Название, Индекс)
29+
**/
30+
fun defineInput(heap: Heap, expression: String): Triple<String, String, Int> {
31+
val arr = "[A-Za-z]+[\\[(\\d+_*^#)\\]]".toRegex()
32+
val variable = "[A-Za-z]+[A-Za-z0-9_]*".toRegex()
33+
34+
if (arr.find(expression) != null) {
35+
val (name, index) = indexCount(heap, expression)
36+
if (index == -1) {
37+
return Triple(name, tagNaN(), 0)
38+
}
39+
if (heap.isArrayExist(name) && index >= 0 && index < heap.getArraySize(name)!!.toInt()) {
40+
return Triple(tagArray(), name, index)
41+
}
42+
}
43+
if (variable.find(expression) != null) {
44+
if (heap.isVariableExist(expression)) {
45+
return Triple(tagVariable(), expression, 0)
46+
}
47+
}
48+
return Triple(inputError(), tagNaN(), 0)
49+
}
50+
51+
private fun getPriority(token: Char): Int {
2352
return when (token) {
24-
'#','^' -> 4
53+
'#', '^' -> 4
2554
'*', '/', '%' -> 3
2655
'+', '-' -> 2
2756
'(' -> 1
@@ -30,7 +59,7 @@ fun getPriority(token: Char): Int {
3059
}
3160
}
3261

33-
fun expressionToRPN(expression: String): String {
62+
private fun expressionToRPN(expression: String): String {
3463
var current = ""
3564
val stack: Stack<Char> = Stack<Char>()
3665
var priority: Int
@@ -39,7 +68,7 @@ fun expressionToRPN(expression: String): String {
3968
when (priority) {
4069
0 -> current += expression[i]
4170
1 -> stack.push(expression[i])
42-
2, 3,4 -> {
71+
2, 3, 4 -> {
4372
current += " "
4473
while (!stack.empty()) {
4574
if ((getPriority(stack.peek()) >= priority)) current += stack.pop()
@@ -61,7 +90,7 @@ fun expressionToRPN(expression: String): String {
6190
return current
6291
}
6392

64-
fun rpnToAnswer(rpn: String): Pair<String, Int> {
93+
private fun rpnToAnswer(rpn: String): Pair<String, Int> {
6594
var operand = String()
6695
val stack: Stack<Int> = Stack<Int>()
6796
var i = 0
@@ -88,21 +117,21 @@ fun rpnToAnswer(rpn: String): Pair<String, Int> {
88117
val a: Int = stack.pop()
89118
val b: Int = stack.pop()
90119
when (rpn[i]) {
91-
'^' ->{
120+
'^' -> {
92121
val result = b.toDouble().pow(a).toLong()
93-
if(result>=2147483647){
122+
if (result >= 2147483647) {
94123
return Pair(memoryLimit(), 0)
95124
}
96125
stack.push(result.toInt())
97126
}
98-
'#' ->{
99-
val step =1/a.toDouble()
127+
'#' -> {
128+
val step = 1 / a.toDouble()
100129
val result = b.toDouble().pow(step).toLong()
101130

102-
if (b<0){
131+
if (b < 0) {
103132
return Pair(negativeRoot(), 0)
104133
}
105-
if(result>=2147483647){
134+
if (result >= 2147483647) {
106135
return Pair(memoryLimit(), 0)
107136
}
108137
stack.push(result.toInt())
@@ -117,10 +146,10 @@ fun rpnToAnswer(rpn: String): Pair<String, Int> {
117146
return Pair(zeroDivision(), 0)
118147
}
119148
}
120-
'%' ->{
149+
'%' -> {
121150
try {
122151
stack.push(b % a)
123-
} catch (e: Exception){
152+
} catch (e: Exception) {
124153
return Pair(zeroDivision(), 0)
125154
}
126155
}
@@ -137,13 +166,14 @@ fun rpnToAnswer(rpn: String): Pair<String, Int> {
137166
return Pair(ok(), stack.pop())
138167
}
139168

140-
fun lineCheck(string: String): Pair<String, Int> {
169+
private fun lineCheck(string: String): Pair<String, Int> {
141170
var str = string.replace("[A-Za-z-+*/0-9()%_^#\\[\\]]".toRegex(), "")
142171
if (str.isNotEmpty()) {
143172
return Pair(unexpectedSymbol(str), 0)
144173
}
145-
val reg = "([-+%#^ ]+[0-9_]+[A-Za-z_]+[0-9]*[-+%*#^ ]*)|(\\b[0-9_]+[A-Za-z_]+[0-9]*)|(\\b[_][0-9]+)".toRegex()
146-
if(reg.find(string)!=null) {
174+
val reg =
175+
"([-+%#^ ]+[0-9_]+[A-Za-z_]+[0-9]*[-+%*#^ ]*)|(\\b[0-9_]+[A-Za-z_]+[0-9]*)|(\\b[_][0-9]+)".toRegex()
176+
if (reg.find(string) != null) {
147177
return Pair(incorrectExpression(), 0)
148178
}
149179
str = string.replace("[A-Za-z-+*/0-9%^#_\\[\\]]".toRegex(), "")
@@ -155,37 +185,37 @@ fun lineCheck(string: String): Pair<String, Int> {
155185
return Pair(ok(), 1)
156186
}
157187

158-
fun preparingExpression(heap: Heap, expression: String): Pair<String, Int> {
188+
private fun preparingExpression(heap: Heap, expression: String): Pair<String, Int> {
159189
var exp = expression
160190
var preparedExpression = String()
161-
val regArr="([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +%*/_#^-]*]".toRegex()
191+
val regArr = "([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +%*/_#^-]*]".toRegex()
162192
var array = regArr.find(exp)
163-
while (array!=null) {
193+
while (array != null) {
164194
val (arrName, arrIndex) = indexCount(heap, array.value)
165-
if(arrIndex==-1){
195+
if (arrIndex == -1) {
166196
return Pair(arrName, 0)
167197
}
168198
if (!heap.isArrayExist(arrName)) {
169199
return Pair(undefinedArray(arrName), 0)
170200
}
171201
val arrValue = heap.getArrayValue(arrName, arrIndex)
172202
var fromArrToNum = arrValue.toString()
173-
if(arrValue!!.toInt() < 0) {
203+
if (arrValue!!.toInt() < 0) {
174204
fromArrToNum = "($fromArrToNum)"
175205
}
176206
exp = exp.replace(array.value, fromArrToNum)
177207
array = regArr.find(exp)
178208
}
179-
val reg="[A-Za-z]+[A-Za-z0-9_]*".toRegex()
209+
val reg = "[A-Za-z]+[A-Za-z0-9_]*".toRegex()
180210
var variable = reg.find(exp)
181-
while (variable!=null) {
211+
while (variable != null) {
182212
if (!heap.isVariableExist(variable.value)) {
183213
return Pair(undefinedVariable(variable.value), 0)
184214
}
185215
val varValue = heap.getVariableValue(variable.value)
186216
var fromVarToNum = varValue.toString()
187-
if(varValue!!.toInt() < 0) {
188-
fromVarToNum= "($fromVarToNum)"
217+
if (varValue!!.toInt() < 0) {
218+
fromVarToNum = "($fromVarToNum)"
189219
}
190220
exp = exp.replaceRange(variable.range, fromVarToNum)
191221
variable = reg.find(exp)
@@ -202,47 +232,26 @@ fun preparingExpression(heap: Heap, expression: String): Pair<String, Int> {
202232
return Pair(preparedExpression, 1)
203233
}
204234

205-
fun defineInput(heap:Heap, expression: String):Triple<String,String, Int>{
206-
val arr="[A-Za-z]+[\\[(\\d+_*^#)\\]]".toRegex()
207-
val variable = "[A-Za-z]+[A-Za-z0-9_]*".toRegex()
208-
209-
if (arr.find(expression)!=null){
210-
val(name, index) = indexCount(heap,expression)
211-
if (index == -1) {
212-
return Triple(name, tagNaN(), 0)
213-
}
214-
if(heap.isArrayExist(name) && index>=0 && index<heap.getArraySize(name)!!.toInt()) {
215-
return Triple(tagArray(), name, index)
216-
}
217-
}
218-
if (variable.find(expression)!=null){
219-
if(heap.isVariableExist(expression)) {
220-
return Triple(tagVariable(), expression, 0)
221-
}
222-
}
223-
return Triple(inputError(), tagNaN(),0)
224-
}
225-
226-
fun indexCount(heap:Heap, arr:String):Pair<String,Int>{
235+
private fun indexCount(heap: Heap, arr: String): Pair<String, Int> {
227236
var array = arr
228237
var index = -1
229238
var arrayName = ""
230239
val reg = "([A-Za-z]+[A-Za-z0-9_]*)\\[[A-Za-z0-9 +*/%_^#-]*]".toRegex()
231240
while (reg.find(array) != null) {
232241
val arg = "\\[[A-Za-z0-9 +*/_%^#-]*]".toRegex().find(array)
233242
arrayName = "[A-Za-z]+[A-Za-z0-9_]*".toRegex().find(reg.find(array)!!.value)!!.value
234-
if(arg!=null) {
235-
val arm = arg.value.replace("[","").replace("]","")
243+
if (arg != null) {
244+
val arm = arg.value.replace("[", "").replace("]", "")
236245
val (status, rez) = arithmetics(heap, arm)
237-
array = array.replace(arm,rez.toString())
246+
array = array.replace(arm, rez.toString())
238247
index = rez
239-
if (!heap.isArrayExist(arrayName)){
248+
if (!heap.isArrayExist(arrayName)) {
240249
return Pair(undefinedArray(arrayName), -1)
241250
}
242-
if (index >= heap.getArraySize(arrayName)!!.toInt() || index<0){
251+
if (index >= heap.getArraySize(arrayName)!!.toInt() || index < 0) {
243252
return Pair(indexOutOfRange(), -1)
244253
}
245-
if(status != ok()){
254+
if (status != ok()) {
246255
return Pair(status, -1)
247256
}
248257
val arrayValue = heap.getArrayValue(arrayName, rez)

app/src/main/java/com/apochromat/codeblockmobile/logic/Assignment.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,29 +14,28 @@ class Assignment : Block() {
1414
type = "Assignment"
1515
}
1616

17-
private fun initVar(){
17+
override fun initVar() {
1818
inputName = inputLeftEdit
1919
inputValue = inputRightEdit
2020
}
2121

22-
fun setBlockInput(_name: String, _value: String) {
23-
inputName = _name
24-
inputValue = _value
25-
}
26-
2722
override fun executeBlock() {
2823
super.executeBlock()
2924
initVar()
25+
// Определяем, что за объект, которому мы будем присваивать
3026
val obj = defineInput(heap, inputName)
3127
name = obj.second
28+
// Отсеиваем ненужное
3229
if (obj.first !in listOf(tagArray(), tagVariable())) {
3330
status = obj.first
3431
return
3532
}
33+
// Высчитываем, что будем присваивать
3634
val calculated = arithmetics(heap, inputValue)
3735
status = calculated.first
3836
if (calculated.first != ok()) return
3937
value = calculated.second
38+
// Присваеваем высчитанное значение либо переменной, либо элементу массива
4039
when (obj.first) {
4140
tagArray() -> {
4241
heap.setArrayValue(name, obj.third, value)

app/src/main/java/com/apochromat/codeblockmobile/logic/Block.kt

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,21 @@ open class Block {
2626
var inputComparator: String = ">="
2727
var indexComparator: Int = 0
2828
var valueVar: String = ""
29-
29+
3030
lateinit var begin: Begin
3131
lateinit var end: End
3232
lateinit var exit: Exit
3333
lateinit var beginElse: Begin
3434
lateinit var endElse: End
3535

3636
var indexListBlocks = 0
37-
lateinit var adapterConsole : ConsoleAdapter
38-
lateinit var adapterBlocks : BlocksAdapter
39-
lateinit var holder : BlocksAdapter.ViewHolder
37+
lateinit var adapterConsole: ConsoleAdapter
38+
lateinit var adapterBlocks: BlocksAdapter
39+
lateinit var holder: BlocksAdapter.ViewHolder
4040
var activity: ProjectActivity? = null
4141

42+
// Флаг. В while, if, if-else заставляет выполниться initVar() единожды
43+
// т.к. он перезаписывает блоки выхода Exit
4244
var flagInit = true
4345

4446
// Ссылки на следующий и предыдущий блоки
@@ -49,23 +51,38 @@ open class Block {
4951
var type: String = ""
5052
var status: String = ok()
5153

52-
// Получить доступ к хранилищу переменных
54+
/**
55+
* Функция, которая дает доступ к хранилищу переменных
56+
**/
5357
fun accessHeap(): Heap {
5458
return heap
5559
}
5660

61+
/**
62+
* Функция, которая инициализирует входные данные из полей
63+
**/
64+
open fun initVar() {
65+
}
66+
/**
67+
* Функция, которая исполняет внутреннюю логику блока
68+
**/
5769
open fun executeBlock() {
5870
status = ok()
5971
}
72+
73+
/**
74+
* Функция, которая запускает выполнение очередного блока
75+
**/
6076
open fun kickRunning() {}
6177

6278
open fun run() {
63-
if (type == "ConsoleInput"){
79+
// Отдельно работаем с выполнением ConsoleInput т.к. он ставит выполнение на паузу
80+
if (type == "ConsoleInput") {
6481
executeBlock()
65-
}
66-
else{
82+
} else {
6783
executeBlock()
6884
when {
85+
// При конце выполнения программы опускаем флаг, разъединяем все блоки, выводим статус
6986
nextBlock == null -> {
7087
isProgramRunning = false
7188
activity?.disconnectAllBlocks()
@@ -75,6 +92,7 @@ open class Block {
7592
status == ok() -> {
7693
callStack.push(nextBlock)
7794
}
95+
// Если произошла какая-то ошибка при выполнении
7896
else -> {
7997
isProgramRunning = false
8098
activity?.disconnectAllBlocks()

0 commit comments

Comments
 (0)