lead-tools / bsparser Goto Github PK
View Code? Open in Web Editor NEW[RIP] Парсер встроенного языка
Home Page: https://lead-tools.github.io/bsparser/
License: MIT License
[RIP] Парсер встроенного языка
Home Page: https://lead-tools.github.io/bsparser/
License: MIT License
Многие части парсера можно существенно ускорить в ущерб читабельности исходника.
Сейчас подписки вызываются по окончании обхода узла обобщенным визитером. Это позволит предоставить полезную информацию (например, статистику по подчиненным узлам) обработчику подписки, но не всегда удобно, так как подписки плагина в этом случае вызываются в обратном порядке обхода дерева (снизу вверх).
Вот такая конструкция вызывает ошибку
#Если Клиент Тогда
ИначеЕсли КакоеТоУсловие Тогда
При трансляции нужно по возможности сохранять исходное форматирование опираясь на эту информацию
Срабатывает через раз зараза
Сделать загрузку метаданных из XML конфигурации.
Парсить по аналогии с обычным If Then. Все возможности это не покроет, но при нормальном стиле кодинга 99.99% будет разбираться без ошибок. Оставшиеся ошибки разбора пусть будут сигналом переписать это дерьмо (любая интерпретация фразы верна)
Для единообразия надо бы переименовать:
Selector -> SelectExpr
SelectorKinds -> SelectKinds
Строки вида:
хранить в AST как выражение, в котором части строки соединяются через виртуальную операцию переноса строки.
Возможна ситуация, когда в одном модуле объявлены переменные с одинаковыми именами:
&AtClient
Var Name;
&AtServer
Var Name;
Сейчас парсер ругается на повторное объявление
Дописать в VisitDesigExpr и VisitTernaryExpr обход селекторов.
Признак Export перенести в Object
Узлы VarDecl и ParamDecl упразднить
В первую очередь в целях автоматического тестирования парсера
http://docs.yworks.com/yfiles/doc/developers-guide/graphml.html
Не знаю что из этого выйдет. Но покрутить граф в Yed должно быть прикольно 😄
Надо таки наверно вернуться к этой заготовке и добить ее 😄
Уже в самом начале стало понятно, что идея с Goto была плохой. Проблема в возвратах из процедур - для них придется городить большой If, в котором будут все возможные места возврата. Вариант рабочий, но дюже некрасивый. Потому я на него забил.
Вызов процедур лучше организовать на состояниях в цикле по аналогии с машиной Тьюринга.
Хз зачем, но сделать не сложно. Будет пруф оф концепт
В AST хранить просто как отдельные операторы/декларации. Это позволит покрыть 99.99% синтаксис и избавиться от проблем типа #55
Анализ областей действия инструкций препроцессора при необходимости можно будет выполнить в визитере
Разбирать только простейший случай, когда строка начинается с SELECT
В процедуре VisitPrepExpr добавлен цикл:
For Each Hook In Visitor.Hooks.AfterVisitVisitPrepExpr Do
Hook.AfterVisitVisitPrepExpr(PrepExpr, Visitor.Stack, Visitor.Counters);
EndDo;
Похоже ошибка, наверное имелось ввиду AfterVisitPrepExpr.
Не переваривает такой код:
SubsystemIndex = ?(SubsystemDescription.Parent = Undefined, RolesTree.Rows, SubsystemDescription.Parent.Rows).IndexOf(SubsystemDescription);
Попробовать переделать с использованием StrFind():
Бакенд должен быть просто разновидностью плагина
Сейчас вылетает ошибка "Expected operand" из-за унарного минуса
Function Foo(Par1 = -1)
Передавать родителя (элемент связанного списка) параметром в хук, чтобы в плагинах была возможность подняться вверх по дереву при необходимости.
В сами узлы добавлять родителя нельзя, т.к. появятся циклические ссылки
Например, есть счетчик Visitor.Info.WhileStmtCount
. При обходе подчиненных узлов цикла While
увеличиваем счетчик на 1. При завершении обхода соответственно уменьшаем счетчик на 1.
Предполагается, что такая информация будет полезна в плагинах. Например, если плагин подписан на узел NewExpr
и распознает создание запроса, то простая проверка Info.WhileStmtCount > 0
позволит выявить создание запроса внутри цикла (пример отстойный, да).
#Использовать
Структура такая
Return Struct("TryStmt",
"Try" // array (one of #Statements)
"Except" // array (one of #Statements)
"Place" // undefined, structure (Place)
, TryPart, ExceptPart, Place);
Сейчас ERP разбирается за 17 минут на ноуте 2.4ГГц (8 параллельных фоновых заданий)
Показатель неплохой, но кажется можно ускориться еще примерно в 2 раза.
Примерно 80% времени парсер тратит на разбор выражений, которые сейчас разбираются классическим рекурсивным спуском. Рекурсивный спуск требует большого количества вызовов функций, а это не дешево. Дешевле было бы выполнять разбор выражения по возможности в рамках одной функции.
Придумал вчера алгоритм разбора бинарных выражений со сложностью примерно O(n^2) который выполняется быстрее рекурсивного спуска по крайней мере на типовом размере выражений (0-3 оператора). Но выигрыш в целом небольшой, т.к. львиная доля затрат разбора в текущей реализации падает на анализ указателей(DesigExpr) и селекторов(SelectExpr).
Нужно попробовать унифицировать структуру выражений так, чтобы большая часть выражений была бинарной и пригодной для общего алгоритма. Грубо говоря все сводится к избавлению от сущностей DesigExpr и SelectExpr
Еще можно попробовать алгоритм сортировочной станции. Возможно он даже эффективнее, т.к. O(n).
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.