2016-10-30 62 views
0

這是我的語言的算術表達式:ADD 100 MUL 5 DIV 10 SUB 7 MOD 10 4如何爲此算術表達式編寫語法?

其中ADD =此外,SUB =減法,MUL =乘法,DIV =師,MOD =模。

上述表達式也可以重新編入標準100 + (5 * (10/(7 - (10 % 4)))),括號中包含括號以標記操作順序。

這比標準完全不同,因爲評價與最右邊的操作開始,即MOD 10 4,那麼這個結果隨後被用於評估下一個操作,即SUB 7 2,其中2是模的結果操作。括號不是這個語法所必需的。

我已經得到了從https://ruslanspivak.com/lsbasi-part6/持有的標準符號語法,那就是:

<expr> := <term> ((ADD|SUB) <term>)* 
<term> := <factor> ((MUL|DIV|MOD) <factor>)* 
<factor> := integer 

在我的語言,我在寫算術運算的語法一無所知。上面的語法需要修改嗎?或者我需要寫一個全新的語法?

+0

編寫語法就像編寫程序一樣。您提出了一些代碼/語法片段,您可以決定它是否符合您的期望,如果不符合,則更改它,直到它出現爲止。如果你理解語法,這應該不難。如果你不這樣做,這些經驗將幫助你理解它們。你試圖做什麼來寫你自己的語法或測試這一個是好的? –

+0

我已經成功編寫了解析標準算術表達式(+, - ,*,/,%)的方法和代碼,就像指南所做的那樣,我只是將Python代碼轉換爲C#。我也通過修改指南中的語法成功地解析了一個單獨的操作:':=(ADD | SUB)',但我一直在解決如何使用多個操作解析表達式。 –

回答

-1

我設法通過分析我的代碼中每個生產的執行來解決這個問題。令我驚訝的是,我忘記了在<factor>中包含<expr>生產。改變我的代碼有點移動某些條件,我能夠解析上面的示例表達式。這是在我的語言算術表達式語法:

<expr> := ((ADD|SUB) <term> <term>)* | <term> 
<term> := ((MUL|DIV|MOD) <factor> <factor>)* | <factor> 
<factor> := INTEGER | <expr> 

<expr>生產<factor>使得可以有多個操作,因爲它可以追溯到開始解析下一個操作。

+1

這實際上有效嗎?在我看來,它可以無限擴大expr到expr的範圍......我想你還有更多的工作要做。 –

+0

我用[ironcreek.net](http://ironcreek.net/phpsyntaxtree/)用括號中的短語生成了一個分析樹: '[ [ADD] [ [ 100]] [ [MUL] [ 5] [ [ [ [DIV] [ 10] [ [ [SUB] [ [ 7] [ [MOD] [ 10] [ 4]]]]]]] ]]'據我所知,語法是正確的。是什麼讓你覺得不對? –

+0

你沒有「生成」一個分析樹;看起來你發明了一個你的想象力,並簡單地寫下來。創建答案不是測試解析器的一種方法。用你的語法構建一個真正的解析器,並用它來構建一個解析樹。你會發現你的語法有錯誤。 (關於我的評論,請參閱「1」,這意味着有人同意我的觀點)。要麼使用真正的解析器生成器(ANTLR會這樣做),要麼手寫一個遞歸下降解析器(請參閱http://stackoverflow.com/questions/2245962/is-there-an-alternative-for-flex-bison-that-is-可用上-8位嵌入式系統/ 2336769#2336769)。 –