日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ANTLR和Jetbrains MPS:解析文件并以树符号显示AST

發布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ANTLR和Jetbrains MPS:解析文件并以树符号显示AST 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Itemis再次這樣做:他們剛剛為Jetbrains MPS發布了一個非常酷的新插件。 這允許定義新的樹編輯器。

他們看起來像這樣:

在這篇文章中,我們將看到:

  • 如何在MPS中使用ANTLR解析器
  • 如何使用樹符號表示已解析的AST

特別是,我們將使用解析ANTLR語法的ANTLR語法。 那是元嗎? 當然,每個ANTLR語法都可以使用相同的方法。

GitHub上始終提供代碼 。

依存關系

首先,您需要安裝Jetbrains MPS。 在這里獲取免費副本。

要使用樹符號,您應該安裝mbeddr平臺。 只需轉到此處 ,下載zip并將其解壓縮到MPS安裝的插件中??即可。

全部設置好了,該做些編程了。

包裝ANTLR以在MPS內部使用

在上一篇文章中,我們討論了如何使用Gradle在Java項目中使用現有的ANTLR語法。 我們還將在此處應用該技術。

我們首先從此處下載語法: https : //github.com/antlr/grammars-v4/tree/master/antlr4

通過將LexBasic直接包含到ANTLRv4Lexer中,我們進行了一些小的更改。 注意,我們還需要LexerAdaptor 。

為了簡化用法,我們創建了一個Facade:

package me.tomasetti.mpsantlr.parser;import me.tomassetti.antlr4.parser.ANTLRv4Lexer; import me.tomassetti.antlr4.parser.ANTLRv4Parser; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.TokenStream;import java.io.*; import java.nio.charset.StandardCharsets;public class Antlr4ParserFacade {public ANTLRv4Parser.GrammarSpecContext parseString(String code) {InputStream inputStream = new ByteArrayInputStream(code.getBytes(StandardCharsets.UTF_8));return parseStream(inputStream);}public ANTLRv4Parser.GrammarSpecContext parseFile(File file) throws FileNotFoundException {return parseStream(new FileInputStream(file));}public ANTLRv4Parser.GrammarSpecContext parseStream(InputStream inputStream) {try {ANTLRv4Lexer lexer = new ANTLRv4Lexer(new org.antlr.v4.runtime.ANTLRInputStream(inputStream));TokenStream tokens = new CommonTokenStream(lexer);ANTLRv4Parser parser = new ANTLRv4Parser(tokens);return parser.grammarSpec();} catch (IOException e) {throw new RuntimeException("That is unexpected", e);}}}

現在我們需要一個構建文件:

buildscript {repositories {maven {name 'JFrog OSS snapshot repo'url 'https://oss.jfrog.org/oss-snapshot-local/'}jcenter()}}repositories {mavenCentral()jcenter() }apply plugin: 'java' apply plugin: 'antlr' apply plugin: 'idea'dependencies {antlr "org.antlr:antlr4:4.5.1"compile "org.antlr:antlr4-runtime:4.5.1"testCompile 'junit:junit:4.12' }generateGrammarSource {maxHeapSize = "64m"arguments += ['-package', 'me.tomassetti.antlr4.parser']outputDirectory = new File("${project.buildDir}/generated-src/antlr/main/me/tomassetti/antlr4/parser".toString()) }task fatJar(type: Jar) {manifest {attributes 'Implementation-Title': 'Antlr4-Parser','Implementation-Version': '0.0.1'}baseName = project.name + '-all'from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }with jar }

您可能要運行:

  • gradle這個主意 ,以創建一個Jetbrains的IDEA項目
  • gradle fatJar創建一個Jar,其中將包含我們的編譯代碼和所有依賴項

好。 現在要將這個解析器用于MPS,我們首先創建一個項目。 在向導中,我們還選擇運行時和沙箱選項。 完成后,我們應該將胖子復制到運行時解決方案的models目錄下。 在我的情況下,我從Java項目的目錄運行以下命令:

cp build/libs/parser-all.jar ../languages/me.tomassetti.mpsantlr/runtime/models/


然后我們也將其添加到庫中:

現在,JAR的內容應出現在運行時解決方案的存根中。

從AST節點創建MPS節點

現在,我們將建立一個名為AntlrImporter的新概念。 我們將使用它來選擇并將ANTLR語法導入MPS:

概念結構將非常簡單:

我們還需要要導入的AST節點的概念。 首先,我們將定義抽象概念AstNode 。 然后,我們將為終端和非終端AST節點定義兩個子概念。

現在,讓我們看一下AntlrImporter的編輯器。

第一個swing組件是一個按鈕,用于打開文件選擇器。 這樣,我們可以輕松地選擇一個文件并設置屬性path 。 或者,如果愿意,我們可以手動編輯它。

選擇文件后,我們可以通過單擊第二個按鈕將其導入

導入邏輯在importModel中 ,這是AntlrImporter行為的一種方法。

好。 這就對了。 這樣我們就可以解析任何ANTLR語法并將其放入MPS。 現在我們只需要使用一個很好的表示。 我們要使用樹符號。

使用樹符號

樹符號令人驚訝地易于使用。

首先,將com.mbeddr.mpsutil.treenotation.styles.editor添加到我們語言的編輯器方面的依賴項中。

我們還需要com.mbeddr.mpsutil.treenotation成為使用的語言。

Non TerminalNode的編輯器由單個樹單元組成。 樹單元的頂部代表此節點。 我們將使用ruleName表示它。 相反,我們應該在底部選擇包含要在樹中顯示的子項的關系

我們可以將光標放在頂部和底部之間的樹形圖上(“ / | \”符號),然后打開檢查器。 在那里,我們可以使用樣式屬性來自定義樹的外觀

我們只是決定從左到右而不是從上到下顯示樹。 然后,當孩子過多時,我們決定在父母與孩子之間添加更多空間。 這樣,線條就不會重疊太多。

這是沒有財產的樣子

屬性集的外觀如下

例如,還有其他屬性可用于控制線條的顏色和粗細。 或者,您可以在線條的末端添加形狀。 現在我們不需要這些功能,但是很高興知道它們在那里。

TerminalNode的編輯器非常簡單

結論

多年來,MPS變得更加穩定且易于使用。 它已達到您可以非常有效地使用它的地步。 投影編輯是一個已經存在了一段時間的想法,并且還有其他可用的實現方式,例如整個平臺 。 但是,MPS的成熟度很高。

我認為我們仍然想念的是:

  • 流程和最佳實踐:我們應該如何管理與其他MPS項目的依賴關系? 我們應該如何與Java庫集成?
  • 示例:令人驚訝的是,幾乎沒有公開的應用程序。 畢竟,許多用戶針對其特定用途開發DSL,并且不打算共享它們。 但是,這意味著我們幾乎沒有機會互相學習
  • 擴展:Mbeddr團隊作為Mbeddr平臺的一部分,提供了很多好東西,做得很棒。 但是,它們似乎是唯一生產可復用組件并共享它們的組件

我認為現在是時候共同了解使用投影編輯可以實現的目標了。 我認為這將是非常有趣的時期。

如果我要表達的一個愿望是,我想聽到更多有關其他人如何使用MPS的信息。 如果您在那里,請敲門。 并發表評論

翻譯自: https://www.javacodegeeks.com/2016/05/antlr-jetbrains-mps-parsing-files-display-ast-usign-tree-notation.html

總結

以上是生活随笔為你收集整理的ANTLR和Jetbrains MPS:解析文件并以树符号显示AST的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。