需要自定义表达式的摩纳哥编辑器

Need Monaco Editor For Custom Expression

我正在寻找一个 monaco 编辑器 language/configuration 来制作一些非常定制的东西。 我一直在玩自定义语言的编辑器游乐场:https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-custom-languages,但还没有完全接近我的需要。

我基本上想要一个单行表达式编辑器,用户可以从一组有限的已知函数中输入项目,并利用现有参数列表 and/or 文字。

几乎类似于 Excel 中的公式框,但突出显示 known/unknown 个单词,作为无效语法的一般突出显示。 需要允许嵌套评估

例子: 这应该是允许的:

ADD(1, AVG(1, 2, 4)-5*(STDDEV(@Param1, @Param2))

这应该显示为错误,“Foof”以红色突出显示,因为它不在允许列表中:

Foof(1, 2) 

我现在不太担心类型检查(将 string 添加到 bool 到 int),但如果合并的话会有好处。

ADD、AVG、STDDEV 均来自已知列表。所有其他关键字(如果我们从现有的语言定义开始)都需要被禁止。

不想支持完整的 C# 样式语法。不允许代码块 {}。 可以允许数组语法 []。

Add(@SomeParamArray[5], @SomeParamArray[6])应该是允许的。

谢谢!

这是一个非常广泛的问题,因此对于像 Whosebug 这样的问答网站来说不是很有用。尽管如此,让我为您提供一些关于摆在您面前的道路的要点:

  • 使用 Monarch 语法定义定义您的自定义语言,如 language contribution。在 monaco-editor NPM 包中,在 monaco-editor/esm/vs/basic-languages/javascript 文件夹中查看语言贡献和定义文件的示例。
  • 在摩纳哥注册:
        languages.onLanguage(msg.id, () => {
            msg.loader().then((module: any) => {
                languages.setMonarchTokensProvider(msg.id, module.language);
                languages.setLanguageConfiguration(msg.id, module.languageConfiguration);
            });
        });

msg代表定义您的语言扩展点的变量:

export const msg: languages.ILanguageExtensionPoint & { [key: string]: any} = {
    id: "msg",
    extensions: [".msg"],
    aliases: ["MSG"],
    mimetypes: ["text/msg"],
    loader: (): any => import("./msg"),
};
  • 创建一个可用于检查输入语法的解析器。使用它来添加 monaco-editor 装饰以标记语法错误。

  • 可选择创建代码完成、悬停和签名帮助提供程序,以支持用户使用您的自定义语言进行输入。