成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

編譯原理實戰(zhàn)入門:用 JavaScript 寫一個簡單的四則運算編譯器(一)詞法分析

wangdai / 2986人閱讀

摘要:一般的程序,是無法直接執(zhí)行的,因為只能識別機器指令。所以要想執(zhí)行一個程序,首先要將高級語言編寫的程序翻譯為匯編代碼,再將匯編代碼翻譯為機器指令,這樣才能識別并執(zhí)行。

編譯器

編譯器是一個程序,作用是將一門語言翻譯成另一門語言。

一般的程序,CPU 是無法直接執(zhí)行的,因為 CPU 只能識別機器指令。所以要想執(zhí)行一個程序,首先要將高級語言編寫的程序翻譯為匯編代碼,再將匯編代碼翻譯為機器指令,這樣 CPU 才能識別并執(zhí)行。

示例:

// CPU 無法識別
10 + 5

// 翻譯成匯編語言
push 10
push 5
add

// 最后翻譯為機器指令 匯編代碼和機器指令一一對應
// 機器指令由 1 和 0 組成,以下指令非真實指令,只做演示用
0011101001010101
1101010011100101
0010100111100001

學會編譯原理有什么好處?

對編譯過程內(nèi)部原理的掌握將會使你成為更好的高級程序員。

詞法分析

程序其實就是保存在文本文件中的一系列字符,詞法分析的作用是將這一系列字符按照某種規(guī)則分解成一個個字元(token,也稱為終結(jié)符),忽略空格和注釋。

示例:

// 程序代碼
10 + 5 + 6

// 詞法分析后得到的 token
10
+
5
+
6
終結(jié)符

終結(jié)符就是語言中用到的基本元素,一般不能再被分解。

四則運算中的終結(jié)符包括符號和整數(shù)常量(暫不支持一元操作符)。

符號+ - * / ( )

整數(shù)常量:12、1000、111...

詞法分析代碼實現(xiàn)
function lexicalAnalysis(expression) {
    const symbol = ["(", ")", "+", "-", "*", "/"]
    const re = /d/
    const tokens = []
    const chars = expression.trim().split("")
    let token = ""
    chars.forEach(c => {
        if (re.test(c)) {
            token += c
        } else if (c == " " && token) {
            tokens.push(token)
            token = ""
        } else if (symbol.includes(c)) {
            if (token) {
                tokens.push(token)
                token = ""
            } 

            tokens.push(c)
        }
    })

    if (token) {
        tokens.push(token)
    }

    return tokens
}

console.log(lexicalAnalysis("100    +   23   +    34 * 10 / 2")) 
// ["100", "+", "23", "+", "34", "*", "10", "/", "2"]

編譯原理實戰(zhàn)入門:用 JavaScript 寫一個簡單的四則運算編譯器(一)詞法分析

編譯原理實戰(zhàn)入門:用 JavaScript 寫一個簡單的四則運算編譯器(二)語法分析

編譯原理實戰(zhàn)入門:用 JavaScript 寫一個簡單的四則運算編譯器(三)模擬執(zhí)行

編譯原理實戰(zhàn)入門:用 JavaScript 寫一個簡單的四則運算編譯器(四)結(jié)語

完整源碼

參考資料:計算機系統(tǒng)要素

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/105166.html

相關文章

  • 編譯原理實戰(zhàn)入門 JavaScript 簡單四則運算編譯器(四)結(jié)語

    摘要:四則運算編譯器,雖然說功能很簡單,只能編譯四則運算表達式。再復雜的編譯器再簡單的編譯器,功能上是差不多的,只是復雜的編譯器實現(xiàn)上會更困難。每一章都是理論與實踐結(jié)合的經(jīng)典,從計算機硬件知識到軟件體系,再到編譯原理和操作系統(tǒng)。 四則運算編譯器,雖然說功能很簡單,只能編譯四則運算表達式。但是編譯原理前端部分幾乎都有涉及,詞法分析,語法分析,還有代碼生成。 再復雜的編譯器、再簡單的編譯器,功能...

    chemzqm 評論0 收藏0
  • 編譯原理實戰(zhàn)入門 JavaScript 簡單四則運算編譯器(三)模擬執(zhí)行

    摘要:棧在內(nèi)存中,棧的特點是只能在同一端進行插入和刪除的操作,即只有和兩種操作。指令的作用是將一個操作數(shù)推入棧中。指令的作用是執(zhí)行兩次操作,彈出兩個操作數(shù)和,然后執(zhí)行,再將結(jié)果到棧中。 現(xiàn)在來模擬一下 CPU 執(zhí)行機器指令的情況,由于匯編代碼和機器指令一一對應,所以我們可以創(chuàng)建一個直接執(zhí)行匯編代碼的模擬器。在創(chuàng)建模擬器前,先來講解一下相關指令的操作。 棧 在內(nèi)存中,棧的特點是只能在同一端進行...

    Ku_Andrew 評論0 收藏0
  • 編譯原理實戰(zhàn)入門 JavaScript 簡單四則運算編譯器(二)語法分析

    摘要:語法分析對輸入的文本按照語法規(guī)則進行分析并確定其語法結(jié)構(gòu)的一種過程,稱為語法分析。遞歸下降分析法遞歸下降分析法,也稱為自頂向下分析法。表達式代碼生成我們通常用的四則運算表達式是中綴表達式,但是對于計算機來說中綴表達式不便于計算。 四則運算的語法規(guī)則(語法規(guī)則是分層的) x* 表示 x 出現(xiàn)零次或多次 x | y 表示 x 或 y 將出現(xiàn) ( ) 圓括號,用于語言構(gòu)詞的分組 以下規(guī)則...

    hankkin 評論0 收藏0
  • 重學前端學習筆記(二十八)--通過四則運算解釋器快速理解編譯原理

    摘要:實現(xiàn)狀態(tài)機可能產(chǎn)生四種輸入元素,其中只有兩種,狀態(tài)機的第一個狀態(tài)就是根據(jù)第一個輸入字符來判斷進入了哪種狀態(tài)用函數(shù)表示狀態(tài),用表示狀態(tài)的遷移關系,用值表示下一個狀態(tài)。運行狀態(tài)機輸出結(jié)果四語法分析語法分析根據(jù)每一個產(chǎn)生式來寫一個函數(shù)。 筆記說明 重學前端是程劭非(winter)【前手機淘寶前端負責人】在極客時間開的一個專欄,每天10分鐘,重構(gòu)你的前端知識體系,筆者主要整理學習過程的一些要點...

    Crazy_Coder 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<