Kanvas:从您的ANTLR语法生成一个简单的IDE
什么是編輯器?
對我來說,編輯器是我工作中使用的主要工具。 作為語言工程師,我創建新的語言,使用現有的語言,并且需要其他工具來使用它們。 我希望能夠在一個定制的IDE中將所有這些黑客一起入侵,我可以為我成長。 這就是為什么我要使用可破解的編輯器Kanvas的原因。 當然在GitHub上 。
在許多情況下,我需要一個用于DSL的簡單文本編輯器,并且傾向于使用ANTLR構建它們。 我將需要其他東西,例如表格或圖形投影,模擬器等,但是我需要從某個地方開始,對嗎? 另外,我認為目前還沒有一種簡單的方法來獲得具有最小依賴性和簡單結構的DSL獨立編輯器。 菜單上沒有燈光選項。 是時候添加一個了。
快速從語法中獲取編輯器
定義語言語法后,您可以從中提取很多信息。 我認為您應該能夠免費從中獲得盡可能多的價值,并可以根據需要進一步自定義它。 這類似于Xtext的想法(減去理解EMF所需閱讀的400頁)。
您能多快獲得ANTLR語法的編輯器? 您為編輯器創建一個新項目,將Kanvas添加為依賴項,并注冊您打算支持的語言:
fun main(args: Array<String>) {languageSupportRegistry.register("sm", smLangSupport)val kanvas = Kanvas()SwingUtilities.invokeLater {kanvas.createAndShowKanvasGUI()kanvas.addTab("My SM", languageSupport = smLangSupport)}并添加以下行以支持您的語言:
object smLangSupport : BaseLanguageSupport() {override val antlrLexerFactory: AntlrLexerFactoryget() = object : AntlrLexerFactory {override fun create(code: String): Lexer = SMLexer(org.antlr.v4.runtime.ANTLRInputStream(code))}override val parserData: ParserData?get() = ParserData(SMParser.ruleNames, SMParser.VOCABULARY, SMParser._ATN) }這樣很快。 少于10行代碼。 我們只需要指定Lexer和Parser類(在此示例中為SMLexer和SMParser )。
如果您想知道那是什么語言,那就是Kotlin:一種用于JVM的簡潔靜態語言,可以輕松與Java互操作。
讓我們對其進行一些改進:語法突出顯示
因此,我有一種簡單的語言,基本上可以免費獲得編輯器,然后開始使用它。 首先,我想為不同種類的標記定義樣式。 我們正在做一些簡單的事情,只需設置顏色即可:
object smLangSyntaxScheme : SyntaxScheme(true) {override fun getStyle(index: Int): Style {val style = Style()val color = when (index) {// TypesSMLexer.STRING, SMLexer.INT, SMLexer.DECIMAL -> Color(42, 53, 114)// LiteralsSMLexer.STRINGLIT -> Color(21, 175, 36)SMLexer.INTLIT, SMLexer.DECLIT -> Color.BLUE// CommentsSMLexer.COMMENT -> Color(170, 181, 171)// OperatorsSMLexer.ASTERISK, SMLexer.DIVISION, SMLexer.PLUS, SMLexer.MINUS -> Color.WHITE// KeywordsSMLexer.VAR -> Color.GREENSMLexer.INPUT -> Color(200, 250, 200)SMLexer.SM -> Color(200, 250, 200)SMLexer.EVENT -> Color(200, 250, 200)SMLexer.AS -> Color(50, 12, 96)// IdentifiersSMLexer.ID -> Color.MAGENTA// SeparatorsSMLexer.ARROW -> Color(50, 12, 96)SMLexer.COLON -> Color(50, 12, 96)SMLexer.ASSIGN -> Color(50, 12, 96)SMLexer.LPAREN, SMLexer.RPAREN -> Color.WHITE// RestSMLexer.UNMATCHED -> Color.REDelse -> null}if (color != null) {style.foreground = color}return style} }我們沒有將某些標記設置為粗體或斜體,因為我們想使事情簡單。 順便說一句,如果您對Kanvas中語法突出顯示的工作方式感興趣,我將在本文中進行介紹。
然后是自動補全
現在,我們免費獲得了一些有限的自動完成功能。 基本上,我們會根據語言的結構獲得自動補全功能,因此我們的算法可以告訴我們哪些關鍵字可以插入當前位置,或者在某個位置可以接受標識符。 該算法不能免費確定的是應該建議哪些標識符。 讓我們實現一個非常簡單的邏輯:當我們可以插入一個標識符時,我們將查看前面的標記并使用它們來確定要提出的建議。 例如,在定義輸入時,我們可以建議“ anInput”,而在定義變量時,我們可以建議“ aVar”:
override val propositionProvider: PropositionProviderget() = object : PropositionProvider {override fun fromTokenType(completionProvider: CompletionProvider,preecedingTokens: List<Token>, tokenType: Int): List<Completion> {val res = LinkedList<Completion>()var proposition : String? = this@smLangSupport.parserData!!.vocabulary.getLiteralName(tokenType)if (proposition != null) {if (proposition.startsWith("'") && proposition.endsWith("'")) {proposition = proposition.substring(1, proposition.length - 1)}res.add(BasicCompletion(completionProvider, proposition))} else {when (tokenType) {SMParser.ID -> {val determiningToken = preecedingTokens.findLast { setOf(SMLexer.SM, SMLexer.VAR, SMLexer.EVENT, SMLexer.INPUT).contains(it.type) }val text = when (determiningToken?.type) {SMLexer.SM -> "aStateMachine"SMLexer.EVENT -> "anEvent"SMLexer.INPUT -> "aInput"SMLexer.VAR -> "aVar"else -> "someID"}res.add(BasicCompletion(completionProvider, text))}}}return res}}這是代碼。 這夠了嗎? 我不知道,但是我所知道的是,這是一個很小的系統,可以理解并且簡單到可以輕松擴展和定制。 因此,我計劃將其用于這種小型語言,并根據需要改進自動完成功能,尤其是針對該語言。 游戲的名稱是有機地和迭代地增長的工具支持。
設計目標:類似于Sublime Text但開源
我們都喜歡Sublime Text。 我想從中得到啟發,但是開源。 為什么要開源? 這樣我就可以根據需要自定義它。
現在是這樣的:
是的,它還沒有Sublime Text精美。 但這意味著我還有改進的空間。
到語言工作臺還是不到語言工作臺?
我經常使用Jetbrains MPS和Xtext等語言工作臺。 它們之所以出色,是因為它們允許很快地獲得非常好的工具支持。 在許多情況下,它們是您的最佳選擇。 但是,作為每種工程選擇,都需要考慮不同的方面。 Jetbrains MPS和Xtext是非常大而復雜的軟件,這種東西重數百MB。 要了解這些平臺的內部知識,需要進行大量的工作和大量的努力。 只需使用這些平臺,您將獲得巨大收益。 但是,它們并不是在所有情況下的最佳解決方案,因為在某些情況下,您需要將語言與現有系統集成在一起,因此,您必須以非設計的方式來彎??曲這些語言工作臺。 也許您想將您的編輯器或工具嵌入到現有平臺中,也許您想要在平板電腦上使用一個簡單的編輯器,也許您希望從命令行使用這些工具。 也許您想以某種特殊的方式將系統組合在一起以滿足您的特定需求。 在這些情況下,使用語言工作臺不是正確的選擇。 您需要一些簡單的東西,可以入侵的東西。 這是我正在嘗試的方法。 為此,我正在研究一些開源項目,并寫了一本書 。
結論
這會飛嗎? 我不知道。 我很開心地花了一些時間在這個項目上。 我覺得這是為使用ANTLR構建的DSL獲得簡單的獨立編輯器的好方法。 我還想將其用作Kotlin支持的vim,一種新千年的vim。 具有超投射力。 讓我們看看它是如何增長的。
是的,我知道Atom將自己描述為可入侵的編輯器。 但是,從我的角度來看,這還不夠黑客入侵。
翻譯自: https://www.javacodegeeks.com/2017/01/kanvas-generating-simple-ide-antlr-grammar.html
總結
以上是生活随笔為你收集整理的Kanvas:从您的ANTLR语法生成一个简单的IDE的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 引擎:明年起将根据游戏安装量
- 下一篇: 月饼专利申请超10000项!新奇月饼层出