LingFeng-bbben / MajdataView

Next-generation Simai: Note disgner for maimai. The unity viewer part of the Majdata.
GNU General Public License v3.0
307 stars 35 forks source link

语法解析重构 #120

Open Moying-moe opened 10 months ago

Moying-moe commented 10 months ago

Where?

MajdataEdit

New Feature Request

Feature background

当前语法解析引擎较为破旧,健壮性差,难以维护扩展。需要对其进行重构以提升其健壮性、规范性。

Goals

What we need

目前所做的早期实验均基于Python的lark模块,暂时不知道.NET下有什么好用的可以用EBNF解析抽象语法树的库。如果找不到的话就只能利用python生成一个命令行工具来做了,性能可能会有损失。不过可以通过异步/多线程解析来削弱这个问题。

Moying-moe commented 10 months ago

一些实验

从谱面文本到目标数据的路径是这样的:

+--------------+  Parser  +-----+  Preprocessing  +------------+
| chart string | -------> | AST | --------------> | chart json |
+--------------+          +-----+                 +------------+

Parser已经写了一个出来,目前已经处于可用状态,但是存在以下问题:

  1. 语法太碎太多,不太好维护
  2. 生成出来的语法树非常高,不太好做预处理
  3. 效率太低,1200note大概要2000ms左右

主要问题就是语法做的太深,一个note可能就有个三四层,并且每次都是直接把整个铺面全解析一遍,就会很慢。语法规则的细节也没优化。

目前大概想了一下优化思路:

  1. 分段式Parser。不追求一次把整个谱面全解析下来,而是先解析成若干段,再对note做解析。这个思路有点类似于maiconverter的。这还有个好处是未来可以做增量解析,彻底解决大谱面的解析问题。
  2. 简化规则。通过牺牲一定的语法规则可读性来提升性能。

不过说实话这玩意到底效率能做到多高,心里也是没底的……我是希望能做到1000note的文件在300ms的耗时,这样加上异步解析就几乎可以做到用户无感知了。

xjrjyy commented 2 months ago

在写 maidata-rs,已经支持大部分语法,速度非常快(解析全部官谱只需要 3s,使用时完全无感),支持部分的错误恢复。demo

有几个问题: