dimkss
@dimkss

Как решать парсинг строк кода вида «public function integer», «event type string f_function»?

Посоветуйте как парсить код, желательно попроще. Язык неинтересный, похож на Basic немного.
Много объявления вида:
protected function integer f_todo_something (long al_row)
event e_go_somewhere()
constant string DW_REPORT = "d_not_so_cool_report"

В идеале хочется для строки типа
protected function integer f_todo_something (long al_row)

получить результат типа структуры (hashMap, объект, не важно):
type = "Function"
scope = "Protected"
returnType = "Integer"
name = "f_todo_something"
arg1 = "long", "al_row"


Я так понимаю надо копать в сторону AST, может что-то простое есть?
  • Вопрос задан
  • 176 просмотров
Решения вопроса 2
EreminD
@EreminD
Кое-что умею
Что мы можем обобщить:
1. существует порядок. Элементы в последовательности не обязательны, но порядок строгий
Например, protected может и не быть. Но точно не может быть function protected
2. Часть элементов имеет только ограниченный набор значений (scope, type)

Я вижу, примерно, такую логику (ее нужно рисовать, как диаграмму):
1. определяем набор допустимых значений для scope (protected/public/private)
2. берем первое слово строки. смотрим, совпадает ли с одним из вариантов
3. если нет, то scope ставим по умолчанию (public например). А первое слово проверяем на совпадение с множестовм допустимых значений type (function/class/enum/interface).
4. если нет - ошибка парсинга
5. если ошибок не было и значение type еще не определено, значит до этого определялся scope. Поэтому, берем второе слово и проверяем его на множестово допустимых значений type
6. если type уже был определен, проверяем на множество для returnType
7. когда определим все три первых элемента (type, scope, returnType), берем 4й - это имя функции
8. берем значение в (скобках) и делим по делиметру "," - получим массив аргументов
Ответ написан
zagayevskiy
@zagayevskiy Куратор тега Java
Android developer at Yandex
1) Написать грамматику языка, например в форме Бэкуса-Наура.
2) По грамматике построить синтаксический анализатор. Самое простое, что я знаю - метод рекурсивного спуска.
По 2 - можно воспользоваться генераторами парсеров, чем-то типа bison, yacc.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы