-1

ファイルからの入力として式を受け取るパーサーを作成しようとしています。

式は A=B=10 または B=(CA)-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 文字を超えてはなりません。一番左の演算子は常に「=」代入演算子です。'=' 常に変数 [AZ] が先行し、演算子は {'+','-','/','*','_'}、数字 {0-9} です。

最初に最初の変数を抽出し、それを python リストにプッシュし、次に「=」演算子、次に「(」、「AZ」のいずれかでスタックにプッシュするなど

誰かがこの問題を手伝ってくれませんか。私は問題に圧倒されています..

説明を理解できない場合は、このリンクにアクセスしてください

4

1 に答える 1

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

最初の 3 行は初期化のみです。その後、4 行目の正規表現でスタックを作成します。(?:[A-Z])variable に(?:[0-9]+)一致し、number (複数の数字を含む場合もあります) に(?:[/*+_=\(\)-])一致し、すべての演算子に一致します。中括弧はエスケープ-され、最後にあるため、エスケープする必要はありません。

5 行目と 6 行目でスタックを出力します。

(?: ...)どちらのグループとも一致させたくないので使用しました。説明するのは難しいです - せずに実行してみるだけで?:、効果がわかります。

于 2013-03-28T13:29:16.847 に答える