-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

前三行只是一些初始化的东西。在那之后,我会在第四行用正则表达式做一个堆栈。(?:[A-Z])匹配变量,(?:[0-9]+)匹配数字(可能有多个数字)并(?:[/*+_=\(\)-])匹配所有运算符。大括号已转义,并且-在最后,因此您不必转义它。

第五和第六行打印堆栈。

我使用(?: ...)是因为我不想匹配任何一组。很难解释 - 只要尝试不运行它?:,您就会看到效果。

于 2013-03-28T13:29:16.847 回答