Синтаксический анализ cтроки в R
Я написал программу-калькулятор, в которой Пользователь вводит два числа и арифметическую операцию между числами, затем нажимает Enter и получает результат, точнее сделал синтаксический анализ строки, но он не работает. С чем это может быть связано? Также я написал код, чтобы можно было выйти из функции
add<- function(x,y){
return(x+y)
}
subtract <- function(x,y){
return(x-y)
}
div <- function(x,y){
if(y==0){
return("Error")
break
}
else if(y!=0){
return(x%/%y)
}
}
raise_to_degree<- function(x,y){
return(x**y)
}
coren<-function(x){
return(sqrt(x))
}
{
res<-NA
repeat{
print("7.Для выхода из программы нажмити 9", quote=FALSE)
us <-
readline(prompt = ("Enter: ")) #пользователь вводит данные
if(us== 9){
break
}
c_of_user_s <-
unlist(strsplit(us, split = '')) #разбиваем строку
if (is.numeric(result) == TRUE) {
num1 <- result #Грубо вносим result в num1
}
us_chosen_operation <-
c_of_user_string[2] #ищем операцию в введенной строке
operations_vector <-
c('+', '-', '*', '/') #вектор, содержащий операции
choice <- match(us_chosen_operation, operations_vector)
operator <- switch(choice, ' + ', ' - ', ' * ', ' / ', ' ^ ')
result <-
switch(
choice,
add(num1, num2),
subtract(num1, num2),
multiply(num1, num2),
divide(num1, num2)
)
print(paste(num1, operator, num2, "=", result))
Ответы (1 шт):
чем разбирать все ваши логические ошибки (типа отсутствия присвоения ключевым переменным num1 и num2), просто переписал без них и более компактно:
repeat {
readline(prompt = "введите выражение или 0 для выхода: ") -> ввод
if (ввод == "0") { break }
unlist(strsplit(ввод, split="")) -> массив
as.numeric(массив[1]) -> число1
массив[2] -> операция
as.numeric(массив[3]) -> число2
switch(операция,
'+' = число1 + число2,
'-' = число1 - число2,
'*' = число1 * число2,
'/' = число1 / число2,
'^' = число1 ^ число2,
'неизвестная операция'
) -> результат
# альтернативный вариант вместо switch:
# do.call(операция, list(число1, число2)) -> результат
cat(число1, операция, число2, "=", результат, "\n")
}
ну а вообще для синтаксического разбора лучше использовать подходящие инструменты. например, связку lex и yacc (альтернатива от проекта gnu: flex и bison).
на языке r эта связка реализована в пакете rly. кстати, прямо в readme там приводится пример реализации как раз калькулятора.