Giter VIP home page Giter VIP logo

Comments (15)

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Сделано две вещи:

  1. Все синтаксические токены поименованы по-человечески (локализуемо, см. Grammar.fs - последний аргумент у функций вида createParser).
  2. Сами тексты, которыми парсер оборачивает эти лексемы, тоже настраиваются. Пока сделал простенькую заглушечку: 46d0944

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

Вкратце - у нас на входе есть список всех ошибок, которые были возвращены нашими парсерами: что они ожидали получить, чего не ожидали (такого я пока ни разу не получал, но по идее бывает unexpected token), после каких ошибок произошёл откат. FParsec по умолчанию группирует эти ошибки (типа, expected a or b or c; unexpected d; nested error x; other <System.Object at 0xcafebabe]>), я такого делать пока не стал.

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

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

from lens.

impworks avatar impworks commented on July 22, 2024

Хорошо, пусть будет так. Закрываю.

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Текущая реализация выглядит как-то криво. Надо бы поправить как-нибудь.

from lens.

impworks avatar impworks commented on July 22, 2024

По-моему у нас сейчас все сообщения об ошибках слетели и показывается всегда одно и то же:

System.Exception : At line 2, column 1: Expected newline
Expected end of input
Expected statement

Нормальные сообщения - критически важная штука. Это первое, на что будет смотреть приемная комиссия.

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Нет, ничего не сломалось, так и должно быть. Просто когда парсер видит невалидный исходник - он начинает делать бактрак, пока не докатится до самого корневого узла. Вот и получается, что он не соответствует шаблону "statement". У нас там внутри должны быть сообщения более высоких уровней, так что можно (и нужно) дозаточить.

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Помоги только мне понять, какие сообщения должны быть.

from lens.

impworks avatar impworks commented on July 22, 2024

Начнем с этого:

  • Везде, где не получается распарсить выражение - писать "Expression is expected" в наиболее близком к ошибке месте. Например, 1 + (2 * ???) - у первого вопросительного знака.
  • Везде, где требуется тип - писать "Type is expected".
  • Несовпадающие скобки всех типов - ( ) { } < > [ ]
  • Cтрелка перед телом функции - "Function body is prefixed with ->"
  • Двоеточие перед типом поля структуры - "FIeld name is followed by :"
  • Точка с запятой между элементами инициализатора массива \ списка \ структуры \ кортежа - "Array\tuple... items are separated by ;"

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Столкнулся с тем, что типичный случай "Expected end of input; Expected statement" возникает, когда парсер вообще ничего в исходнике понять не смог. Он пытается пройтись по всем подряд подветкам выражения statement, не видит в них ничего хорошего, и выходит. Иногда он срабатывает нормально (во всяком случае, несовпадение скобок он встречает годным сообщением посреди мусора).

Навскидку пока рассмотрим такое решение:

  • парсер собирает все ошибки, которые ему встретились в процессе парсинга, в специальной структуре;
  • мы начинаем раскручивать эту кучу начиная с выражения, которое добралось дальше всех по структуре исходного файла;
  • по токенам из грамматики можно будет выводить какие-то более-менее понятные сообщения.

from lens.

impworks avatar impworks commented on July 22, 2024

Мне кажется, нужно как-то его надоумить не всегда откатываться назад до самого первого символа. В некоторых случаях тупо выкидывать ошибку прямо на месте. Такие места в грамматике я могу перечислить, если необходимо.

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

Это было бы весьма кстати.

from lens.

impworks avatar impworks commented on July 22, 2024

https://docs.google.com/document/d/1tzF2dFc_93rnLYWfaQB4xgkObhPoafkYkjw5HzDfI5o/pub

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

Синим выделены "хитрые" места, которые следует как-то особым образом учитывать. Например:

  • "Else statement without condition"
  • "Catch statement without try block"
  • "Mismatched paren"
  • В line_expr_3, если распарсилось "not" | "-", первый line_expr_4 также является неоткатываемым

Если что-то придет в голову, тоже запили.

from lens.

impworks avatar impworks commented on July 22, 2024

Да, кстати. Незакрытую кавычку строки и слишком здоровый числовой литерал также стоит отображать.

from lens.

impworks avatar impworks commented on July 22, 2024

Ну и, конечно же, "Inconsistent identation".

from lens.

ForNeVeR avatar ForNeVeR commented on July 22, 2024

В общем, пока что сделал всё возможное для нормального вывода ошибок. Получилось, вроде бы, нормально и локализовано. Со всякими "незакрытыми скобками" пока что заморачиваться не стал. Неужели непонятно, что, если "ожидается символ )" - это значит, что скобка не закрыта?

from lens.

impworks avatar impworks commented on July 22, 2024

Принимается. К версии 2.0 будет рукопашный парсер, в котором отображение ошибок будет улучшено.

from lens.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.