ANTLR和Jetbrains MPS:解析文件并以树符号显示AST
Itemis再次這樣做:他們剛剛為Jetbrains MPS發(fā)布了一個非常酷的新插件。 這允許定義新的樹編輯器。
 他們看起來像這樣: 
 
在這篇文章中,我們將看到:
- 如何在MPS中使用ANTLR解析器
- 如何使用樹符號表示已解析的AST
特別是,我們將使用解析ANTLR語法的ANTLR語法。 那是元嗎? 當然,每個ANTLR語法都可以使用相同的方法。
GitHub上始終提供代碼 。
依存關系
首先,您需要安裝Jetbrains MPS。 在這里獲取免費副本。
要使用樹符號,您應該安裝mbeddr平臺。 只需轉(zhuǎn)到此處 ,下載zip并將其解壓縮到MPS安裝的插件中??即可。
全部設置好了,該做些編程了。
包裝ANTLR以在MPS內(nèi)部使用
在上一篇文章中,我們討論了如何使用Gradle在Java項目中使用現(xiàn)有的ANTLR語法。 我們還將在此處應用該技術。
我們首先從此處下載語法: https : //github.com/antlr/grammars-v4/tree/master/antlr4
通過將LexBasic直接包含到ANTLRv4Lexer中,我們進行了一些小的更改。 注意,我們還需要LexerAdaptor 。
為了簡化用法,我們創(chuàng)建了一個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);}}}現(xiàn)在我們需要一個構(gòu)建文件:
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這個主意 ,以創(chuàng)建一個Jetbrains的IDEA項目
- gradle fatJar創(chuàng)建一個Jar,其中將包含我們的編譯代碼和所有依賴項
好。 現(xiàn)在要將這個解析器用于MPS,我們首先創(chuàng)建一個項目。 在向?qū)е?#xff0c;我們還選擇運行時和沙箱選項。 完成后,我們應該將胖子復制到運行時解決方案的models目錄下。 在我的情況下,我從Java項目的目錄運行以下命令:
cp build/libs/parser-all.jar ../languages/me.tomassetti.mpsantlr/runtime/models/  
 然后我們也將其添加到庫中: 
現(xiàn)在,JAR的內(nèi)容應出現(xiàn)在運行時解決方案的存根中。
從AST節(jié)點創(chuàng)建MPS節(jié)點
現(xiàn)在,我們將建立一個名為AntlrImporter的新概念。 我們將使用它來選擇并將ANTLR語法導入MPS:
概念結(jié)構(gòu)將非常簡單:
我們還需要要導入的AST節(jié)點的概念。 首先,我們將定義抽象概念AstNode 。 然后,我們將為終端和非終端AST節(jié)點定義兩個子概念。
現(xiàn)在,讓我們看一下AntlrImporter的編輯器。
第一個swing組件是一個按鈕,用于打開文件選擇器。 這樣,我們可以輕松地選擇一個文件并設置屬性path 。 或者,如果愿意,我們可以手動編輯它。
選擇文件后,我們可以通過單擊第二個按鈕將其導入
導入邏輯在importModel中 ,這是AntlrImporter行為的一種方法。
好。 這就對了。 這樣我們就可以解析任何ANTLR語法并將其放入MPS。 現(xiàn)在我們只需要使用一個很好的表示。 我們要使用樹符號。
使用樹符號
樹符號令人驚訝地易于使用。
首先,將com.mbeddr.mpsutil.treenotation.styles.editor添加到我們語言的編輯器方面的依賴項中。
我們還需要com.mbeddr.mpsutil.treenotation成為使用的語言。
Non TerminalNode的編輯器由單個樹單元組成。 樹單元的頂部代表此節(jié)點。 我們將使用ruleName表示它。 相反,我們應該在底部選擇包含要在樹中顯示的子項的關系
我們可以將光標放在頂部和底部之間的樹形圖上(“ / | \”符號),然后打開檢查器。 在那里,我們可以使用樣式屬性來自定義樹的外觀
我們只是決定從左到右而不是從上到下顯示樹。 然后,當孩子過多時,我們決定在父母與孩子之間添加更多空間。 這樣,線條就不會重疊太多。
這是沒有財產(chǎn)的樣子
屬性集的外觀如下
例如,還有其他屬性可用于控制線條的顏色和粗細。 或者,您可以在線條的末端添加形狀。 現(xiàn)在我們不需要這些功能,但是很高興知道它們在那里。
TerminalNode的編輯器非常簡單
結(jié)論
多年來,MPS變得更加穩(wěn)定且易于使用。 它已達到您可以非常有效地使用它的地步。 投影編輯是一個已經(jīng)存在了一段時間的想法,并且還有其他可用的實現(xiàn)方式,例如整個平臺 。 但是,MPS的成熟度很高。
我認為我們?nèi)匀幌肽畹氖?#xff1a;
- 流程和最佳實踐:我們應該如何管理與其他MPS項目的依賴關系? 我們應該如何與Java庫集成?
- 示例:令人驚訝的是,幾乎沒有公開的應用程序。 畢竟,許多用戶針對其特定用途開發(fā)DSL,并且不打算共享它們。 但是,這意味著我們幾乎沒有機會互相學習
- 擴展:Mbeddr團隊作為Mbeddr平臺的一部分,提供了很多好東西,做得很棒。 但是,它們似乎是唯一生產(chǎn)可復用組件并共享它們的組件
我認為現(xiàn)在是時候共同了解使用投影編輯可以實現(xiàn)的目標了。 我認為這將是非常有趣的時期。
如果我要表達的一個愿望是,我想聽到更多有關其他人如何使用MPS的信息。 如果您在那里,請敲門。 并發(fā)表評論
翻譯自: https://www.javacodegeeks.com/2016/05/antlr-jetbrains-mps-parsing-files-display-ast-usign-tree-notation.html
總結(jié)
以上是生活随笔為你收集整理的ANTLR和Jetbrains MPS:解析文件并以树符号显示AST的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 技术·融合·治理|众享链网正式运行启动!
- 下一篇: [gitlab] release功能
