GithubHelp home page GithubHelp logo

expertsystem's People

Contributors

nuc134r avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

expertsystem's Issues

Будет свой парсер!

По ходу написания конечного автомата начали возникать проблемы с "оставленными на обдумывание потом" операторами типа И, ИЛИ и НЕ. Например, не ясно как при текущей реализации их объединять в группы с помощью круглых скобок и придерживаться порядка приоритета на этапе вычисления.

Было решено отказаться от конечного автомата и выйти на один уровень абстракции вверх, написать парсер, независимый от конкретной грамматики.

Перейти к этому помогла следующая статья:

Implementing Programming Languages Using C# 4.0

Курсач. Начало.

Я создал репозиторий около месяца назад. Началу написания кода предшествовал этап осмысления поставленной задачи. Было проведено много времени за чтением статей об экспертных системах, двоичной логике, алгоритмах поиска решений, искусственном интеллекте и языке Prolog.

Практически сразу был выбран язык C# и среда .NET. С ней я знаком достаточно давно и у меня было желание разобраться в ней на более продвинутом уровне. В качестве презентационного фреймворка был выбран WPF. Он пришёл на смену устаревшему Windows Forms и предлагал гораздо более широкие возможности для построения пользовательского интерфейса. Я, признаюсь, готов потратить много времени, продумывая цветовые акценты элементов управления и анимационные переходы между экранами программы, что очень увлекательно делать в WPF.

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

Первые проблемы были связаны с компонентом для отображения исходного кода. Выбран был RichTextBox, так как он позволяет реализовывать выделение различными цветами участков текста, что обязательно пригодится при реализации подсветки синтаксиса. Сразу стало ясно что потребуется нумерация строк. Был создан второй компонент RichTextBox, в котором нумеровались строки первого компонента. Вскоре он был заменён на TextBox по причине избыточного функционала RichTextBox. Трудности были с поведением – статичное поле с номерами строк всячески сопротивлялось своей роли и показывало контекстное меню при правом клике и выделялось курсором. Решения были найдены без «костылей», что не могло не радовать.

При нумерации строк был использован код с сайта Code Project для подсчёта количества переносов в строке. Код лицензирован под The Code Project Open License (CPOL) и может быть использован в любых целях, включая коммерческие.

Ещё одна проблема возникла с основным меню. Было принято решение оформлять программу в тёмно-серых тонах, в духе тёмной темы Visual Studio. Компонент Menu предлагает широкие возможности кастомизации за счёт шаблонов WPF, но недостаточные для решения поставленной задачи. В частности, меня не устроил внешний вид меню в тёмных тонах без рамок. Рамки пришлось убрать по причине того, что они не могли быть никакого цвета, кроме как белого, что, очевидно, шло в разрез с цветовым оформлением программы. Кроме того, код скрытия рамок, мягко говоря, не вызывал положительных эмоций. Решение: компонент Menu упразднён, пишется свой компонент для меню в тёмных тонах.

При разработке производится покрытие кода тестами, тесты иногда пишутся по методу TDD.

Не будет свой парсер!

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

Реализованы простые запросы, при наличии факта

Cat(Tom, Black);

Следующий запрос вернёт Истина

Cat(Tom, Black)?

Исходный код был причёсан по шаблону MVVM, причём в качестве Model используются статические классы парсера языка.

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.