編譯器入門 語法分析器 java_從零開始寫個編譯器吧 - Parser 語法分析器

Parser(語法分析器)的編寫相對于 Tokenizer (詞法分析器)要復雜得多,因此,在編寫之前可能也會鋪墊得更多一些。當然,本系列旨在“寫出”一個編譯器,所以理論方面只會簡單介紹 tao 語言所涉及的部分。

之前的幾章中,我純手寫了tao 語言的 Tokenizer。但如果我準備也純手寫一個 Parser,那將是非常麻煩且繁瑣的一件事情。實際上,就在在寫出這篇文章之前,我已完成了 Parser 的編寫,并測試妥當,因此我可以在此面對各位得出這個結論。

我將使用這么一種方式“制造”出 Parser:

將 tao 語言的所有語法細節描述出來,即定義 tao 語言。

寫一個能”根據定義,生成 tao 語言的 Parser“的程序。

如果以上描述有些讓人困惑,那我舉個通俗點的例子吧:

假如我想要制作一雙鞋子,通常的方案是,我會買好材料,并把鞋子做出來。但還有另一種方案,我先畫出鞋子的設計圖,再造一臺能依照設計圖造出鞋子的機器,然后把設計圖交給機器,再發動機器,得到鞋子。

在”制造鞋子的世界“中,除非我要開鞋廠,否則若我僅僅想造雙鞋子,那么前一個方案顯然更好。但在”制造編譯器的世界“中,卻與直覺相反,當語言本身足夠復雜的時候,后一種方案比前一種方案要方便得多。

至此,我需要一個能讀懂 tao 語言的定義,并根據定義生成 Parser 的一個程序。這種程序我們稱之為 Compiler-compiler 。這樣的程序(或稱工具)有很多現成的可供選擇(包括在 Java 平臺上可用的),但既然我這個系列叫做《從零開始寫個編譯器吧》,那顯然如果我用現成的工具,那是犯規行為。

因此,我還要寫一個 Compiler-compiler 出來才行。

那么,讓我先貼一張圖,以描述我將會寫出的 Compiler-compiler 的工作原理吧。

40c9602b162142e3f2c68051e1c8ddcf.png

Compiler-compiler 會將 tao 語言的定義編譯成某種數據結構,而這種數據結構是 Parser 初始化的參數。Parser 只有獲得了這種數據結構才能正常工作。

當 Parser 初始化之后,它會讀取 Tokenizer 生成的 Token 序列,并同時通過解釋 Compiler-compiler 生成的數據結構,最后生成 Syntax Tree。

至此,在編寫 Parser 的章節中,我必須完成如下三個任務。

定義 tao 語言的語法細節,并挑選一個合適的形式描述出來。

編寫一個 Compiler-compiler,它能編譯 tao 語言的定義,并生成某種數據結構。

編寫一個 Parser,它通過解釋 Compiler-compiler 生成的數據結構,將 Token 序列編譯成 Syntax Tree。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453615.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453615.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453615.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

017——數組(十七) asort ksort rsort arsort krsort

<?php /*** 數組 asort ksort rsort arsort krsort*///asort()對數組按值排序&#xff0c;保留鍵名&#xff1a; /*$arrarray(bbs_url>bbs.lantian.com,web_url>www.lantian.com,bbs_name>免費視頻教程,www_name>PHP項目開發, ); asort($arr); print_r($arr);…

v4l打開video設備 ,執行VIDIOC_DQBUF,出現Resource temporarily unavailable 問題

如果你在執行VIDIOC_DQBUF突然提示以下錯誤&#xff1a; error: VIDIOC_DQBUF: Resource temporarily unavailable 那么很可能是你使用非阻塞方式打開設備文件的造成的。 Resource temporarily unavailable是一種EAGAIN的錯誤。EAGAIN是較常見的一種錯誤(比如用在非阻塞操作…

ubuntu下無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用)

sudo apt-get install git E: 無法獲得鎖 /var/lib/dpkg/lock - open (11: 資源暫時不可用) E: 無法鎖定管理目錄(/var/lib/dpkg/)&#xff0c;是否有其他進程正占用它&#xff1f; 當執行sudo apt-get相關的命令&#xff0c;會顯示上面類似的錯誤 參考別人的解決方法是 sudo r…

java get方法不序列化_Java中的Json序列化,不容忽視的getter

在開發的過程中&#xff0c;經常會碰到和自己預期不一樣的情況。有的時候自己去研究一下還是很有趣的。這兩天在寫java web的時候&#xff0c;碰到了一個對象序列化的問題。問題重現public class AjaxJson {private boolean success;private String msg;private Object obj;pri…

mysql 通過echo的方式寫入數據庫 中文亂碼解決方案

echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" | MYSQL echo "set names utf8;insert into xxx (path, sn, time, flag) values ($wav, $sn, $secs, op);" 前面增加 set names utf8;

getParameter和getAttribute的區別

轉自http://blog.csdn.net/java_xiaobin/article/details/45363897 1.getAttribute是取得jsp中 用setAttribute設定的attribute 2.parameter得到的是string&#xff1b;attribute得到的是object 3.request.getParameter()方法傳遞的數據&#xff0c;會從Web客戶端傳到Web服務器…

java int字母,從Java中獲取int,也包含字母

How can I get the int value from a string such as 423e - i.e. a string that contains a number but also maybe a letter?Integer.parseInt() fails since the string must be entirely a number.解決方案Unless youre talking about base 16 numbers (for which theres …

Spring-data-jpa常用方法

轉載于:https://www.cnblogs.com/summary-2017/p/7904926.html

面試問題匯總 精選 分析 解答 職業規劃 part 1

C/C/C#面試題精選&#xff08;1&#xff09; 題目&#xff08;一&#xff09;&#xff1a;C中我們可以用static修飾一個類的成員函數&#xff0c;也可以用const修飾類的成員函數&#xff08;寫在函數的最后表示不能修改成員變量&#xff0c;不是指寫在前面表示返回值為常量&am…

java byte md5_Java開發網 - byte[]按自定義編碼轉換成String(MD5)

差不多了&#xff0c;這樣應該就可以了&#xff0c;剩下的就是擴展能接受的類型了。import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class HashPasswords {public String getPassword(byte[] input) {byte[] digest;synchronized (…

Java線程生命周期

當你需要使用Java線程在多線程環境下進行編程時&#xff0c;理解Java的線程周期與線程的狀態是非常重要的。通過實現Runnale接口或者繼承Thread類&#xff0c;我們可以創建線程&#xff0c;為了啟動一個線程&#xff0c;我們需要創建一個Thread對象&#xff0c;并且調用它的sta…

轉,JSON解析2

JSON 使用講解 這篇文章講解了&#xff0c;JSON的介紹以及使用GSON解析。今天&#xff0c;我們就在Android項目中使用兩種方式解析JSON數據。如果你對JSON&#xff0c;還不熟悉&#xff0c;那么請看JSON 使用講解。 一.搭建服務以及制造JSON數據。 1.服務器選擇的Tomcat&#x…

面試問題匯總 精選 分析 解答 職業規劃 part 2

面試困惑問與答&#xff08;2&#xff09;——感覺挺好&#xff0c;為啥被拒了&#xff1f; 問&#xff1a;技術面試的時候&#xff0c;題目挺簡單的&#xff0c;我覺得自己都做出來了。可最后怎么還是被拒了啊&#xff1f; 答&#xff1a;面試被拒有很多種可能&#xff0c;比…

js順序加載

2019獨角獸企業重金招聘Python工程師標準>>> js想要順序加載&#xff0c;分開js代碼塊&#xff0c;jsp頁面在加載的時候&#xff0c;是順序加載&#xff0c;遇到<script></script>代碼塊&#xff0c;先加載完成&#xff0c;然后繼續往下&#xff0c;遇到…

java swingworker_Java中的SwingWorker

L&#xff06;F物質的輸出(因為您對EDT的不確定性有待測試)run:JButton openDialog >>> Is there EDT ??? trueWorker started >>> Is there EDT ??? falsewaiting 30secondsWorker endeded >>> Is there EDT ??? falsebefore JOptionP…

持續交付與滾動升級

介紹 持續交付是頻繁對軟件應用程序持續更新的概念. 這個想法使在大量頻繁的更新面前, 你不必等待在一個指定的特殊時間點, 并且使你的組織在響應過程中變得更好. 一些 Ansible 用戶每小時都在部署更新給他們的最終用戶甚至更加頻繁 – 每時每刻都有代碼修改的批準. 要實現這一…

2-05 使用固態存儲SSD或PCIe卡

在大量并發的情況下&#xff0c;才能體現固態磁盤的吞吐量&#xff0c;在大并發下提供良好隨機io的性能&#xff0c;這正是關系型數據庫所需要的&#xff0c;相對應機械磁盤&#xff0c;固態磁盤更容易損壞&#xff08;第三點是固態磁盤的缺點&#xff09;&#xff0c;由于固態…

面試問題匯總 精選 分析 解答 職業規劃 part 3

《劍指Offer——名企面試官精講典型編程題》已經出版 非常感謝博客上的讀者&#xff0c;是大家的關心、支持和鼓勵讓我有信心寫完這本書并最終出版發行&#xff08; china-pub互動網、 亞馬遜卓越網、 淘寶網、 京東網、 當當網上有售&#xff09;。網友們的鼓勵讓我在 博客上的…

java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

4 Dubbo快速入門Dubbo作為一個RPC框架&#xff0c;其最核心的功能就是要實現跨網絡的遠程調用。本小節就是要創建兩個應用&#xff0c;一個作為服務的提供方&#xff0c;一個作為服務的消費方。通過Dubbo來實現服務消費方遠程調用服務提供方的方法。4.1 服務提供方開發開發步驟…

輕松獲知數據庫事務

標題索引事務作用事務流程隔離級別實例驗證事務作用事務是確保數據庫系統數據的完整性的功能&#xff0c;如現在互聯網行業支付業務&#xff0c;不管服務器出于什么原因異常中斷&#xff0c;客戶要么支付成功要么支付不成功&#xff0c;支付成功數據庫金額即會發生變化&#xf…