寫乙個整數四則運算的解析器 詞法分析部分

2022-07-03 19:36:10 字數 1747 閱讀 6773

寫乙個簡單的詞法、語法分析器,來最終分析出整數四則運算表示式的結果。

為了簡化詞語法分析我們只允許出現0~9,+,-,*,/,空格,\r, \n這幾個字元

詞法分析:

方法1. 狀態機

我們先準備3個判斷方法:

//

是否是數字

function

isnum(letter)

//是否是運算子

function

isoperater(letter)

//是否是間隔符

function

isemptyletter(letter)

定義生成token的函式:

const tokenlist =

function

generatetoken(type, token) );

}

定義狀態轉移函式:

let token =

function

starttoken(letter)

else

if(isoperater(letter))

else

if(isemptyletter(letter))

else

}function

innumber(letter)

else

}

開始詞法分析:

//

要詞法分析的字串

const str = '123* 656 - 644 + 3131'

//分割成乙個個字母

let strarr = str.split('');

//定義狀態機

let state =starttoken

//遍歷字母,不停地更新狀態機

for(let letter of strarr)

//結束

state(symbol('eof'))

generatetoken('eof', 'eof')

得出結果:

方法2. 正則分析

//

要詞法分析的字串

let str = '123* 656 - 644 + 3131'

//過濾間隔符

str = str.replace(/[\r\n ]/g, '')

const operatorregexp = /[+\-*/]/g

//獲取運算的數字token

let numlist =str.split(operatorregexp)

//獲取運算子token

let operatorlist =str.match(operatorregexp)

const tokenlist =

numlist.foreach((item, idx) =>)

if (idx !== numlist.length - 1) )

}})//

結束tokenlist.push()

console.log(tokenlist)

得出結果:

到這裡詞法分析就已經完成了。

寫乙個整數四則運算的解析器 語法分析部分

構建ast 1.先用bnf定義3個語法 運算表示式 加法表示式 乘法表示式 2.按照定義的語法來編寫解析函式 function expression source source.unshift node 出口,如果第0項不是expression,則是抽象語法樹解析錯誤 if source 0 typ...

四則運算的解析

怎樣將字串的算數表示式計算出來?如果使用正規表示式來匹配,有點不怎麼好想,而且一般想法設計到遞迴,而在python中是非常不建議使用遞迴的,因為它不僅有遞迴深度的限制 一般是1000個棧幀 而且不支援尾遞迴優化。最簡單的辦法就是先將表示式轉化為字首表示式,然後通過字首表示式來計算出結果。字首表示式 ...

C 四則運算表示式解析器

程式主要包括 基礎結構定義 詞法分析 語法分析 算術運算 基礎結構定義 列舉 運算元型別 操作符型別 標記型別 有限狀態自動機 結構 運算元 操作符 標記 標記鏈 詞法分析 將字串分解成有效標記 有效的運算元和操作符 生成標記鍊錶。語法分析 分析括弧的有效性,運算元 操作符的排列有效性,操作符與運算...