ропозиція не може складатися тільки з розділових знаків.
Це означає, що деякі знаки пунктуації, якщо вони не будуть віднесені до попереднього пропозицією, можуть залишитися поза пропозицій. Наприклад,
В«Мама мила рамуВ», тут ПРД1 стоятиме на Мама, а не на відкриває лапки.
Насправді, всі подальші аналізатори (постморфологія, синтаксис) використовують у своїй роботі тільки кодла ПРД2, що означає, що текст розбивається повністю, всі рядки виявляються охопленими. Посліду ПРД1 потрібна лише тільки для потреб графематікі. p align="justify"> Визначимо допоміжний примітив IsSentenceEndMark. На вхід подається номер рядка. Функція повертає істину, якщо ця рядок містить символ В»?В», "!В», В».В» Або три крапки
Визначимо допоміжний примітив IsSentenceEndSeq. На вхід подається номер рядка. Функція повертає істину в двох наступних випадках:
1. Якщо для цього рядка вірна функція IsSentenceEndMark; і контактно справа немає закриває лапки (якщо пропозиція Залапковано, закриваюча лапка входить до цю пропозицію);
2. Якщо рядок є закриває лапками, а контактно зліва стоїть рядок, для якої вірно IsSentenceEndMark.
Програма робить наступне:
1. Проходить всі розділові знаки на початку тексту і ставить першому слову кодла ПРД1.
2. Нехай i - поточна рядок між StartPos і EndPos.
. Якщо на рядку i варто посліду початку абзацу, тоді потрібно пройти назад всі прогалини і довгі роздільники (ДЗПР) і дійти до кінця попереднього абзацу. Якщо наприкінці абзацу (до першого слова) стоїть рядок, яка задовольняє IsSentenceEndSeq, тоді потрібно поставити ПРД2 цьому рядку, інакше потрібно поставити ПРД2 на кінець попереднього абзацу.
. Якщо на рядку i варто макросінтаксіческая посліду УП, тоді потрібно зробити те ж саме, що і в пункті 3, тільки треба врахувати, що посліду УП ставиться на кінці абзацу , а не початку (як у пункті 3).
. Якщо до початку поточного пропозицій стояла відкриває дужка, і поточна рядок вказує на слово до соотв. закриває дужки, тоді потрібно поставити ПРД2 на заслони дужку, а поточний рядок змістити на найближчий після закриває дужки слово.
. Якщо поточна рядок задовольняє функції IsSentenceEndSeq і не входить до графематіческіе групи (ФІ1-ФІ2, ДТ1-ДТ2 і т.д.) не останнім словом, тоді проходимо всі розділові знаки від поточного рядка. Перевіряємо, що розділовий знак, який закінчує пропозиції, не повинен стояти на самому початку рядка. Далі шукаємо перше слово від поточного рядка і вважаємо його...