У меня идея сразу возникла та же, что и у Евгения - счётчик вложенности, но автомат делать не захотелось на этот случай. Лучше иметь в поле зрения два символа и строить условия по ним. Получился цикл вида ЦД (только общий конъюнкт во внешнем WHILE, а дополнительные - во внутреннем IF; можно нормализовать, но мне кажется, что так даже лучше):

## Код:
```
PROCEDURE Comment;
   VAR c1, c2: CHAR;
      level: INTEGER;
BEGIN
   level := 1;
   R.ReadChar(c1); R.ReadChar(c2);
   WHILE (level > 0) & ~R.eot DO
      IF (c1 = "(") & (c2 = "*") THEN
         INC(level);
         R.ReadChar(c1); R.ReadChar(c2)
      ELSIF (c1 = "*") & (c2 = ")") THEN
         DEC(level);
         IF level > 0 THEN
            R.ReadChar(c1); R.ReadChar(c2)
         END
      ELSE
         c1 := c2; R.ReadChar(c2)
      END
   END;
   IF level > 0 THEN
      Mark("комментарий не завершён")
   END
END Comment;
```


Писал быстро и без проверки, где-то мог мелко ошибиться.

А с Драконом - обычный структурный алгоритм, выход из цикла по одной ситуации; автоматности у меня в решении нет. Всё так же.