Исправление ошибок в блоке формальных языков

Issue #121 closed
Former user created an issue

Originally reported on Google Code with ID 121

Здравствуйте,
Недавно, в силу необходимости создания хотя бы одного рабочего описания языка влез
в клон Сергея и нашёл некоторое множество ошибок, которые на текущий момент не позволяют
нормальную разработку.

1) Версия language_base.php используемая в репозитории устарела, и не может быть использована
по назначению, более того она содержит ошибку (в require_once, которая была исправлена
затем). Однако в ней сделаны изменения, поэтому необходимо слить её с новой версией.

В block_formal_langs_predefined_language мне, честно говоря непонятно почему создаётся
объект класса _scaner - здесь есть какая-то грамматическая ошибка (ибо сканер по-английски
scanner), а вообще в терминологии принят термин lexer. Олег Александрович, у меня просьба
прояснить ситуацию: это ваше требование или ошибка реализации?

2) В файлах, содержащихся в langs_code/predefined широко используются относительные
ссылки в require_once. В Moodle не используются при кодировании относительные ссылки,
более того, это при внешнем включении в Moodle порождает ошибки (файлы просто не включаются
и выбрасывают Fatal Error).

3) Как я понимаю, в scaners.php содержится код, связанный с общим лексером, задаваемым
пользователем. В случае предопределённого лексера выглядит оптимальным субклассировать
надкласс данного лексера (к примеру для обертки лексера, созданного с помощью JLex).
На текущий момент, это невозможно, приходится субклассировать ваш, Сергей. Олег Александрович,
просьба дать ваш комментарий, мне кажется, что иметь абстрактный класс лексера было
бы неплохой вещью, учитывая что код в конструкторе block_formal_langs_predefined_language
предполагает наличие класса лексера

4) Сам eng_simple_lexer.php помимо общих ошибок содержит переменную debug_mode, которая
задаёт режим отладки. Так вот, её ничем кроме правки кода самого лексера отключить
нельзя. Также текущая реализация неспособна разобрать даже строку "I am error". Я бы
хотел предложить по умолчанию считать строку символов существительных с целью хотя
обеспечить разбор простых тестов. 

5) Также код в данной части вызывает вопрос - вообще может ли лексер бросать исключения?
Или он должен разбирать вообще любой набор символов? Если нет, то почему он бросает
исключения.

Просьба всех кого указал во владельца, прокомментировать ситуацию. Могу в случае недостатка
времени поспособствовать в исправлениях.

Reported by mamontov.dp on 2012-05-03 16:39:28

Comments (5)

  1. Oleg Sychev repo owner

    ``` Сергей, это issue заведено по моей просьбе. По пунктам выше:

    1) Не забывайте вытягивать и сливать изменения из основного репозитория.По терминологии выскажусь позже. 2) Явные нарушения правил кодирования должны быть исправлены. 3) Мне кажется, что необходимо иметь не столько класс, сколько интерфейс лексера и парсера. Сергей, я вам уже давно о них говорю вообще-то... Для всех predefined лексеров/парсеров должен быть общий абстрактный класс с кодом, типовых для данного генератора сканеров/парсеров (т.е. циклом разбора), чтобы не повторять его в каждом классе. Сейчас абстрактный язык вызывает функцию tokenize из лексера, а в классе Си-лексера я ее например совсем не вижу. Это как понимать, Сергей? 4) и 5) Никаких исключений, разумеется выбрасываться не должно - ошибки во введенном пользовательском тексте не должны приводить к исключениям (по крайней мере не отлавливаемым в классе лексера или языка). Для сообщений о лексических ошибках (например 'abcd' на языке Си или abc%^&2fgh в качестве слова на английском языке) за пределы класса языка следует использовать понятие ошибки - lexical error - массив которых заложен в объект потока лексем. С ошибкой должно быть ясное описание, указывающее какая лексема является ошибкой и почему (имя строки в файле языка для predefined, для custom берется из правила лексера, которое ловит ошибку (если такого нет, надо его добавить).

    Лексер английского языка не может понять части речи, там это проблема порядка слов в предложении - т.е. парсинга. Лексер английского языка должен выдавать лексемы типа "слово" "знак препинания" (в т.ч. многоточие или ?! как единый знак) "число". Создайте соответствующие подклассы от token_base. Исключение можно сделать, возможно, для артиклей - это два четко определенных слова, если только у них нет часто используемых других значений.

    И от меня: 6) Сергей, когда будут moodle-unit-tests для сканеров? 7)

    ```

    Reported by `oasychev` on 2012-05-07 22:18:49

  2. Oleg Sychev repo owner

    ``` Вытолкнут рефакторинг базовых классов, обеспечивающий возможность работы со stateless сканерами и парсерами. Так гораздо меньше шансов сделать ошибку и запросить данные не по той строке.

    Введен новый класс обработанной строки, который будет хранить строку, поток токенов и синтаксическое дерево (а также возможно, набор деревьев для парсинга неправильной строки).

    Прошу всех слить изменения из моего клона и доработать свой код соответственно. ```

    Reported by `oasychev` on 2012-05-08 17:21:01 - Labels added: Type-Defect - Labels removed: Type-Review

  3. Oleg Sychev repo owner

    ``` http://en.wikipedia.org/wiki/Apostrophe

    Информация к размышлению по апострофам в английских словах. Они, оказывается, и в конце слова могут стоять :( ```

    Reported by `oasychev` on 2012-08-09 15:35:20

  4. Former user Account Deleted
    Нужно ли это issue далее? Вроде баг с апострофами пофикшен.
    

    Reported by mamontov.dp on 2012-10-26 09:25:23

  5. Oleg Sychev repo owner
    Закрываем.
    

    Reported by oasychev on 2012-10-29 13:39:44 - Status changed: Done

  6. Log in to comment