Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Регулярные выражения


Автор: Роман2 5.5.2014, 11:35
На вход программы подается текстовый файл содержащий только описания переменных на Паскале. 
Проанализировать переменные при помощи регулярных выражений и выдать результат проверки о корректности, синтаксической ошибке или дублировании имени.
Я составил блок-схему. Но у меня не получается CASE и цикл в нормальной форме. 
Помогите, пожалуйста!  
Заранее благодарен. Роман.

Автор: Akella 5.5.2014, 12:50
Забыл задать вопрос.

Автор: Poseidon 5.5.2014, 16:12
Без формата текстового файла даже и подсказать нечего.

Автор: Роман2 6.5.2014, 02:48
как составить эту программу?
Текстовый файл:
Цитата

var i1,j2: integer;
r1,r2: real;
st1: string;
st2: string[5];
ar1: array [1..10,1..10] integer;

Автор: Akella 6.5.2014, 09:03
Цитата(Роман2 @  6.5.2014,  02:48 Найти цитируемый пост)
как составить эту программу?


Открываешь Delphi, создаёшь новый проект и пишешь программу.

Автор: Роман2 6.5.2014, 09:15
Допустим я составил программу по открытию файла txt.
Но мне нужно пробежаться по всем строкам через регулярные выражения и проверить, не ошибся ли я в правильности команд и переменных.


Как организовать построчную проверку?
Вначале я думаю нужно /^var/
А дальше?




Вот пример - извлечение чисел из введённой строки.
Код

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  // добавляем нужный модуль
  RegExpr in 'RegExpr.pas';

var
  // нам необходим экземпляр класса TRegExpr
  RegExp: TRegExpr;
  s: string;
  
begin
  // выводим запрос и считываем строку
  Write('Enter a string containing numbers: ');
  Readln(s);

  // создаём объект
  RegExp := TRegExpr.Create;

  // гарантирует освобождение занятой объектом памяти
  try
    // регулярное выражение находится в свойстве Expression
    RegExp.Expression := '-?\d+';
    // ищем первое совпадение с помощью функции
    // Exec(const AInputString : string) : boolean, которая вернет true,
    // если в строке AInputString будет найдено совпадение c
    // регулярным выражением, хранящимся в свойтве Expression
    if RegExp.Exec(s) then
    // если находим
    begin
      Writeln('Entered string contains numbers: ');
      repeat
      // выводим найденное выражение, которое хранится в Match[0]
        Writeln(RegExp.Match[0]);
      // и продолжаем поиск
      until not RegExp.ExecNext;
    end
    else
    // иначе - сообщаем, что ничего не нашли
      Writeln('Entered string contains no numbers!');
  finally
    RegExp.Free;
  end;
  Readln;
end.



M
Poseidon
Пользуйтесь кнопкой user posted image

Автор: Akella 6.5.2014, 10:47
Модератор: пользуйтесь кнопкой КОД!!!!!!!!!!!!!!!!!!!

Добавлено через 20 секунд
Отредактируй своё сообщение.

Добавлено через 42 секунды
читать до просветления http://forum.vingrad.ru/forum/topic-353769.html

Автор: Роман2 6.5.2014, 10:52
Как организовать построчную проверку?
Вначале я написал /^var/
А дальше?
у меня не получается CASE и цикл в нормальной форме

Автор: Poseidon 6.5.2014, 11:41
Цитата(Роман2 @  6.5.2014,  10:52 Найти цитируемый пост)
Как организовать построчную проверку?

Самый простой способ - при помощи TStringList.

Автор: Роман2 6.5.2014, 11:44
Или подскажите, где найти пример и разъяснение, как это сделать...
У меня не получается что-то.

Автор: bems 7.5.2014, 03:49
http://ru.wikipedia.org/wiki/%D0%9D%D0%B8%D1%81%D1%85%D0%BE%D0%B4%D1%8F%D1%89%D0%B8%D0%B9_%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9_%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7, не регулярки

Автор: Роман2 7.5.2014, 11:49
Как нисходящий парсер мне поможет?
Ну, может быть, есть у кого-нибудь идеи?

Автор: Poseidon 7.5.2014, 13:22
Цитата(Роман2 @  7.5.2014,  11:49 Найти цитируемый пост)
Ну, может быть, есть у кого-нибудь идеи? 

Какие идеи ты ждешь? Готовый код? Тебе тут подсказывают как могут, пора и свою голову включать. Начни с того, что справильно сформулируй вопрос. Потому как по фразам 
Цитата(Роман2 @  5.5.2014,  11:35 Найти цитируемый пост)
Я составил блок-схему. Но у меня не получается CASE и цикл в нормальной форме. 
Помогите, пожалуйста!  
Цитата(Роман2 @  6.5.2014,  02:48 Найти цитируемый пост)
как составить эту программу?
Цитата(Роман2 @  6.5.2014,  09:15 Найти цитируемый пост)
Как организовать построчную проверку?
Вначале я думаю нужно /^var/
А дальше?
 Не очень-то и понятно, а что вообще надо? Сначала case приплел, потом какой-то /^var/, потом построчную проверку. Потом пишешь, что нисходящий парсер тебе не поможет. Что надо вообще?


Автор: bems 7.5.2014, 15:30
Цитата(Роман2 @  7.5.2014,  11:49 Найти цитируемый пост)
Как нисходящий парсер мне поможет?
сначала разбиваешь входной текст на лексемы, потом парсишь его сверху вниз. оригинальный паскаль парсился http://ru.wikipedia.org/wiki/LL%281%29, современные диалекты чуть посложнее

Добавлено через 11 минут и 16 секунд
Цитата(Poseidon @  7.5.2014,  13:22 Найти цитируемый пост)
 Сначала case приплел, потом какой-то /^var/, потом построчную проверку
ну case может быть в объявлении рекорда, а вот как в описании переменных может встретиться цикл "в нормальной форме" это да, загадка

Автор: Poseidon 7.5.2014, 16:52
Цитата(bems @  7.5.2014,  15:30 Найти цитируемый пост)
ну case может быть в объявлении рекорда

Case вообще много где может быть в коде, но только каким он боком вообще тут упомянут
Цитата(Роман2 @  5.5.2014,  11:35 Найти цитируемый пост)
Я составил блок-схему. Но у меня не получается CASE и цикл в нормальной форме. 
???

Автор: Роман2 8.5.2014, 02:44
Я написал, что мне нужно Проанализировать переменные при помощи регулярных выражений и выдать результат проверки о корректности, синтаксической ошибке или дублировании имени. (На вход программы подается текстовый файл содержащий только описания переменных на Паскале. )

Затем я написал - что я пробовал многое (/^var/   , пробовал CASE, пробовал цикл   и так далее , но у меня не получилось...)

Автор: bems 8.5.2014, 03:53
Цитата(Poseidon @  7.5.2014,  16:52 Найти цитируемый пост)
Case вообще много где может быть в коде, но только каким он боком вообще тут упомянут
не много где, а только в объявлении переменной-записи, типа-записи (ну с учетом вложенности типов) и на месте где допустим statement. у ТС стоит задача разбирать только секцию var, поэтому понятно что проблема с вариантным рекордом. а вот при чем тут цикл - не понятно



Автор: Роман2 8.5.2014, 04:35
я имел ввиду цикл - как проверять несколько строк? 

Автор: bems 8.5.2014, 07:33
в паскале конец строки это просто разделитель вроде пробела (кроме случаев когда он встречается в однострочном комментарии и внутри строкового литерала). например 
Код

var i: Integer;
это тоже самое что
Код

var
i
:
Integer
;
поэтому рассматривать тут отдельные строки не нужно. смотри на это как на поток символов

Автор: Poseidon 8.5.2014, 10:35
Цитата(bems @  8.5.2014,  03:53 Найти цитируемый пост)
не много где, а только в объявлении переменной-записи, типа-записи (ну с учетом вложенности типов) и на месте где допустим statement.
Действительно, практически не встречается нигде.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)