構建ast
1. 先用bnf定義3個語法
運算表示式::= 加法表示式
::= | <+>| <->乘法表示式
::= | <*>|
2.按照定義的語法來編寫解析函式
functionexpression(source)
source.unshift(node)
}//出口,如果第0項不是expression,則是抽象語法樹解析錯誤
if (source[0].type === 'expression')
else
}function
addexpression(source)
source.shift();
source.unshift(node)
//繼續遞迴,尋求合併
return
addexpression(source);
}//addexpression聚合
if (source[0].type === 'addexpression' && source[1] && (source[1].type === '+' || source[1].type === '-'))
multipleexpression(source)
node.children.push(source.shift())
source.unshift(node)
//繼續遞迴,尋求合併
return
addexpression(source);
}//source[0]位置盡可能多地聚合出乙個multipleexpression
multipleexpression(source)
//遞迴出口,如果第0項不是addexpression,則一直遞迴自己
if (source[0].type === 'addexpression')
//遞迴自己
return
addexpression(source)
}function
multipleexpression(source)
source.shift();
source.unshift(node)
//繼續遞迴,尋求合併
return
multipleexpression(source);}//
multipleexpression聚合
if (source[0].type === 'multipleexpression' && source[1] && (source[1].type === '*' || source[1].type === '/'))
node.children.push(source.shift())
source.unshift(node)
//繼續遞迴,尋求合併
return
multipleexpression(source);
}//遞迴出口,如果第0項不是multipleexpression,則一直遞迴自己
if (source[0].type === 'multipleexpression')
}
3. 呼叫
//上節詞法分析獲取的詞
let tokenlist =[
, ,
, ,
, ,
, ]const ast =expression(tokenlist)
//列印出解析出來的ast
console.log(ast)
解析執行
得到上述的ast後,我們要做的就很簡單了,就是遞迴執行
functionevaluate(node)
if (node.type === 'addexpression')
if (node.operator === '-')
return evaluate(node.children[0])
}if (node.type === 'multipleexpression')
if (node.operator === '/')
return evaluate(node.children[0])
}if (node.type === 'number')
}
到此整個四則運算的解析過程已經完成了。
我們看到,其實整個過程就是詞法分析、語法分析、解析執行
詞法分析我們可以用比較麻煩的狀態機,或者相對簡潔的正則
相對比較困難的是語法分析,首先我們要定義語法,然後根據定義的語法,把詞構建成ast抽象語法樹
解析執行過程是最簡單的了,就是根據語法定義,遞迴處理ast語法樹就可以了
寫乙個整數四則運算的解析器 詞法分析部分
寫乙個簡單的詞法 語法分析器,來最終分析出整數四則運算表示式的結果。為了簡化詞語法分析我們只允許出現0 9,空格,r,n這幾個字元 詞法分析 方法1.狀態機 我們先準備3個判斷方法 是否是數字 function isnum letter 是否是運算子 function isoperater lett...
四則運算的解析
怎樣將字串的算數表示式計算出來?如果使用正規表示式來匹配,有點不怎麼好想,而且一般想法設計到遞迴,而在python中是非常不建議使用遞迴的,因為它不僅有遞迴深度的限制 一般是1000個棧幀 而且不支援尾遞迴優化。最簡單的辦法就是先將表示式轉化為字首表示式,然後通過字首表示式來計算出結果。字首表示式 ...
C 四則運算表示式解析器
程式主要包括 基礎結構定義 詞法分析 語法分析 算術運算 基礎結構定義 列舉 運算元型別 操作符型別 標記型別 有限狀態自動機 結構 運算元 操作符 標記 標記鏈 詞法分析 將字串分解成有效標記 有效的運算元和操作符 生成標記鍊錶。語法分析 分析括弧的有效性,運算元 操作符的排列有效性,操作符與運算...