请给出判断所输入字符串是否为四则运算的程序,请使用ll(1)文法 给出词法分析和语法分析
时间: 2024-10-08 17:17:25 浏览: 34
ll1analyzer:LL(1)文法语法分析程序
3星 · 编辑精心推荐
为了编写一个判断输入字符串是否为四则运算表达式的程序,我们可以使用LL(1)文法,它是一种左递归的文法,通常用于描述简单语言结构,如数学表达式。这里是一个简化的LL(1)解析器的示例,我们将使用Python的正则表达式库`re`来完成词法分析,并结合简单的语法规则来检查。
```python
import re
# 定义词法规则
def is_valid_token(token):
# 判断基本运算符、数字和变量
operators = ['+', '-', '*', '/']
numbers = r'\d+'
variables = r'[a-zA-Z_]+'
if token in operators or token.isdigit() or re.match(variables, token):
return True
else:
return False
def lexer(input_string):
tokens = re.findall(r'(?:\d+|[-+*/]|[a-zA-Z_]+)', input_string)
return [token for token in tokens if is_valid_token(token)]
def check_LL1(parsed_tokens):
stack = []
operators = {'+': 1, '-': 1, '*': 2, '/': 2} # 操作数优先级
for token in parsed_tokens:
if token.isdigit():
stack.append(int(token))
elif token in operators:
while stack and stack[-1] != '(' and operators[token] <= operators.get(stack[-1], 0):
yield f"Invalid syntax: {stack.pop()} should be evaluated before {token}"
stack.append(token)
elif token == ')':
while stack[-1] != '(':
yield f"Mismatched parentheses: {stack.pop()}"
stack.pop()
else:
yield f"Illegal character: {token}"
if stack:
yield f"Incomplete expression: missing closing parenthesis"
# 使用示例
expression = "3 + 4 * (5 - 6)"
tokens = lexer(expression)
for error in check_LL1(tokens):
print(error)
阅读全文