Форум "Проекты"
Проектирование - перед тем как писать код программы...
Автоформатирование кодаЕсть некий структурный язык, который имеет свой набор синтаксических конструкций. Хочется написать утилиту форматирования его кода написанного в произвольном виде (скажем так, чтоб привести гору ранее написанных исходников к какому-то единому стандарту). На входе имеем текстовый файл, на выходе - тот же текстовый файл, но отформатированный согласно созданных правил. В результате преобразования могут: 1)изменится отступы в пробелах и табуляцях, переводы строк 2)изменится регистр (нижний/верхний/смешанный) ключевых слов Я понимаю, вопрос несколько абстрактен, для конкретизации алгоритма можете взять любой известный вам язык. В языке обязательно должны быть ключевые слова, одно- и многострочные комментарии. Структура конструкции может состоять как минимум из одного слова, максимум десяти. Чтобы было понятнее почему ключевых слов в консрукции может быть много, как пример можно рассматривать SQL-запрос который нужно отформатировать и который может содержвть много ключевых слов: SELECT, FROM, WHERE, JOIN, UNION, GROUP, ORDER, BY и т.д. Форматирвоать надо не SQL-запрос, это лишь пример для того чтоб понять, какой может быть конструкция к которой надо применить форматирование. Все ключевые слова структуры обычно идут в перешку с параметрами и операторами, могут иметь вложенные конструкции (тот же запрос может иметь вложенные позапросы). ---------------- Как лучше подойти к решению подобной задачи? Какой алгоритм обработки файла вы бы использовали?
|
|
#1 Mystic © 11.07.07 15:54:23
LEX + YACC |
|
>#1 Mystic © ок, посмотрим какие там возможности кому интересные портированные исходники с C под Turbo Pascal и Delphi - поделюсь ссылочками Turbo Pascal Lex/Yacc ~ag/tply/ Изменение TP Lex & Yacc Delphi Yacc & Lex [1.4] |
|
документацию на русском можно посмотреть здесь Раздел: Программирование/YACC >#1 Mystic © однако, насколькоя понимаю, из этого набора мне достаточно использовать только LEX (лексический анализатор), сам же компилятор (YACC) здесь не при делах. Или я ошибаюсь? LEX чуток описан вот здесь: Лексический анализатор выполняет первую стадию компиляции - читает строки компилируемой программы, выделяет лексемы и передает их на дальнейшие стадии компиляции (грамматический разбор, кодогенерацию и т.д.). lex частично или полностью автоматизирует процесс написания программы лексического анализа. lex - это программирующая программа или генератор программ. lex строит программу - лексический анализатор на так называемом host-языке (или "главном" языке). Это значит, что Lex-программа пишется на "языке" lex, а Lex-генератор, в свою очередь, генерирует программу лексического анализа на каком-либо другом языке. -------------------- ну... и еще.... я так понимаю LEX позволяет одну конструкцию заменить на другую. Это все чудесно, НО. Допустим у меня есть ключевое слово SELECT. Если оно встречается в "корне" программы -- тогда надо сделать отступ в одну табуляцию, если в оно находится в позапросе, то тогда надо вставить две табуляции, если в подзапросе подзапроса -- три. LEX это позволяет? Он может определить сколько и каких внешних конструкций находятся "над" этим ключевым словом? и в зависимости от этого формировать код для компилятора. Грубо говоря ЛЕКсу подсовывается вот такой файл <A_1> <A_2> <B1> <A_2> <B1> </A_1> а он должен выдать вот такой <A_1> <A_2> <B1> <A_2> <B1> </A_1> причем ограничения по вложености конструкций не должно быть 10, 100, 1000 -- неважно, главное, чтоб хватило ресурсов компьютера... реально? LEX сможет? |
|
#4 blackman © 11.07.07 19:34:44
Книга хорошая есть на эту тему |
|
#5 Mystic © 12.07.07 09:24:21
> реально? LEX сможет? Нет, это работа YACC. LEX только разбивает входной поток на лексемы. А уже правила срабатывают в YACC. Хотя возможности только LEX-а можно использовать, но за соответствиями прийдется следить вручную (например, при помощи стека). > Книга хорошая есть на эту тему Это книга мало связана с теорией компиляции это раз. Во-вторых, лично мне она не понравилась---никаких откровений. |
Написать ответ |
|
