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

2022-07-03 19:36:10 字數 2552 閱讀 2988

構建ast

1. 先用bnf定義3個語法

運算表示式

::= 加法表示式

::= | <+>| <->乘法表示式

::= | <*>|

2.按照定義的語法來編寫解析函式

function

expression(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後,我們要做的就很簡單了,就是遞迴執行

function

evaluate(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 四則運算表示式解析器

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