Опробуйте. Изменённый (для учебных целей) сканер/парсер из 1.6-rc6. Изменения выделены цветом.
Вроде как получилось. Строгой проверки нет, но для учебных целей должно хватить... Схематичное описание внизу PrivCPIndentDev: немного слов+пометки в грамматике.
Вложение:Комментарий к файлу:Tools->Decode
CPIndents.txt[129.94 КБ]
Скачиваний: 981

Ставит ошибку 1000, если строка со значимыми литерами начинается не с табов; ошибку 1001, если отступ перед терминалом не правильный.

Сам проверять сейчас не могу, моск в ступоре...

Добавка:
27.03.2010: Внёс (те же самые) изменения в сканер/парсер 1.5
... 16:03 Исправил ошибку:viewtopic.php?p=45119#p45119. (были пропущены два места в парсере где распознавался RECORD)

02.04.2010:
Пропускаются объявления в строке с CONST, VAR, TYPE.viewtopic.php?p=45437#p45437
Забытая ранее проверка IMPORT сделана аналогично...

14.04.2010:
Составные операторы IF (без ELSIF), WHILE, REPEAT, содержащие только простые (присв.; вызов процедуры; RETURN, EXIT) разрешается записать в одну строку. (Имеется ввиду введённая строка - до явного разрыва по enter, а не сформированная по ширине страницы наборщиком TextSetters.Setter).
Сделана проверка отступов для RETURN, EXIT