|
|
|
sandello |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Для валидации запросов понадобилось разработать простенький язык. Запрос представляет собой список пар "атрибут=значение"
Что хочу получить - сам представляю. Осталось формализовать это в виде БНФ а потом настроить javacc На текущий момент удалось сделать следующее expression::= exist | equal | alternation | sequence | negation | '(' expression ')' alternation::= expression '|' expression sequence::= expression '&' expression negation::= '!' expression exist::= '?' attribute -- по идее проверяет наличие атрибута в запросе. equal::= attribute '=' value attribute::= 'attr_name0' | 'attr_name1' | ... -- список имеющихся атрибутов value::= '"' atom '"' -- по идее, value должно содержать описание java regex, для него разбор не надо проводить atom::= liter [ atom ] liter:= любой символ кроме " Что-то нужно поправить? Вопрос по теории: что из выше перечисленного является терминальными символами, а что нет? Если я правильно понял теорию: терминальные - это value и attribute. Как можно описать приоритет операторов. Хотелось бы получить (по убыванию): =,(), !, &, | Это сообщение отредактировал(а) sandello - 26.10.2005, 13:12 -------------------- |
|||
|
||||
setq |
|
|||
Unregistered |
если я хорошо помню, то терминальные, это те, которые возвращает lex-анализатор. ну там, строки, имена, числа, разные спец. символы.
|
|||
|
||||
allex |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 59 Регистрация: 5.9.2005 Репутация: нет Всего: нет |
sandello
1. Надо избавиться от левой рекурсии. Одновременно появится и приоритет операторов. 2. С JavaCC я давно ушел на ANTLR. На сайте www.antlr.org есть документация и примеры. Терминалы - грубо говоря, всё, что не правила. Часть терминалов имеет фиксированный текст (ключевые слова), часть - нет - идентификаторы, например. |
|||
|
||||
sandello |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Что есть "левая рекурсия"? Можешь пример привести? -------------------- |
|||
|
||||
sandello |
|
|||
Опытный Профиль Группа: Участник Сообщений: 295 Регистрация: 18.5.2005 Где: Пермь Репутация: нет Всего: 2 |
Следующая версия описания языка
expression::=altexp altexp::= andexp [ '|' altexp ] andexp::= notexp [ '|' andexp ] notexp::= [ '!' ] bracesexp bracesexp::= '(' altexp ')' | equalexp | existexp equalexp::= attribute '=' value existexp::= '?' attribute attribute::= 'attr_name0' | 'attr_name1' | ... value::= '"' atom '"' atom::= liter [ atom ] liter:= любой символ кроме " забыл добавить. Хотелобы иметь возможноcть использовать разделители в виде пробела (кроме как внутри value) в любом количестве от 0 до * -------------------- |
|||
|
||||
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |