根据编译原理课程要求,用python 构造一个可以运行的递归下降分析程序,要求有一个界面,根据用户输入的文法,输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“acc”,否则输出“error”,并指出语法错误的类型及位置,并输出整个分析过程,并且给出示例
时间: 2024-11-09 19:21:03 浏览: 10
在Python中,构造一个递归下降解析器通常涉及到词法分析、语法分析以及构建语法树等步骤。这里提供一个简单的框架,用于处理上下文无关文法(CFG)。我们将使用`argparse`库创建命令行接口,`pyparsing`库进行词法分析,`re`库匹配文法模式。
首先安装所需的库(如果尚未安装):
```bash
pip install pyparsing argparse
```
然后编写核心解析器代码:
```python
import argparse
import re
from pyparsing import Word, alphas, nums, ParseException
class RecursiveDescentParser:
def __init__(self, grammar):
self.grammar = grammar
# 使用正则表达式表示文法符号
self.non_terminals = {term.upper(): term for term in grammar['non_terminals']}
self.terminals = set(self.grammar[' terminals']) | {'#'}
def parse(self, input_str):
tokens = self.tokenize(input_str)
return self.parse_tokens(tokens)
def tokenize(self, input_str):
return [token.strip() for token in re.findall(r"(\w+|\S)", input_str) if token]
def parse_tokens(self, tokens):
try:
if not tokens:
raise Exception("Empty input")
if tokens[0] != '#':
raise ValueError(f"Expected '#' at the end of the sentence, got '{tokens[0]}'")
result = self.non_terminals.get(tokens.pop(0), tokens.pop(0)) # 如果第一个不是非终端,尝试识别终端
if not result: # 非法输入
raise ParseException(f"Invalid input: cannot match '{result}'")
while tokens:
rule_match = self.match_rule(result, tokens)
if rule_match is None:
raise ParseException(f"Syntax error at position {len(tokens)}: expected {', '.join(rule_match)}")
result = rule_match[1]
except IndexError as e:
raise ParseException(f"Syntax error: unexpected end of input") from e
return "acc"
def match_rule(self, left, tokens):
# 实现对应文法规则的函数,例如:A -> B C 或 A -> a | b
pass # 根据你的文法填写规则匹配逻辑
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Recursive Descent Parser")
parser.add_argument("input", type=str, help="Input string with non-terminals and terminals separated by spaces, ending with '#'")
args = parser.parse_args()
grammar = {
'non_terminals': ['S', 'A', 'B'],
'terminals': ['a', 'b', 'c'],
'productions': [
('S', 'A B'),
('A', 'a'),
('A', 'b'),
('B', 'c')
]
}
parser = RecursiveDescentParser(grammar)
result = parser.parse(args.input)
print(f"{result}")
```
在这个示例中,你需要根据你的文法提供`match_rule`函数的具体实现。这个例子只是一个基本模板,实际文法和解析规则需要你根据给定的文法来编写。
阅读全文