@@ -3,6 +3,10 @@ package com.apochromat.codeblockmobile.logic
33import java.util.*
44import kotlin.math.*
55
6+ /* *
7+ * Функция счета.
8+ * Принимает кучу данных и выражение, возвращает двойку: (Статус, Значение)
9+ **/
610fun 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)
0 commit comments