Главная Новые темы Список тем Задать вопрос Поиск  

Форум "Проекты"


Проектирование - перед тем как писать код программы...


 #0 Deep © 11.07.07 13:48:32 - 12.07.07 09:24:21

Автоформатирование кода



Есть некий структурный язык, который имеет свой набор синтаксических конструкций. Хочется написать утилиту  форматирования его кода написанного в произвольном виде (скажем так, чтоб привести гору ранее написанных исходников к какому-то единому стандарту).

На входе имеем текстовый файл, на выходе - тот же текстовый файл, но отформатированный согласно созданных правил. В результате преобразования могут:
1)изменится отступы в пробелах и табуляцях, переводы строк
2)изменится регистр (нижний/верхний/смешанный) ключевых слов

Я понимаю, вопрос несколько абстрактен, для конкретизации алгоритма можете взять любой известный вам язык.

В языке обязательно должны быть ключевые слова, одно- и многострочные комментарии. Структура конструкции может состоять как минимум из одного слова, максимум десяти.

Чтобы было понятнее почему ключевых слов в консрукции может быть много, как пример можно рассматривать SQL-запрос который нужно отформатировать и который может содержвть много ключевых слов: SELECT, FROM, WHERE, JOIN, UNION, GROUP, ORDER, BY и т.д.

Форматирвоать надо не SQL-запрос, это лишь пример для того чтоб понять, какой может быть конструкция к которой надо применить форматирование.

Все ключевые слова структуры обычно идут в перешку с параметрами и операторами, могут иметь вложенные конструкции (тот же запрос может иметь вложенные позапросы).

----------------
Как лучше подойти к решению подобной задачи?
Какой алгоритм обработки файла вы бы использовали?

Цитата

 #1 Mystic © 11.07.07 15:54:23

LEX + YACC
 #2 Deep © 11.07.07 17:38:11

>#1   Mystic ©
ок, посмотрим какие там возможности
кому интересные портированные исходники с C под Turbo Pascal и Delphi - поделюсь ссылочками

Turbo Pascal Lex/Yacc
~ag/tply/

Изменение TP Lex & Yacc


Delphi Yacc & Lex [1.4]
 #3 Deep © 11.07.07 18:26:27

документацию на русском можно посмотреть здесь
Раздел: Программирование/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-а можно использовать, но за соответствиями прийдется следить вручную (например, при помощи стека).

> Книга хорошая есть на эту тему

Это книга мало связана с теорией компиляции это раз. Во-вторых, лично мне она не понравилась---никаких откровений.




  • Написать ответ

    Имя: Регистрация HTML?
    smiles смайлики
    Потом перейти в:    
    паутина



      ©  webest.net, 2002-2007  

    top.mail.ru
    » Бесплатный счетчик посещений
    » Рейтинг сайтов