用于计算器的Python解析器

用于计算器的Python解析器,python,regex,stack,automata,Python,Regex,Stack,Automata,我正在尝试编写一个解析器,它将表达式作为文件的输入 表达式可以是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*

我正在尝试编写一个解析器,它将表达式作为文件的输入

表达式可以是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}

我应该如何首先提取第一个变量,然后将其推入python列表,然后使用“=”运算符,然后使用“(”、“A-Z”将其推入堆栈,依此类推

有人能帮我解决这个问题吗我被这个问题弄得不知所措


如果有人不能理解描述,请

因此,您询问了堆栈问题,当然需要评估。我会这样做:

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内容。之后,我将在第四行用regex做一个堆栈。
(?:[a-Z])
匹配变量,
(?:[0-9]+)
匹配数字(可能有多个数字)和
(?:[/*+\(\)-)
匹配所有运算符。大括号被转义,并且
-
位于末尾,因此您不必转义它

第五行和第六行打印堆栈


我用了
(?:…)
因为我不想匹配任何一组。很难解释-只要试着在没有
?:
的情况下运行它,你就会看到效果。

你需要修复那里的缩进。混合制表符和空格对堆栈溢出不起作用,真的。很抱歉,我在堆栈溢出方面是新手,正在学习如何正确使用它。一个可能的明星ting point for you:谢谢,伙计,我正在尝试你的方法。我希望它能解决我的问题。再次感谢。你不需要事先分配
堆栈
,而且,仅仅解释正则表达式是什么就足够了。你对第二行的看法是正确的-我现在就解决它。当然,我解释正则表达式就足够了-因为有了正则表达式,他就可以只在代码的一行中创建一个用于求值的堆栈,而这一行的全部含义实际上就是regex(代码的其余部分对功能并不重要)。