Многие думают, что поскольку КОБОЛ стар, это должно быть просто ... Плохое предположение. по факту
Разбор COBOL совсем не тривиален. Вы можете подумать, сканируя программу на COBOL, чтобы
идентифицировать только
PARAGRAPH
имена не должны требовать полноценного парсера --- но он будет иметь свой
вызовы. Одно только регулярное выражение не подходит для этой задачи.
Вот несколько советов и вещей, о которых следует знать:
PARAGRAPH
имена могут встречаться в других местах, кроме PROCEDURE DIVISION
. Основан
на имена, приведенные в вашем вопросе, я подозреваю, что вы должны только проанализировать
PROCEDURE DIVISION
программы. Это последний отдел традиционного
Программа COBOL (при условии, что программа не содержит вложенных программ).
Если вам нужно проанализировать OO COBOL или вложенные программы COBOL, вам понадобится
более продвинутые методы разбора
чем может предоставить Regex.
- Ограничьте ваш анализ текстовыми файлами, содержащими отдельные программы. Можно
закодировать несколько независимых программ в одном источнике, но обычно это не так
готово, поэтому поймите, что вы, вероятно, не справитесь с этим изящно.
- Для программ COBOL фиксированного формата (кодирование старого стиля) вы можете положиться на то, что
PARAGRAPH
имена начнутся где-то между столбцами с 8 по 11.
- Для фиксированного формата COBOL вам нужно игнорировать любой текст, появляющийся в столбцах с 1 по
6 и от столбца 73 до конца строки.
- Для фиксированного формата COBOL - любая строка, содержащая символ, отличный от пробела или дефиса
в столбце 7 следует игнорировать (это строка комментария или отладки).
- Если программа содержит директивы
COPY
или REPLACE
в PROCEDURE DIVISION
,
Ваш анализ будет неполным и / или неточным. COPY
потенциально может
ввести дополнительный исходный код, содержащий названия абзацев и REPLACE
директива может изменять имена последующих абзацев во время манипулирования текстом
фаза компиляции (то есть скомпилированная программа может иметь имена, отличные от
тот, который вы обнаружите). Это не обычная практика, но вы должны знать о ней.
- Строки продолжения могут действительно испортить простой текстовый сканер, потому что один COBOL
Слово (например, название абзаца) может быть разбито на несколько строк исходного текста. Однако в
в случае имен абзацев для них не является распространенным явлением
линии.
- Символы запятой (",") и точки с запятой (";") являются "шумом" и могут появляться почти
везде, где может быть место (по крайней мере, в разделе ПРОЦЕДУРА). Вы
может заменить их пробелами для упрощения
последующий анализ.
- Цитированный текст. КОБОЛ имеет несколько интересных соглашений о цитировании, особенно когда
Текст в кавычках занимает несколько строк исходного текста. Правила цитирования и продолжения текста
для кобола не похожи ни на какие другие
язык, с которым вы, возможно, знакомы, - и создает настоящие головные боли при разборе. я не
даже собираюсь начать объяснять их здесь!
Как распознать имя PARAGRAPH
в разделе «Процедуры» программы COBOL?
Просто, просто ищите одиночные «слова», разделенные точками («.»). Название абзаца одно
слово (может содержать дефисы, буквенные и / или цифровые символы) и всегда предшествует
период и сопровождается периодом. Могут (или не могут быть) пробелы до или после
каждый из периодов.
Теперь мне кажется, что если вы хотите идентифицировать PARAGRAPH
имена, вы, вероятно, хотите
определить SECTION
имена тоже. SECTION
имя похоже на PARAGRAPH
имя, за исключением того, что
за ним следует обязательное зарезервированное слово SECTION
и, необязательно, PRIORITY NUMBER
. PRIORITY NUMBER
больше не используется (на самом деле
устарела), поэтому вам, возможно, не придется иметь с ними дело.
Несколько некорректный, но разумный процесс определения названий абзацев COBOL
Это не одно регулярное выражение, а процесс, включающий несколько регулярных выражений и / или
текстовые манипуляции.
- Предположим, фиксированный формат COBOL
- Исключить весь цитируемый текст. Не сложное предложение для простого текста, нокогда задействованы линии продолжения, становится довольно сложно.Если задействованы директивы COPY / REPLACE - забудьте об этом!
- Исключите строки комментариев (т.е. столбец 7 содержит звездочку)
- Удалите столбцы с 1 по 7 и 73 до конца строки
- Удалить весь текст перед словами "PROCEDURE DIVISION"
- Заменить все вхождения запятой и точки с запятой одним пробелом
- Извлечь весь текст между точками (".")
- Если извлеченный текст содержит одно слово, то это имя
PARAGRAPH
. - Если извлеченный текст содержит два слова, а второе слово - «РАЗДЕЛ», то первоеслово - это имя
SECTION
.
Вышеприведенное не является доказательством недосказанности, но должно быть достаточно для определения названий абзацев и разделов в большинстве программ на языке COBOL "Разнообразие садов".Желаю тебе удачи.