Java - анализ пользовательских функций - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над программой, в которой я хочу, чтобы пользователи определяли простые функции, такие как randomInt(0,10) или randomString(10) вместо статических аргументов.Как лучше всего анализировать и обрабатывать такие функции?

Я не нашел примеров такой проблемы, синтаксический анализатор не должен быть сверхэффективным, его не будут вызывать часто, но в основном я хочу сосредоточиться на хорошей читаемости и масштабируемости кода.

Пример пользовательского ввода:

"This is user randomString(5) and he is randomInt(18,60) years old!"

Ожидаемый результат (ы):

"This is user phiob and he is 45 years old!"

"This is user sdfrt and he is 30 years old!"

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Одним из вариантов является использование Spring SPEL.Но это заставляет вас немного изменить выражение и использовать библиотеку Spring:

Выражение может выглядеть так:

'This is user ' + randomString(5) + ' and he is ' + randomInt(18,60) + ' years old!'

или это:

This is user #{randomString(5)} and he is #{randomInt(18,60)} years old!

или вы можете реализовать свой собственный, используя пользовательский TemplateParserContext.

А вот код:

import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext;

public class SomeTest {

        @Test
        public void test() {
            ExpressionParser parser = new SpelExpressionParser();

            Expression exp = parser.parseExpression(
                "This is user #{randomString(5)} and he is #{randomInt(18,60)} years old!", 
                new TemplateParserContext() );

            //alternative
            //Expression exp = parser.parseExpression(
            //        "'This is user ' + randomString(5) + ' and he is ' + randomInt(18,60) + ' years old!'");
            //    String message = (String) exp.getValue( new StandardEvaluationContext(this) );


            String message = (String) exp.getValue( new StandardEvaluationContext(this) );
        }

        public String randomString(int i) {
            return "rs-" + i;
        }

        public String randomInt(int i, int j) {
            return "ri-" + i + ":" + "j";
        }

    }

Какой бы объект вы ни передавалиStandardEvaluationContext должны иметь эти методы.Я помещаю их в тот же класс, в котором также выполняется выражение.

0 голосов
/ 14 февраля 2019

Вы можете использовать что-то вроде следующего: Предупреждение, я не проверял это.Просто с чего начать

public String parseInput(String input){
    String[] inputArray = input.split(" ");
    String output = "";
    for(String in : inputArray){ //run through each word of the user input
        if(in.contains("randomString(")){ //if the user is calling randomString
            String params = in.replace("randomString(", ""); //strip away function to get to params
            params = in.replace("(", ""); //strip away function to get to params
            String[] paramsArray = params.split(",");  //these are string integers, and could be converted
            //send off these split apart parameters to your randomString method
            String out = randomString(paramsArray); //method parses string integers, outputs string
            output += out + " ";
        }else if(in.contains("randomInt(")){ //if the user is calling randomInt
            String params = in.replace("randomInt(", ""); //strip away function to get to params
            params = in.replace("(", ""); //strip away function to get to params
            String[] paramsArray = params.split(","); //these are string integers, and could be converted
            //send off these split apart parameters to your randomInt method
            String out = randomInt(paramsArray); //method parses string integers, outputs string
            output += out + " ";
        }else{ //if the user is just entering text
            output += in + " "; //concat the output with what the user wrote plus a space
        }

    }
    return output;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...