2013-03-28 25 views
-1

我正在嘗試編寫一個解析器,它將表達式作爲文件的輸入。計算器的Python解析器

表達式可以是A = B = 10或B =(C-A)-4等

我迄今嘗試是。我讀文件IP.txt

import re 

opert = '+-/*()_=' 
fileName = "input.txt" 
f = open(fileName,'r') 

variableDict = {} 
lines = f.readlines() 

for i in lines: 

    for x in re.finditer(r'[A-Z_]\w*', i): 
     print x.group() # prints list containing all the alphabets. 

    for z in re.finditer(r'[0-9]\d*', i): 
     print z.group() # prints list containing all the numbers. 

    for c in i: 
     if c in opert: 
      print C# prints all the operators. 

    # '_' has special meaning. '_' can only be used before numbers only like _1 or _12 etc 
    #And i have parsed this also using 
     print re.findall(r'[_][0-9]\d+',i) # prints the _digits combination. 

現在的問題是我在我應該怎麼用表達式求值繼續已經達成。 首先,我必須提到的有關上述輸入的一些規則是。 沒有一行應該大於50個字符。 最左邊的運算符總是'='賦值運算符。 '='總是在變量[A-Z]之前,運算符是{'+',' - ','/','*','_'},數字{0-9}。

我應該如何首先提取第一變量,然後將它推入蟒蛇名單,然後「=」操作符,然後是「(」,「AZ」推入堆棧等

有人能幫助我問題。我不知所措的問題..

如果任何一個無法理解的描述請goto this link

+0

您需要在那裏修正縮進。實際上,混合選項卡和空格不適用於堆棧溢出。 –

+0

對不起,格式化我是新的在stackoverflow學習如何正確使用它。 –

+0

您可能的起點:[評估字符串中的數學表達式](http://stackoverflow.com/a/2371789/222914) –

回答

1

所以,你問的問題堆棧,這當然需要進行評估。我會做一些像這樣:

import re #1 
stack = [] #2 FIX: NOT NECESSARY (since fourth line returns a list anyway) 
inputstr = "A=B=C+26-(23*_2)-D" #3 

stack = re.findall(r'(?:[A-Z])|(?:[0-9]+)|(?:[/*+_=\(\)-])', inputstr) #4 

while len(stack): #5 
    print stack.pop() #6 

前三行只是一些init的東西。之後,我會在第四行中使用正則表達式進行堆棧。 (?:[A-Z])匹配變量,(?:[0-9]+)匹配號碼(可能有多個數字)和(?:[/*+_=\(\)-])匹配所有運營商。大括號是逃脫,-是最後,所以你不必逃避它。

第五行和第六行打印堆棧。我使用(?: ...)因爲我不想匹配任何一組。很難解釋 - 只要嘗試運行它沒有?:,你會看到效果。

+0

謝謝你,我正在嘗試你的方法..我希望它能解決我的問題。 。再次感謝.. –

+0

你不需要預先分配'stack' ...另外,僅僅解釋正則表達式就足夠了。 – pradyunsg

+0

你對第二行是正確的 - 我現在就解決它。當然,我正在解釋正則表達式就足夠了 - 因爲通過這個正則表達式,他可以在代碼的一行中構建一個評估堆棧。這條線的意義實際上就是那個正則表達式(其餘的代碼對功能來說並不重要)。 – ceruleus