Полная грамматика, которую я намерен реализовать, выглядит примерно так:
- Код: Выделить всё
КОНЕЦ
ВЫВОД КОНЕЦ
Логика ВЫВОД КОНЕЦ
Логика ВЫВОД [ Логика ВЫВОД ] КОНЕЦ // [ ... ] - поддерживается одна и боле операций в строке
ИМЯ := Логика ВЫВОД [ ИМЯ:= Логика ВЫВОД ] КОНЕЦ
Логика:
Логика ( < | > | <= | >= | = | <> ) СложВычит
СложВычит: // оператор+(), оператор-()
СложВычит + УмножДелен
СложВычит - УмножДелен
УмножДелен: // оператор*(), оператор/()
УмножДелен / ВозвСтепень
УмножДелен * ВозвСтепень
ВозвСтепень: // оператор^()
ВозвСтепень ^ Факториал
Факториал: // ()!
ОсновныеОпер!
Список: // оператор,()
Логика
Список , Логика
ОсновныеОпер:
ЧИСЛО // десятичное число формата: n.nn[(E|e)(+|-)nn]
ИМЯ // константа или переменная
ИМЯ( Список ) // вызов функции
- УмножДелен
( Логика ) // вот здесь нужна рекурсия
[ Список ] // многомерный вектор
Это калькуляторная грамматика, которая поддерживает переменные. Цель же вообще, парсить конфигурационные файлы своей своей собственной грамматики. Когда в приложении становится много элементов данных, то наступает момент написания такой вещи, либо использования XML и подстраивания под этот формат. XML, к сожалению, умеет далеко не всё.
Если там кому надо, то можно и командный интерпретатор сделать с параметрами.
Вопросы:
- там нужно правильно вставить вызов исключительных ситуаций (они закомментированы), не знаю как это сделать в бейсике
- код портирован с Java2ME, потому общие конструкции прямо переделаны на бейсиковские, может быть что-то можно сделать проще и быстрее?
Пожелания, предложения? Код будет на русском, т.к. это мой код. Если перепишите на английский то же самое - это уже будет ваш код со всеми вытекающими.
Полный код парсера на яве есть в архиве: Parser.java. Как увидите, там всё то же самое.
П.С. Последнюю версию скачивайте из репозитория системы контроля версий SVN.
Обновления смотрите на svn: https://mysvn.ru/cop/Parser/ (это открытый доступ через http)
Анонимам свободный доступ на чтение (это вводить в TortoiseSVN в поле адреса): https://Anonymous@mysvn.ru/cop/Parser