使用m4來模組化管理語法檔案

2021-04-23 17:55:01 字數 1141 閱讀 5496

使用yacc/bison編寫語法檔案的時候,經常遇到的乙個問題就是在乙個語法檔案中包含了太多規則,以至於文

件的尺寸變得異常龐大,顯得很難看。乙個普通語言的語法檔案,加上語義動作和相關處理函式,尺寸在5000

以上並不是什麼稀罕事,這在軟體設計來說是一件讓人難以忍受的事情。畢竟,面對這麼大的乙個檔案,無論是

閱讀還是維護,都不是一件讓人舒心的體驗。

以前在cadence的時候,解決這個問題是通過

m4將乙個大的語法檔案分解為多個子檔案來獲得模組化組織的效

果。現在我也決定採用相同的方式來組織目前編寫的這門語言的語法模組。

m4實際上是乙個巨集處理器,單純從巨集處理的功能上來看,m4與c語言的巨集處理器提供的功能比較相似,包括條件

編譯,巨集定義,包含檔案,等等。不過除了基本的巨集處理功能以外,m4還提供了執行系統命令,文字處理,算術運

算等功能。相比於c語言的預處理器而言,m4無疑更為強大一些。

具體到我的應用場景中,在使用m4之前,我是將所有的語法規則放到乙個parser.y檔案中,引入m4以後,我將

原先的parser.y檔案分解為若干個子檔案,其中頂層檔案的名稱為top_parser.m4y,其他子檔名稱為

expr.m4ystatement.m4y,。。。

top_parser.m4y中通過m4提供的include命令將其他的子檔案包含進來,從而達到將語法部分模組化組織

的目的。

這樣作的乙個潛在的好處是,如果以後需要編寫新語言的parser,並且新語言與已實現的語法在語法規則方

面具有共性的話,就可以將包括這部分共性的子檔案復用到新語言的parser中,避免了重複開發的工作

。這樣的事情,以前在cadence曾經有過體驗。當時系統中已經存在了語言a的語法規則檔案,後來因為客戶要

求,需要開發b語言的parser,而a與b這兩門語言的語法規則存在很多相似的地方,所以在開發b的parser的

過程中,我們通過m4復用了不少a的語法規則,大大提高了開發效率。

Vuex Module 模組化使用

由於使用單一狀態樹,應用的所有狀態會集中到乙個比較大的物件。當應用變得非常複雜時,store 物件就有可能變得相當臃腫。為了解決以上問題,vuex 允許我們將 store 分割成模組 module 每個模組擁有自己的 state mutation action getter 甚至是巢狀子模組 src...

4 AMD RequireJS模組化教程

建立專案結構 js libs require.js modules loger.js dataservice.js main.js index.html定義require.js的模組 應用主 入口 js main.js requirejs.config 引入使用模組 requirejs loger ...

11 模組化使用PHP

許多站點不使用任何精美的內容管理系統 cms 來生成其頁面,它們只是靜態html內容的良好表現。您祖母餡餅烘焙業務的站點可能只有幾頁,也許是主頁,關於頁面和聯絡頁面。這些頁面中的每個頁面都有不同的主要內容,但是其中許多頁面都保持完全相同,例如頁首,導航和頁尾。將這些部分視為 模組 您可以輕鬆地使用p...