最小化括號(hào)式深?yuàn)W語言的語法實(shí)現(xiàn)指南)
編程語言編譯器開發(fā)工具【免費(fèi)下載鏈接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.項(xiàng)目地址https://gitcode.com/gh_mirrors/gr/grammars-v4點(diǎn)擊查看免費(fèi)下載Brainflak 是一種僅由( ) { } [ ] 八種括號(hào)字符構(gòu)成的深?yuàn)W編程語言esoteric language其全部程序邏輯都蘊(yùn)含在括號(hào)的嵌套與配對(duì)之中。本倉庫的 brainflak.g4 提供了一份基于 ANTLR4 的完整語法定義通過遞歸嵌套的規(guī)則天然映射了該語言的括號(hào)結(jié)構(gòu)。讀完本文你將掌握這份語法的規(guī)則組織方式、每個(gè)產(chǎn)生式的精確含義、配套示例與 Maven 構(gòu)建/測(cè)試配置并能直接在本地生成解析器、驗(yàn)證 Brainflak 程序。Brainflak 語言與純語法語法Brainflak又稱 Brain-Flak在 Esolangs 社區(qū)中被稱為由八個(gè)括號(hào)組成的語言()、{}、[]與是僅有的四種原子指令程序則是這些括號(hào)對(duì)的任意遞歸嵌套組合。由于不存在任何保留字、運(yùn)算符或字面量這種語言對(duì)詞法分析器的需求被壓縮到了極致——幾乎不存在詞只剩下符號(hào)流。這也讓 grammars-v4 倉庫期望語法無動(dòng)作free of actions的約束得以完美體現(xiàn)本語法文件沒有任何嵌入的語義動(dòng)作或謂詞純粹由上下文無關(guān)的產(chǎn)生式描述語言結(jié)構(gòu)。解析器只負(fù)責(zé)回答這段括號(hào)串是否合法、其嵌套樹長(zhǎng)什么樣至于括號(hào)背后的語義棧操作、IO 等則完全交由語法之外的解釋器/編譯器實(shí)現(xiàn)這正是語法只定義結(jié)構(gòu)這一設(shè)計(jì)哲學(xué)的典型范例。語法文件整體結(jié)構(gòu)brainflak.g4 的完整定義可以分為三個(gè)層次頭部聲明grammar brainflak;聲明語法名并帶有 ANTLR 格式化指令注釋$antlr-format ...用于統(tǒng)一代碼風(fēng)格解析器規(guī)則parser rulesfile_、statement、parenstmt、bracestmt、bracketstmt、gtltstmt描述程序的層次結(jié)構(gòu)詞法規(guī)則lexer rules8 個(gè)單字符 token 規(guī)則加一個(gè)WS跳過規(guī)則。整個(gè)語法文件僅幾十行卻完整覆蓋了 Brainflak 的全部語法面下面逐層拆解。解析器規(guī)則遞歸嵌套的四種括號(hào)語法文件從頂層規(guī)則file_開始file_ : statement EOF ;file_是語法的人口entry point要求程序由一個(gè)或多個(gè)statement組成并以 EOF 結(jié)尾——這保證了整段輸入必須被完整消費(fèi)拒絕解析到一半就結(jié)束的殘缺輸入。注意規(guī)則名file_帶有下劃線后綴是為了避免與 ANTLR 內(nèi)部保留的關(guān)鍵字file沖突。緊接著的statement規(guī)則將任意一條語句歸約為四種括號(hào)形式之一statement : parenstmt | bracestmt | bracketstmt | gtltstmt ;而四條*stmt規(guī)則則刻畫了 Brainflak 最核心的遞歸嵌套本質(zhì)parenstmt : LPAREN statement* RPAREN ; bracestmt : LBRACE statement* RBRACE ; bracketstmt : LBRACK statement* RBRACK ; gtltstmt : LT statement* GT ;四條規(guī)則的結(jié)構(gòu)完全同構(gòu)一個(gè)左括號(hào) 零個(gè)或多個(gè)嵌套語句 一個(gè)匹配的右括號(hào)。這意味著括號(hào)對(duì)內(nèi)部可以是空的如()、{}也可以是任意深度的嵌套內(nèi)容如(()()())還可以是混用不同括號(hào)的復(fù)合結(jié)構(gòu)如()(){}頂層并列多個(gè)語句由file_中的statement承接statement*的星號(hào)閉包讓嵌套深度不受語法限制與 Brainflak任意遞歸的語言特性嚴(yán)格對(duì)齊因?yàn)樗姆N括號(hào)可以任意互相嵌套例如({[]})規(guī)則間的相互引用形成了完整遞歸不會(huì)出現(xiàn)某類括號(hào)內(nèi)部禁止另一類括號(hào)的限制。從源碼結(jié)構(gòu)可以推斷這份語法沒有區(qū)分原子指令與復(fù)合塊的語義層級(jí)——()、[]、{}、在文法層面地位完全平等真正的語義差異比如哪些括號(hào)對(duì)在 Brainflak 語義中代表入棧、出?;蛄鞒炭刂屏艚o了下游工具處理。詞法規(guī)則八個(gè)單字符 token 與全能跳過由于 Brainflak 只有八種符號(hào)詞法分析異常簡(jiǎn)潔LPAREN : ( ; RPAREN : ) ; GT : ; LT : ; LBRACE : { ; RBRACE : } ; LBRACK : [ ; RBRACK : ] ; WS : . - skip ;關(guān)鍵在于WS規(guī)則WS : . - skip采用點(diǎn)號(hào)匹配任意未識(shí)別的單字符并直接跳過。這帶來兩個(gè)效果空格、換行、制表符乃至任意其他字符如注釋符號(hào)或非括號(hào)字符都會(huì)被靜默丟棄解析器只關(guān)注括號(hào)符號(hào)流在 ANTLR 的詞法規(guī)則優(yōu)先級(jí)機(jī)制下八條顯式 token 規(guī)則在前、WS在后因此括號(hào)字符會(huì)優(yōu)先匹配到各自 token絕不會(huì)被WS吞掉。這種兜底跳過策略對(duì)語法類工具如統(tǒng)計(jì)括號(hào)平衡、格式美化、高亮非常友好——它可以寬容地處理帶有分隔符或裝飾文本的輸入。但如果你的場(chǎng)景要求嚴(yán)格拒絕非法字符則可以把WS改為只匹配空白字符如[ \t\r\n] - skip讓其余字符觸發(fā)詞法錯(cuò)誤這屬于按需調(diào)整的方向。配套示例三份最小測(cè)試輸入倉庫為語法提供了三個(gè)示例文件覆蓋了從并列到深層嵌套的遞進(jìn)形態(tài)文件內(nèi)容結(jié)構(gòu)解讀example1.txt()(){}頂層三個(gè)并列語句()、()、{}example2.txt(()()())一對(duì)圓括號(hào)內(nèi)嵌套三個(gè)空語句example3.txt((()()()))三層嵌套最外層包裹 example2三份示例恰好驗(yàn)證了語法的兩條關(guān)鍵路徑file_的statement并列能力以及*stmt規(guī)則的遞歸嵌套能力。它們同時(shí)被 Maven 測(cè)試插件當(dāng)作自動(dòng)回歸用例見下節(jié)任何對(duì)語法的破壞性修改都會(huì)立即被測(cè)試捕獲。Maven 構(gòu)建與自動(dòng)化測(cè)試配置brainflak/pom.xml 將這份語法掛接進(jìn)了倉庫的 Maven 聚合體系它繼承自 esolang/pom.xml 中的esolangparentEsoteric Language Grammars 父模塊該父模塊又把brainflak列為子模塊最終匯聚到根 pom.xml 的grammarv4profile 中。根 POM 的關(guān)鍵版本屬性包括antlr.version4.13.2與antlr4test-maven-plugin.version1.22。構(gòu)建環(huán)節(jié)由兩個(gè)插件組成。首先是antlr4-maven-plugin負(fù)責(zé)從brainflak.g4生成解析器源碼plugin groupIdorg.antlr/groupId artifactIdantlr4-maven-plugin/artifactId version${antlr.version}/version configuration sourceDirectory${basedir}/sourceDirectory includes includebrainflak.g4/include /includes visitortrue/visitor listenertrue/listener /configuration /pluginvisitortrue/visitor與listenertrue/listener意味著會(huì)同時(shí)生成 Visitor 和 Listener 兩套遍歷接口下游解釋器或分析器可以選擇任意一種模式對(duì)解析樹進(jìn)行遍歷——對(duì)于 Brainflak 這類需要深度遞歸處理的語法兩種模式都能干凈地支撐實(shí)現(xiàn)。其次是com.khubla.antlr:antlr4test-maven-plugin它把examples/目錄作為回歸測(cè)試集自動(dòng)跑起來plugin groupIdcom.khubla.antlr/groupId artifactIdantlr4test-maven-plugin/artifactId version${antlr4test-maven-plugin.version}/version configuration verbosefalse/verbose showTreefalse/showTree entryPointfile_/entryPoint grammarNamebrainflak/grammarName packageName/packageName exampleFilesexamples//exampleFiles /configuration /plugin這里entryPointfile_/entryPoint明確指定從file_規(guī)則開始解析與語法中的頂層規(guī)則一一對(duì)應(yīng)。也就是說只要執(zhí)行mvn test插件就會(huì)依次把examples/下的每個(gè)文件當(dāng)作輸入用生成的brainflak解析器從file_開始完整解析任何解析失敗都會(huì)導(dǎo)致構(gòu)建報(bào)錯(cuò)。這套機(jī)制讓語法修改始終處于可驗(yàn)證狀態(tài)。多語言目標(biāo)與擴(kuò)展方向desc.xml 聲明了本語法面向的代碼生成目標(biāo)CSharp; Cpp; Dart; Go; Java; JavaScript; PHP; Python3; TypeScript; Antlr4ng。這意味著同一份brainflak.g4可以直接生成十種語言的解析器代碼契合 grammars-v4 倉庫語法無動(dòng)作的跨語言復(fù)用目標(biāo)——正因?yàn)檎Z法內(nèi)不含任何語言特定的動(dòng)作代碼才能做到一份語法、多語言編譯。在實(shí)際使用中你可以這樣快速上手本地解析驗(yàn)證使用倉庫根目錄的 grun.sh 或 antlr4-tools 腳本生成解析器并打印解析樹grun brainflak file_ -tree構(gòu)建測(cè)試進(jìn)入esolang/brainflak目錄執(zhí)行 Maven 構(gòu)建與測(cè)試觀察三個(gè)示例文件的解析結(jié)果二次開發(fā)基于生成的brainflakParser與brainflakBaseVisitor實(shí)現(xiàn)一個(gè) Brainflak 解釋器——由于語法將結(jié)構(gòu)完全暴露為解析樹括號(hào)嵌套與語義動(dòng)作棧操作、循環(huán)的映射會(huì)非常直接。需要提醒的是本文所述均以當(dāng)前倉庫內(nèi)容為準(zhǔn)語法按 4.13.x 系列 ANTLR 工具鏈編寫示例與構(gòu)建配置即倉庫現(xiàn)狀。如果你的輸入包含非括號(hào)字符并希望被報(bào)錯(cuò)而非忽略請(qǐng)按上文提示調(diào)整WS規(guī)則如果希望為裸括號(hào)流增加格式要求如忽略注釋也可以基于WS的跳過機(jī)制自行擴(kuò)展——這都建立在對(duì)本語法結(jié)構(gòu)即全部的透徹理解之上。贊分享編程語言編譯器開發(fā)工具【免費(fèi)下載鏈接】grammars-v4Grammars written for ANTLR v4; expectation that the grammars are free of actions.項(xiàng)目地址https://gitcode.com/gh_mirrors/gr/grammars-v4點(diǎn)擊查看免費(fèi)下載相關(guān)推薦P 語言文法解析grammars-v4 中最小圖靈完備語言的 ANTLR4 實(shí)現(xiàn)P 語言文法解析grammars v4 中最小圖靈完備語言的 ANTLR4 實(shí)現(xiàn) 本篇文章圍繞 grammars v4 倉庫中的 p/p.g4 https編程語言編譯器開發(fā)工具FOCAL 語言 ANTLR4 語法指南基于 grammars-v4 倉庫的解析器實(shí)現(xiàn)解析FOCAL 語言 ANTLR4 語法指南基于 grammars v4 倉庫的解析器實(shí)現(xiàn)解析 FOCALFormula Calculator公式計(jì)算器是編程語言編譯器開發(fā)工具ANTLR4 目標(biāo)無關(guān)語法編寫指南用語義謂詞、superClass 與 transformGrammar.py 實(shí)現(xiàn)一份語法多語言復(fù)用ANTLR4 目標(biāo)無關(guān)語法編寫指南用語義謂詞、superClass 與 transformGrammar.py 實(shí)現(xiàn)一份語法多語言復(fù)用 本指南基于 ANTLR開發(fā)工具編程語言編譯器創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考