简单算术表达式语法分析器
时间: 2023-11-18 20:02:29 浏览: 29
一个简单的算术表达式语法分析器可以通过递归下降分析法实现。下面是一个例子:
```
class SyntaxParser:
def __init__(self, expression):
self.expression = expression
self.index = 0
def parse(self):
return self.parse_expression()
def parse_expression(self):
left_operand = self.parse_term()
while self.index < len(self.expression):
operator = self.expression[self.index]
if operator not in ['+', '-']:
break
self.index += 1
right_operand = self.parse_term()
if operator == '+':
left_operand += right_operand
else:
left_operand -= right_operand
return left_operand
def parse_term(self):
left_operand = self.parse_factor()
while self.index < len(self.expression):
operator = self.expression[self.index]
if operator not in ['*', '/']:
break
self.index += 1
right_operand = self.parse_factor()
if operator == '*':
left_operand *= right_operand
else:
left_operand /= right_operand
return left_operand
def parse_factor(self):
if self.expression[self.index] == '(':
self.index += 1
value = self.parse_expression()
self.index += 1
return value
else:
start = self.index
while self.index < len(self.expression) and self.expression[self.index].isdigit():
self.index += 1
return int(self.expression[start:self.index])
```
在这个例子中,我们定义了一个 `SyntaxParser` 类来解析算术表达式。我们传入要解析的表达式作为构造函数参数,并且定义了三个方法来分别解析表达式、项和因子。
在 `parse_expression` 方法中,我们首先调用 `parse_term` 方法来解析左操作数,并进入一个循环,直到我们到达表达式的末尾或者遇到一个不是加号或减号的运算符。如果是加号,我们解析右操作数并将左右操作数相加,否则将左操作数减去右操作数。最后返回左操作数的值。
在 `parse_term` 方法中,我们首先调用 `parse_factor` 方法来解析左操作数,并进入一个循环,直到我们到达表达式的末尾或者遇到一个不是乘号或除号的运算符。如果是乘号,我们解析右操作数并将左右操作数相乘,否则将左操作数除以右操作数。最后返回左操作数的值。
在 `parse_factor` 方法中,我们首先检查当前字符是否为左括号,如果是,我们解析括号内的表达式并返回其值。否则,我们解析数字并返回其值。
例如,如果我们有一个表达式 `2 + 3 * (4 - 1)`,我们可以这样使用 `SyntaxParser` 类来解析它:
```
parser = SyntaxParser("2 + 3 * (4 - 1)")
result = parser.parse()
print(result)
```
这将输出 `11`,也就是表达式的计算结果。