Подсказки по парсингу строкового выражения?

Я скучал в течение праздничного сезона в этом году и случайным образом решил записать простую библиотеку понимания/фильтрации списка для Java (я знаю, что существуют некоторые большие там, я просто хотел записать это мой сам для ада его).

Для этого списка:

LinkedList<Person> list = new LinkedList<Person>();
            list.add(new Person("Jack", 20));
            list.add(new Person("Liz", 58));
            list.add(new Person("Bob", 33));

Синтаксис:

Iterable<Person> filtered = Query.from(list).where(
    Condition.ensure("Age", Op.GreaterEqual, 21)
    .and(Condition.ensure("Age", Op.LessEqual, 50));

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

Следующий синтаксис является конечной целью:

Iterable<Person> list2 = Query.from(list).where("x=> x.Age >= 21 & x.Age <= 50");

По-видимому, парсинг выражения не является моей самой сильной областью, я испытываю затруднения проанализировать вложенные/несколько условные выражения. Кто-либо знает о некоторых ресурсах/литературе, которые я мог бы найти полезным?

Я только получил единственные условные выражения, успешно проанализированные от Строкового синтаксиса лямбды в данный момент: "x=> x.Name == Jack". Моя базовая структура Выражения довольно тверда и может легко обработать любой объем вложения, проблемой является просто парсинг выражения от строки.

Спасибо

Только для ударов, вот немного понимания относительно того, как структура выражения негласно может работать (очевидно, я, возможно, указал 'op. GreaterEqual', и т.д.... в следующем примере, но я хотел продемонстрировать, как это гибко к любому объему вложения):

Condition minAge1 = Condition.ensure("Age", Op.Equal, 20);
Condition minAge2 = Condition.ensure("Age", Op.Greater, 20);
Expression minAge = new Expression(minAge1, Express.Or, minAge2);
Expression maxAge = Condition.ensure("Age", Op.Equal, 50).or(Condition.ensure("Age", Op.Less, 50));
Expression ageExpression = new Expression(minAge, Express.And, maxAge);

Condition randomException = Condition.ensure("Name", Op.Equal, "Liz");
Expression expressionFinal = new Expression(ageExpression, Express.Or, randomException);
6
задан jdc0589 17 January 2010 в 09:10
поделиться