返回顶部
首页 > 资讯 > 精选 >如何理解编程语言的IDE支持
  • 922
分享到

如何理解编程语言的IDE支持

2023-06-16 02:06:31 922人浏览 独家记忆
摘要

本篇内容主要讲解“如何理解编程语言的IDE支持”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解编程语言的IDE支持”吧!语法分析对于开发工具来说,语法分析有几个重要的功能:语法高亮,是指根

本篇内容主要讲解“如何理解编程语言的IDE支持”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解编程语言的IDE支持”吧!

语法分析

对于开发工具来说,语法分析有几个重要的功能:

  • 语法高亮,是指根据术语类别来显示不同的颜色与字体以增强可读性的一种编辑器特性。

  • 实现智能感知

  • 实现跳转和引用分析

从我粗糙的调查来看,大致可以分析为四类:

Sublime Text 基于 YAML 形式的正则匹配方式:Sublime Syntax files

Textmate、VS Code 基于 JSON 的正则匹配方式:Language Grammars

  • 基于语法分析器(如 BNF)生成中间代码

Jetbrins 基于 BNF 生成代码的方式:Grammar and Parser

  • 自制 DSL 进行语法解析

Vim 基于正则 + 自制 DSL:Vim documentation: syntax、Rust 示例

  • 手写解析语法

Eclipse IDE 提供了个 JFace editor,但是似乎是要手写:FAQ How do I provide syntax coloring  in an editor?

EMacs Mode: ModeTutorial

每一类各自有各自的优缺点和编写难度。但是,总的来说,没有一个方式是简单的。

正则实现语法分析

对于正则方式来说,不论是 Sublime Text 还是 Textmate 及基于 Textmate 语法规则的 VS  Code,它们都有一个显著的缺点:长,如 VCode 的java.tmLanguage.json,从长度上来说,我看到的这个版本有 1831  行。表达方式也有些繁琐:

"comments": { "patterns": [ { "captures": { "0": { "name": "punctuation.definition.comment.java" } }, "match": "/\\*\\*/", "name": "comment.block.empty.java" }, { "include": "#comments-inline" } ] },

其中还有各种 include 关系等。对于 Sublime Text 也是类似的:

comments: - match: /\*\*/ scope: comment.block.empty.java punctuation.definition.comment.java - include: scope:text.html.javadoc - include: comments-inline

看了看,是不是会怀疑他们建立了语法同盟。

但是呢,yaml 和 json 是一个编程语言无关的东西。所以,VS Code 和 Atom 可以基于 Textmate  语法规则,快速建立对于主流语言的词法分析,从而建立了语法高亮的支持。

我们也可以说 BNF 是一种编程语言无关的东西。但是,实际上在我们操作的时候,就会加入一些编程语言特定的要素。

语法分析器分析

由于先前编写系统分析工具 Coca 和通用语法分析器 Chapi ,我对于 BNF  的词法也是颇为上手的——实际上不难。唯一麻烦的地方就是,写完之后,我们要编写代码做一些转换,所以让我们来看看 Jetbrians 插件的示例:

COMMENT = 'regexp://[^\r\n]*' BLOCK_COMMENT = 'regexp:[/][*][^*]*[*]+([^' -> channel(HIDDEN); LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN);

然后,就是设计和分析词法了:

functionParameters ::= LPAREN inputParameters RPAREN outputParameters? | IN SUB GT inputParameters | outputParameters

接着,在 idea 里面,我们可以通过这个 BNF 文件生成对应的 Lexer 文件和代码等。对于使用 Antlr 编写的词法来说,Java  部分的代码规模也就在 800 左右。

不过呢,从两者的阅读体验对比来看,显然 BNF 会更加友好一点。

自制 DSL 语法解析

颇为遗憾的是,我尚未写过任何的 Vim 插件,好在我还知道 Vim 是如何退出来的。我使用 Vim 作为 git 的 editor,还熟知一些 Vim  编辑的常用快捷键。所以,语法高亮这一部分主要是参考 Vim 的文档编写和代码示例。这里我找到了一个不错的中文翻译:语法高亮

总的来说,语法规则就是: syn vim关键字 匹配规则,如:

syn region rustCommentLine start="//" end="$" contains=rustTodo,@Spell syn region rustCommentLineDoc start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell syn region rustCommentLineDocError start="//\%(//\@!\|!\)" end="$" contains=rustTodo,@Spell contained syn region rustCommentBlock matchgroup=rustCommentBlock start="/\*\%(!\|\*[*/]\@!\)\@!" end="\*/" contains=rustTodo,

看上去依旧是正则匹配,如 Float:

syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)\=" syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\(f32\|f64\)\=" syn match rustFloat display "\<[0-9][0-9_]*\%(\.[0-9][0-9_]*\)\=\%([eE][+-]\=[0-9_]\+\)\=\(f32\|f64\)"

不过,从算法形式上来说,完胜 Textmate 和 Sublime,毕竟是高级的 DSL。

编程语言语法解析

Emacs 的 mode 里包含了对于语法高亮的处理,于是为了这个高亮,我们需要写写 emacs lisp 代码。如:

(defvar rust-fORMatting-macro-opening-re "[[:space:]\n]*[({[][[:space:]\n]*" "Regular expression to match the opening delimiter of a Rust formatting macro.")  (defvar rust-start-of-string-re "\\(?:r#*\\)?\"" "Regular expression to match the start of a Rust raw string.")

对于 Eclipse 来说,这个过程就更加麻烦了。

语言的高级支持

在我们实现了开发工具的词法分析接口之后,我们就能按不同的  IDE/编辑器所定义的接口,进行定制了。这是一个繁杂,而又充满挑战的工作。对于不同的工具来说,它们的接口相关也甚多。我也并非都能一一了解  API,所以只能简单的以 IDEA 作为一个示例来展示。主要原因大概有两个:1. 我日常使用的是 Jetbrains 相关的 IDE;2.  我已经有一部分代码了。

语法高亮

在进行了复杂的语法分析之后,接着,我们就可以快速进入一个简单的环节,对代码进行高亮。关于高亮的话,我们可以快速进行一个分类:

  • 关键词。即编程语言的关键词,如 C 语言中的 32 个关键词。

  • 标识符。用户定义的字符串,如变量名、结构体名、函数名等等。

  • 特殊词法。

  • 重要的词法。根据需要,可以针对于函数名、静态函数名等进行标识,以提升识别度。

如下是 Go 语言的一些关键词:

(defconst go-mode-keyWords '("break" "default" "func" "interface" "select" "case" "defer" "go" "map" "struct" "chan" "else" "goto" "package" "switch" "const" "fallthrough" "if" "range" "type" "continue" "for" "import" "return" "var") "All keywords in the Go language. Used for font locking.")

所以,在这个场景之下,不论是何种的 IDE 又或者是编辑器都可以快速实现。

跳转 goto

不同开发工具,有各种的跳转规则,不同的语言也有各自的跳转方式。如 Emacs 的 go-mode 就定义了一系列的跳转:

(let ((m (define-prefix-command 'go-goto-map))) (define-key m "a" #'go-goto-arguments) (define-key m "d" #'go-goto-docstring) (define-key m "f" #'go-goto-function) (define-key m "i" #'go-goto-imports) (define-key m "m" #'go-goto-method-receiver) (define-key m "n" #'go-goto-function-name) (define-key m "r" #'go-goto-return-values))

而 IDEA 也提供了一系列接口来实现类似的功能,如:

gotoActionAliasMatcher gotoClassContributor gotoSymbolContributor gotoFileContributor gotoRelatedProvider

我们只需要分析光标符所在的位置,其所定义的语法,如 IDEA 里是 PSI,再实现对应的逻辑即可。如:

@Override public @NotNull NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean includeNonProjectItems) { List<CharjStructDeclaration> properties = findStructByKey(project, name); return properties.toArray(new NavigationItem[properties.size()]); }

这里定义的是数据结构的导航。当我们按下快捷键的时候,会传入 name、pattern 等信息。接着,从所有相关的文件(VirtualFile)中寻找对应的  struct,返回即可。

自动填充

主要可以分为两类,一类是:代码段(Snippets),一类是:自动填充(Completion)

好像也没啥说的,就是绑定在特定关键字上的内容。

其它

剩下的就是一些比较有意思的功能,诸如于:

  • fileType。文件图标支持。即某一类型的文件,使用特定的图标来展示。

  • commet 。即按下注释的快捷键,能快速的注释和反注释代码。

  • line marker。IDEA 提供的功能,用于在行上通过图标来展示特定的功能。

  • folding。提供特定的代码段的折叠功能。

  • 数据视图。展示特定数据结构关系及参数等的视图。

  • &hellip;&hellip;

到此,相信大家对“如何理解编程语言的IDE支持”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何理解编程语言的IDE支持

本文链接: https://lsjlt.com/news/282205.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解编程语言的IDE支持
    本篇内容主要讲解“如何理解编程语言的IDE支持”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解编程语言的IDE支持”吧!语法分析对于开发工具来说,语法分析有几个重要的功能:语法高亮,是指根...
    99+
    2023-06-16
  • 了解Canvas:支持哪些编程语言?
    深入了解Canvas:支持哪些语言? Canvas是一种强大的HTML5元素,它提供了一种使用JavaScript绘制图形的方法。作为一个跨平台的绘图API,Canvas不仅支持绘制静态图像,还可以用于动画效果、游戏开发、数据可...
    99+
    2024-01-17
    Canvas 深入了解 支持语言
  • VSCode支持的编程语言一览
    标题:VSCode支持的编程语言一览及代码示例 近年来,随着软件开发行业的迅速发展,不同的编程语言以及各种开发工具层出不穷。其中,微软推出的代码编辑器VSCode凭借其高度的可定制性和...
    99+
    2024-04-02
  • Torch支持哪种编程语言
    Torch支持Lua编程语言。 Lua是一种轻量级、高效的脚本语言,被广泛用于科学计算和机器学习领域。 Torch是一个基于Lua的...
    99+
    2024-03-11
    Torch
  • Samza支持哪些编程语言
    Samza主要支持Java和Scala编程语言。Samza是一个基于Apache Kafka和Apache Hadoop的流处理框架...
    99+
    2024-04-02
  • VSCode支持哪些编程语言?
    标题:VSCode支持哪些编程语言? Visual Studio Code(简称VSCode)是一款开源的轻量级代码编辑器,拥有丰富的功能和扩展性,广泛应用于软件开发领域。作为一款强大...
    99+
    2024-04-02
  • 鸿蒙 HarmonyOS 支持 Go 编程语言吗?
    HarmonyOS 是否支持 Go 编程语言? 是的,HarmonyOS 支持 Go 编程语言。 如何使用 Go 编程 HarmonyOS 应用程序 以下是如何使用 Go 构建和运行 ...
    99+
    2024-04-08
    go 鸿蒙
  • Nginx反向代理支持的编程语言分别有哪些
    Nginx反向代理支持的编程语言分别有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。说到Nginx反向代理,大家应该比较熟悉了吧,但是在使...
    99+
    2024-04-02
  • 揭秘Canvas支持的编程语言终极指南
    Canvas是HTML5新增的一个元素,它为开发者提供了一个可以绘制图形、创建动画以及实现其他视觉效果的功能强大的平台。作为Web前端技术的重要组成部分,Canvas广泛应用于游戏开发、数据可视化和其他互动性项目等多个领域。在C...
    99+
    2024-01-17
    Canvas 编程语言 揭秘
  • IDEA支持的编程语言和框架有哪些
    IDEA(IntelliJ IDEA)是一个支持多种编程语言和框架的集成开发环境,主要支持的编程语言和框架包括: Java:ID...
    99+
    2024-04-03
    IDEA
  • Redis支持的客户端编程语言有哪些
    Redis支持的客户端编程语言有: Java Python PHP Ruby C# C/C++ JavaScript Go Lua...
    99+
    2024-03-11
    Redis
  • Go语言是否支持实时异步编程?
    随着计算机技术的不断发展,实时异步编程在开发中变得越来越重要。在这种编程模型中,程序需要在一个不断变化的环境中运行,同时需要快速响应事件。而Go语言作为一种高效的编程语言,能否支持实时异步编程呢?本文将对此进行探讨。 Go语言的并发模型 ...
    99+
    2023-06-25
    实时 异步编程 npm
  • Amazon Aurora支持哪些编程语言和框架
    Amazon Aurora支持多种编程语言和框架,包括但不限于: Java Python Ruby Node.js PHP .NE...
    99+
    2024-04-02
  • Go语言中有哪些支持异步编程的包?
    Go语言是一门非常流行的编程语言,它的高效性和简洁性使得越来越多的程序员选择使用它来开发应用程序。在Go语言中,异步编程是一种非常流行的编程方式。异步编程可以提高程序的性能和响应速度,使得程序能够更好地应对高并发的情况。本文将介绍一些Go语...
    99+
    2023-06-25
    实时 异步编程 npm
  • Android编程实现动态支持多语言的方法
    本文实例讲述了Android编程实现动态支持多语言的方法。分享给大家供大家参考,具体如下:资源文件values/strings.xml中添加<string name="current_language">English</...
    99+
    2023-05-31
    android 多语言 roi
  • Kotlin多语言支持如何实现
    这篇文章主要讲解了“Kotlin多语言支持如何实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Kotlin多语言支持如何实现”吧!Kotlin多语言支持对于 Kotlin 来说,当我们新建...
    99+
    2023-07-05
  • Linux系统对于Go语言的支持程度如何?
    Linux系统对于Go语言的支持程度如何? Linux系统对于Go语言的支持程度非常好,Go语言本身就是由Google开发的一种编程语言,而Google的服务器和云计算等大部分基础设施...
    99+
    2024-04-02
  • 宝塔面板对Go语言的支持程度如何?
    宝塔面板对Go语言的支持程度如何? - 从代码实例看支持程度 宝塔面板是一款为服务器提供简单易用的管理工具的面板软件,受到不少运维人员的青睐。近年来,Go语言作为一种高效、简洁的编程语...
    99+
    2024-04-02
  • Aurora数据库支持哪些语言编程接口
    Aurora数据库支持以下语言编程接口: MySQL:Aurora是基于MySQL数据库引擎开发的,因此可以使用MySQL的编程...
    99+
    2024-04-02
  • Java Spring框架如何支持自然语言处理?
    自然语言处理(Natural Language Processing, NLP)是指让计算机能够理解、处理人类自然语言的技术。这项技术在人工智能领域中扮演着重要的角色,它可以应用在很多领域,如机器翻译、语音识别、文本分类等。Java Sp...
    99+
    2023-08-19
    spring 自然语言处理 响应
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作