国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

編程語言的 IDE 支持

開發 后端
或許是出自于對編寫編程語言的興趣,又或許是對于創建 IDE/編輯器的興趣,對于『IDE/編輯器是如何提供編程語言的支持』,我充滿了興趣。

[[345814]]

或許是出自于對編寫編程語言的興趣,又或許是對于創建 IDE/編輯器的興趣,對于『IDE/編輯器是如何提供編程語言的支持』,我充滿了興趣。其中的一個主要原因是,這是每天我們打交道最多的工具,另外一個原因可能是,咦,我們怎么沒有國產的 IDE(手動狗頭)。

編輯器 & IDE

先前,我已經在那篇《編輯器的自制》中介紹了,怎么去創建一個簡單的文本編輯器?這是一個相對簡單的問題。對于一個可用的代碼編輯器來說,我們對它的基本訴求是:快速啟動 + 語法高亮,然后能進行基本的文本編輯。不過呢,這是以我角度來看待問題的,我的想法里:一個編輯器,就干好一個編輯器應該做的事情。對于一些開發人員而言,他/她們會配置上強大的各種支持功能,以使它看上去像是一個 IDE。而后呢,它失去了快速啟動的能力,或者失去了一部分的快速啟動的速度,這便是有些遺憾的。

關于編輯器與 IDE 的這一一點的討論,似乎會有些偏頗。我自知我是一個 IDE 黨,擁有公司提供的 Jetbrains 全家桶。日常我也會使用 Sublime Text、Xi Editor、Vim、VS Code 進行一些快速的文件修改和查找。順便提一句,盡管過去我是一個 Emacs 粉,但是自我寫了自己的 Markdown 編輯器之后,我已經……。好在下一步,我打算做一個自己的代碼編輯器,這樣一來,也許就不會那么內疚了。或許呢,我已經在實現的路上了。

回到正題上,如果是一個 IDE 的話(以 IDEA 老用戶的感受),那么我估摸著需要這么一些功能:

  1. 語法高亮
  2. 文本編輯
  3. 子系統關聯與集成
  4. 跳轉與引用分析
  5. 智能感知
  6. 重構
  7. 快速修復
  8. 語言特性分析
  9. 結構化視圖
  10. ……

PS:仔細一看,諸如于 VSCode 這一類強大的編輯器里,已經內置了大部分的功能,而且它還是免費的。你還只需要一個,不需要啟動多個不同的 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 行。表達方式也有些繁瑣:

  1. "comments": { 
  2. "patterns": [ 
  3. "captures": { 
  4. "0": { 
  5. "name""punctuation.definition.comment.java" 
  6. }, 
  7. "match""/\\*\\*/"
  8. "name""comment.block.empty.java" 
  9. }, 
  10. "include""#comments-inline" 
  11. }, 

其中還有各種 include 關系等。對于 Sublime Text 也是類似的:

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

看了看,是不是會懷疑他們建立了語法同盟。

但是呢,yaml 和 json 是一個編程語言無關的東西。所以,VS Code 和 Atom 可以基于 Textmate 語法規則,快速建立對于主流語言的詞法分析,從而建立了語法高亮的支持。

我們也可以說 BNF 是一種編程語言無關的東西。但是,實際上在我們操作的時候,就會加入一些編程語言特定的要素。

語法分析器分析

由于先前編寫系統分析工具 Coca 和通用語法分析器 Chapi ,我對于 BNF 的詞法也是頗為上手的——實際上不難。唯一麻煩的地方就是,寫完之后,我們要編寫代碼做一些轉換,所以讓我們來看看 Jetbrians 插件的示例:

  1. COMMENT = 'regexp://[^\r\n]*' 
  2. BLOCK_COMMENT = 'regexp:[/][*][^*]*[*]+([^/*][^*]*[*]+)*[/]' 

這一點上和 antlr 沒有太大的區別:

  1. WS: [ \t\r\n\u000C]+ -> channel(HIDDEN); 
  2. COMMENT: '/*' .*? '*/' -> channel(HIDDEN); 
  3. LINE_COMMENT: '//' ~[\r\n]* -> channel(HIDDEN); 

然后,就是設計和分析詞法了:

  1. functionParameters ::= 
  2. LPAREN inputParameters RPAREN outputParameters? 
  3. IN SUB GT inputParameters 
  4. | outputParameters 

接著,在 IDEA 里面,我們可以通過這個 BNF 文件生成對應的 Lexer 文件和代碼等。對于使用 Antlr 編寫的詞法來說,Java 部分的代碼規模也就在 800 左右。

不過呢,從兩者的閱讀體驗對比來看,顯然 BNF 會更加友好一點。

自制 DSL 語法解析

頗為遺憾的是,我尚未寫過任何的 Vim 插件,好在我還知道 Vim 是如何退出來的。我使用 Vim 作為 git 的 editor,還熟知一些 Vim 編輯的常用快捷鍵。所以,語法高亮這一部分主要是參考 Vim 的文檔編寫和代碼示例。這里我找到了一個不錯的中文翻譯:語法高亮

總的來說,語法規則就是: syn vim關鍵字 匹配規則,如:

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

看上去依舊是正則匹配,如 Float:

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

不過,從算法形式上來說,完勝 Textmate 和 Sublime,畢竟是高級的 DSL。

編程語言語法解析

Emacs 的 mode 里包含了對于語法高亮的處理,于是為了這個高亮,我們需要寫寫 emacs lisp 代碼。如:

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

對于 Eclipse 來說,這個過程就更加麻煩了。

語言的高級支持

在我們實現了開發工具的詞法分析接口之后,我們就能按不同的 IDE/編輯器所定義的接口,進行定制了。這是一個繁雜,而又充滿挑戰的工作。對于不同的工具來說,它們的接口相關也甚多。我也并非都能一一了解 API,所以只能簡單的以 IDEA 作為一個示例來展示。主要原因大概有兩個:1. 我日常使用的是 Jetbrains 相關的 IDE;2. 我已經有一部分代碼了。

語法高亮

在進行了復雜的語法分析之后,接著,我們就可以快速進入一個簡單的環節,對代碼進行高亮。關于高亮的話,我們可以快速進行一個分類:

  • 關鍵詞。即編程語言的關鍵詞,如 C 語言中的 32 個關鍵詞。
  • 標識符。用戶定義的字符串,如變量名、結構體名、函數名等等。
  • 特殊詞法。
  • 重要的詞法。根據需要,可以針對于函數名、靜態函數名等進行標識,以提升識別度。

如下是 Go 語言的一些關鍵詞:

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

所以,在這個場景之下,不論是何種的 IDE 又或者是編輯器都可以快速實現。

跳轉 goto

不同開發工具,有各種的跳轉規則,不同的語言也有各自的跳轉方式。如 Emacs 的 go-mode 就定義了一系列的跳轉:

  1. (let ((m (define-prefix-command 'go-goto-map))) 
  2. (define-key m "a" #'go-goto-arguments) 
  3. (define-key m "d" #'go-goto-docstring) 
  4. (define-key m "f" #'go-goto-function
  5. (define-key m "i" #'go-goto-imports) 
  6. (define-key m "m" #'go-goto-method-receiver) 
  7. (define-key m "n" #'go-goto-function-name
  8. (define-key m "r" #'go-goto-return-values)) 

而 IDEA 也提供了一系列接口來實現類似的功能,如:

  1. gotoActionAliasMatcher 
  2. gotoClassContributor 
  3. gotoSymbolContributor 
  4. gotoFileContributor 
  5. gotoRelatedProvider 

我們只需要分析光標符所在的位置,其所定義的語法,如 IDEA 里是 PSI,再實現對應的邏輯即可。如:

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

這里定義的是數據結構的導航。當我們按下快捷鍵的時候,會傳入 name、pattern 等信息。接著,從所有相關的文件(VirtualFile)中尋找對應的 struct,返回即可。

自動填充

主要可以分為兩類,一類是:代碼段(Snippets),一類是:自動填充(Completion)

好像也沒啥說的,就是綁定在特定關鍵字上的內容。

其它

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

  • fileType。文件圖標支持。即某一類型的文件,使用特定的圖標來展示。
  • commet 。即按下注釋的快捷鍵,能快速的注釋和反注釋代碼。
  • line marker。IDEA 提供的功能,用于在行上通過圖標來展示特定的功能。
  • folding。提供特定的代碼段的折疊功能。
  • 數據視圖。展示特定數據結構關系及參數等的視圖。
  • ……

其它

我一直在尋找一直簡易的方式,以快速識別編程語言,并標識它們。所以,也就有了這篇文章。

雖然,還在探尋,但是呢,似乎已經有了一個初步的結果。

本文轉載自微信公眾號「 phodal」,可以通過以下二維碼關注。轉載本文請聯系 phodal公眾號。

 

 

責任編輯:武曉燕 來源: phodal
相關推薦

2010-03-29 17:56:20

Nginx反向代理

2012-04-05 09:49:10

Windows 8編程語言

2020-12-15 06:45:01

編程語言

2009-06-11 11:15:40

JSF開發工具

2018-06-04 09:30:07

編程語言安卓應用開發

2015-12-04 10:05:09

蘋果編程開源

2015-11-02 14:48:05

LinuxR 語言

2010-06-29 14:54:42

NetBeansNetBeans 6.

2025-02-14 08:13:05

AI技術開發

2022-06-15 09:54:51

PythonIDELinux

2023-05-31 09:09:34

開發者

2016-01-29 09:38:03

編程swiftubuntu

2020-09-18 15:22:31

編程語言C語言Java

2023-08-31 22:53:33

IDE工具窗口

2021-03-22 10:07:11

LinuxIDE驅動支持

2023-08-01 13:09:42

代碼開發

2022-06-16 16:08:00

Python初學者IDE

2012-09-28 13:23:43

編程語言語言進化程序員

2010-03-19 09:39:17

Python編程語言

2024-05-11 07:54:29

AI輔助編程工具
點贊
收藏

51CTO技術棧公眾號

国产精品久久久久9999| 久久免费在线观看| 最新日本视频| 亚洲1区2区3区4区| 亚洲欧洲综合另类| www.成人在线视频| 日韩精品免费一区二区夜夜嗨 | 91tv官网精品成人亚洲| 91亚洲成人| 欧美日韩在线一区| 欧美精品一区二区三区在线看午夜| 一区二区成人国产精品 | 成人午夜电影久久影院| 97视频免费观看| 亚洲欧美一区二区久久| av在线播放一区二区三区| 亚洲精品综合久久中文字幕| 国产精品9999久久久久仙踪林| 国产偷国产偷亚洲高清97cao| h片在线观看视频免费免费| 成人国产在线观看| 99理论电影网| 成人软件网18免费视频| 国产女人18毛片水真多18精品 | 天堂成人娱乐在线视频免费播放网站| 欧美日韩国产页| 亚洲精品成人三区| 久久uomeier| 欧美三级乱人伦电影| 日本高清不卡一区二区三区视频 | 久久国产精品区| 国产精品色婷婷久久58| 国产精品三区www17con| 国产探花在线精品| 欧美欧美午夜aⅴ在线观看| 日本福利小视频| 久久久蜜桃精品| 国产精品美女黄网| 精品国产一级| 日韩欧美国产一区二区在线播放 | 欧美视频在线一区二区三区| 91成人性视频| 国产成人毛片| 日韩视频一区二区| 久久美女视频| 蜜臀av性久久久久蜜臀aⅴ| 久久久久久久国产精品视频| 男男视频在线观看网站| 91丨九色丨国产丨porny| 国产精品av免费| 久久国产欧美日韩精品| 免费拍拍拍网站| 亚洲日本电影在线| 青春有你2免费观看完整版在线播放高清| 亚洲少妇中出一区| 福利av痴女| 亚洲少妇屁股交4| 国产www免费| 亚洲性感美女99在线| 欧美日韩国产在线播放网站| 国产aⅴ精品一区二区三区久久| 欧美综合在线第二页| 美女色狠狠久久| 成人黄色生活片| 一区二区三区四区国产| 国产富婆一区二区三区| 中国 免费 av| 免费人成精品欧美精品| 国产欧美自拍视频| 91欧美激情一区二区三区成人| 精品一区国产| 欧美一区=区| 国精产品一区一区三区视频| 亚洲欧美色图小说| 91精选在线| 日韩成人av一区| 国产综合色激情| 91国内精品久久| 色婷婷综合网| 国产精品sss| 91福利精品在线观看| 青青草综合在线| 亚洲成人精品一区| 亚洲精品人成| 在线观看亚洲a| 国产精品毛片久久| 青娱在线视频| 久久偷看各类wc女厕嘘嘘偷窃| 成人永久看片免费视频天堂| 国模大尺度私拍在线视频| 在线久久视频| 日韩一级黄色片| 欧美日韩视频免费看| 久久综合福利| 欧美性淫爽ww久久久久无| 亚洲精品影片| 国产成一区二区| 麻豆久久久久久| 日本视频久久久| 欧美精品电影在线播放| 欧美日韩国产在线观看网站 | 精品欧美色视频网站在线观看| 久久精品国产亚洲精品| 国产欧美高清视频在线| 久久精品视频16| 精品国产乱码久久久久久老虎| 欧美精品啪啪| h网址在线观看| 欧美成人黑人xx视频免费观看| 欧美福利视频| 国产一区二区在线视频播放| 欧美视频一区二区三区四区| 成人精品一区| 一级黄色香蕉视频| 亚洲精品视频免费| 欧美日韩国产精品一区二区三区四区| 亚洲欧洲中文字幕| 无码内射中文字幕岛国片| 日本韩国欧美一区| 不卡中文一二三区| 日韩精品一区二区在线视频| 亚洲在线视频网站| 成人午夜影院| 一道本在线免费视频| 亚洲精品电影在线| 日韩一区二区三区在线视频| 综合电影一区二区三区| 国产精品99久久免费| 亚洲精品久久久久久久蜜桃臀| 精品少妇一区二区三区视频免付费| 成人高潮成人免费观看| 亚洲v欧美v另类v综合v日韩v| 日本亚洲欧洲色α| 欧美在线www| 日韩av电影院| 一区二区三区欧美视频| 亚洲综合免费观看高清完整版在线 | 久久麻豆视频| 久久久久久久999| 黄色亚洲大片免费在线观看| 97欧洲一区二区精品免费| 91在线视频在线| 五月天激情视频在线观看| 国产免费成人在线视频| 伊人久久一区| 男女激情片在线观看| 狠狠干一区二区| 欧美精品一区二区在线观看| 影音先锋中文字幕一区| 老司机av在线免费看| 色婷婷综合成人av| 欧美在线三级电影| 久久99精品久久久久婷婷| 红杏成人性视频免费看| 深夜国产在线播放| 国产美女高潮在线| 中文字幕高清在线观看| 亚洲精蜜桃久在线| 亚洲aa在线观看| 久久精品中文字幕电影| 少妇一区二区三区| 麻豆视频在线观看免费网站| 欧美亚洲日本| 一区二区三区不卡在线视频 | 亚洲综合在线第一页| 中文字幕欧美国产| 黄动漫在线免费观看| 精品伦精品一区二区三区视频| 中文字幕日韩欧美| 97视频在线观看亚洲| 亚洲成人网在线观看| 亚洲精品乱码久久久久久日本蜜臀| 狠狠色2019综合网| 极品少妇一区二区三区精品视频 | 亚洲视频一二三区| 91免费观看在线| 99re成人精品视频| 成人国产精品免费观看动漫| 亚洲视频在线一区二区| 成人高清视频在线| 青青草精品视频| 不卡区在线中文字幕| 免费人成精品欧美精品| 久久se这里有精品| 亚洲一区在线观看免费观看电影高清 | 香蕉视频在线播放| 可播放的18gay1069| 日漫免费在线观看网站| 黄视频网站在线| 精品成人18| 韩国欧美国产1区| 欧美国产1区2区| 欧美性猛交xxxx乱大交极品| 日韩欧美在线不卡| 九九热精品视频在线播放| 97国产超碰| 麻豆影视在线| caoporn视频在线| 色猫猫成人app| 特级毛片在线|