寫乙個簡單的詞法、語法分析器,來最終分析出整數四則運算表示式的結果。
為了簡化詞語法分析我們只允許出現0~9,+,-,*,/,空格,\r, \n這幾個字元
詞法分析:
方法1. 狀態機
我們先準備3個判斷方法:
//定義生成token的函式:是否是數字
function
isnum(letter)
//是否是運算子
function
isoperater(letter)
//是否是間隔符
function
isemptyletter(letter)
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 四則運算表示式解析器
程式主要包括 基礎結構定義 詞法分析 語法分析 算術運算 基礎結構定義 列舉 運算元型別 操作符型別 標記型別 有限狀態自動機 結構 運算元 操作符 標記 標記鏈 詞法分析 將字串分解成有效標記 有效的運算元和操作符 生成標記鍊錶。語法分析 分析括弧的有效性,運算元 操作符的排列有效性,操作符與運算...