與大多數程序員一樣,我經常需要標識存在于文本文檔中的部件和結構,這些文檔包括:日志文件、配置文件、分隔的數據以及格式更自由的(但還是半結構化的)報表格式。所有這些文檔都擁有它們自己的“小語言”,用于規定什么能夠出現在文檔內。
我編寫處理這些非正式解析任務的程序的方法總是有點象大雜燴,其中包括定制狀態機、正則表達式以及上下文驅動的字符串測試。這些程序中的模式大概總是這樣:“讀一些文本,弄清是否可以用它來做些什么,然后可能再多讀一些文本,一直嘗試下去。”
各種形式的解析器將文檔中部件和結構的描述提煉成簡明、清晰和 說明性的規則,該規則規定了如何標識文檔的組成部分。這里,說明性方面是最引人注目的。我所有的舊的特別的解析器都采用了這種風格:讀一些字符、作決定、累加一些變量、清空、重復。正如本專欄關于函數型編程的部分文章中所評述的,程序流的方法風格相對來說容易出錯并且難以維護。
正式解析器幾乎總是使用擴展巴科斯范式(Extended Backus-Naur Form(EBNF))上的變體來描述它們所描述語言的“語法”。我們在這里研究的工具是這樣做的,流行的編譯器開發工具 YACC(及其變體)也是這樣做的。基本上,EBNF 語法對您可能在文檔中找到的 部件賦予名稱;另外,經常將較小的部件組成較大的部件。由運算符 主站蜘蛛池模板: 白河县| 灌南县| 历史| 黄龙县| 南康市| 杨浦区| 文安县| 千阳县| 浮梁县| 宜阳县| 高要市| 秦皇岛市| 安仁县| 缙云县| 德清县| 周宁县| 营口市| 泰安市| 三门县| 库尔勒市| 舟曲县| 仙桃市| 奈曼旗| 宁远县| 大埔区| 临猗县| 涟水县| 株洲县| 喜德县| 新绛县| 邹城市| 玉林市| 新野县| 湘潭县| 宿州市| 将乐县| 连平县| 从化市| 桐城市| 灵石县| 克山县|