gpt4 book ai didi

language-agnostic - 为自动完成场景表示语言标记的最佳方式

转载 作者:行者123 更新时间:2023-12-04 16:54:44 24 4
gpt4 key购买 nike

正如你们中的一些人所知,我正在开发自己的 IDE。你可能会想“哦不,再来一个?!” - 别担心,没有人强制你使用它,我怀疑它无论如何都会被认真发布。

所以,继续讨论主要问题。我正在尝试实现一个自动完成系统。确切的用户界面不是问题。 但是,以灵活的方式存储语言/库标记是我的主要问题。

假设我们向用户建议 CSS 选择器或属性。我们会有类似的东西:

- css/core
- a // anchor tag
- etc // all valid html tags
- .stuff // class name parsed from user project
- ?etc // more stuff parsed from user project (ids, classes...)
- css/properties
- border // regular css properties - we also need to associate
// <border-style> and <color> value tokens
- etc // the rest of them
- css/values/border-style // property value tokens
- solid
- dotted
- css/values/color
- red
- green
- fucshia

所以每个 token 都有一个命名空间,这样我们就可以在 token 之间进行跟踪。与 BNF 类似,一些标记值由子标记组成,例如边框和颜色的大小写。

1. 不要忘记我们需要存储任何可能与具有奇异语法的语言相关的内容。 2. 此外,重要的是要注意,我需要以某种方式将上述信息与上下文相关的信息合并,例如从项目文件中收集的类名列表。这应该是快速有效的,不会导致任何重复的 token 等。

所以,总而言之,这里的事情非常复杂,老实说,我想不出一种方法来获得一个通用和灵活的解决方案。请记住,IDE 应该适合任何类型的语言,这使得这变得更加复杂。

我不确定这个问题是否更适合,例如 programmers ,所以我会留给模组来决定。

最佳答案

我在一个名为 SharpDevelop 的 IDE 上工作。 .在讨论存储问题之前,让我先进行更一般的讨论。

我认为您无法以通用方式正确解决自动完成问题。大多数 IDE 通过为每种语言提供一个插件来支持各种语言,并且完全由插件根据光标在文档中的当前位置来确定完成列表的外观。

IDE 仅提供插件实现的简单接口(interface)。例如,IDE 中显示自动完成的代码可能如下所示:

getAutocompletionList(editor) {
plugin = editor.languagePlugin;
plugin.getAutocompletionList(editor.cursorPosition, editor.parsedDocument);
}

一个 CSSLanguagePluginPHPLanguagePlugin然后会有完全独立的 getAutocompletionList 实现。 - 一个在编辑 CSS 时使用,另一个在编辑 PHP 时使用。

正如其他人指出的那样,光标周围的上下文很重要。例如,在编辑以下 CSS 时:
h1 {
text-align: <cursor>

上下文将是:
[cssTopLevelContext] {
[cssPropertyContext]: [cssPropertyValueContext]
}

CSS 插件的实现将执行以下操作:
// CSSLanguageBinding
getAutocompletionList(cursorPosition, document) {
completionContext = this.getCompletionContext(cursorPosition, document);
// completionContext is {
// 'name': 'cssPropertyValueContext',
// 'propertyName': 'text-align'
// }
return this.completionDatabase.getCompletionList(completionContext);
// returns ['left', 'center', 'right'];
}

现在我们来回答您的问题 - 完成数据库。同样,它可能(并且可能应该)是针对不同语言插件的不同实现——在 PHP 中,您使用类、方法和变量,并且必须关心可见性(私有(private)、公共(public)、 protected )。在 CSS 中,您使用标签、类和属性。

正如您正确指出的那样,完成数据库应包括:
  • 常用 token
  • 当前项目导入的 token
  • 当前项目本身中的 token

  • 在 SharpDevelop 中,没有“通用标记”部分,因为任何项目都会导入标准库,因此在打开项目时分析所有导入的库就足够了。

    在 PHP 中你可以做同样的事情,你可以为已经看到的库缓存 token 数据库。

    现在我们来看看存储格式。要在 PHP 中提供自动完成功能,您需要知道当前类、它的基类和接口(interface)层次结构、所有基类和接口(interface)中的方法及其可见性、当前上下文中可见的变量及其类型(在 PHP 中并不总是可能)和很快。

    出于这个原因,我认为关系数据库不是一个好的选择。您将如何在其中存储所有类、接口(interface)和方法并导航继承层次结构? SharpDevelop 将所有这些作为对象模型存储在内存中(类具有基本类型、接口(interface)列表、成员列表等)。 8000 项并不是一个很大的数字,如果您将 8000 项存储在关系数据库中,那么它会非常小,以至于数据库引擎无论如何都会将它们全部保存在 RAM 中。

    SharpDevelop 将所有完成信息保存在内存中,当您在 SharpDevelop 中打开一个 700K 行的项目时,内存消耗仍然很低。我建议您在打开项目时初始化自动完成数据结构并将它们保存在内存中。正如其他人所说,您必须在用户键入时在后台更新它们(引入新方法、重命名字段等)。

    这就是PHP。对于 CSS,类似于您在问题中概述的数据结构似乎非常合理。您可以在 IDE 启动/打开项目/打开第一个 CSS 文件时将其从结构化文件加载到内存中。

    作为结束说明,为 CSS 实现良好的自动完成应该不难。对于 PHP,这将更加困难,您可以从简单的事情开始 - 提供标准库中的 8000 个 token ,并提供用户在项目其他地方键入的单词。这种方法被 Sublime Text 之类的编辑器使用,并且效果出奇的好。

    关于language-agnostic - 为自动完成场景表示语言标记的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10889075/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com