tyomitch писал(а):Гениально. Такое описание языка называется грамматикой. (Она может быть рекурсивной и в этом принципиально сложнее регэкспа.)
Для грамматик есть стандартные форматы, и есть "общепринятые" тулзы, которые по грамматике генерируют парсер.
tyomitch писал(а):Я свой "универсальный парсер", слава богу, не писал. Взял готовый с полки, когда писал недо-компилятор недо-бейсика.
бэйсика еще валяется на полке?tyomitch писал(а):Тем не менее, курс парсинга у меня за плечами есть, и как примерно работают такие парсеры, -- я представляю себе.
tyomitch писал(а):Уверяю, там всё гораздо интереснее, чем в типичных дилетантских поделках из Split/Mid, вороха условий, и рулона изоленты, чтобы всё не развалилось.
Это я к тому, что написание парсера стоит начинать с теории.
Хакер писал(а):Дело в том, что многие языки настолько сложны (в плане грамматики), что не могут быть описаны такими вот правилами. А то, что описываешь ты, по сути — регулярные выражения.
Хакер писал(а):Но на деле же оказывается, что большинство языков нельзя разобрать используя regexp-ы. Более того, то, что ты сейчас написал, вызывает подозрение о неполном знании SQL (это не упрек, я его, например, тоже не досканально знаю).
Хакер писал(а):Разбиение — это очень сложно. Чтобы правильно разбить, нужно обработать полностью.
Хакер писал(а):Вот например VB-код. Чтобы разбить его на statement-ы, нельзя просто взять и сделать Split(..., vbCrLf). Во-первых, vbCrLf не всегда означает конец statement-а, если перед CRLF стоит символ _ , то данный CRLF не является концом Statement-а. Во-вторых, Statement заканчивается не только на CRLF, а ещё двоеточие может разделять statement-ы.
Предположим, у нас VB-шный сплит понимал бы рег. выражения. Но мы всё равно не могли бы заюзать (\r\n|:) в качестве разделителя. Потому что двоеточике не всегда однозначно делит два statement-а. Оно может быть элементом конструкции := (при передачи некоторых именованых аргументов), оно может быть концом метки, не говоря уже о том, что оно может находиться внутри строки.
Возвращаясь к CRLF, то там символ _ будет подавлять CRLF только в том случае, если это отдельный символ, а не часть идентификатора (например CallMe_ ).
SLIM писал(а):В остальном - имея универсальный парсер, недалеко и до анализа синтаксиса, орфографии, лексики и т.д. своего компилятора например. Или например той же СУБД. Это уже 1\4. А я как говорил хотел бы диплом написать....
tyomitch писал(а):Разница в том, что в продвинутых институтах свой компилятор -- это не диплом, а обязательная работа на зачёт по одному из курсов
tyomitch писал(а):Написать нормальный унипарсер всем форумом было бы весьма интересно
tyomitch писал(а):Так что, начинай
Обсуждение уже есть.
Если будут предметные вопросы, охотно поддержу.
Zenitchik писал(а):и чую, что на верном пути.
Zenitchik писал(а):Жаль, не придумал, как граф переходов в коментарии засунуть Обошелся нотацией.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71