一个完整的语法解析器例子
时间: 2024-05-15 09:16:27 浏览: 37
下面是一个简单的语法解析器例子,用于解析四则运算表达式:
```
// 定义语法规则
expr ::= term ((PLUS | MINUS) term)*
term ::= factor ((MUL | DIV) factor)*
factor ::= INTEGER | LPAREN expr RPAREN
// 定义词法规则
INTEGER : [0-9]+
PLUS : '+'
MINUS : '-'
MUL : '*'
DIV : '/'
LPAREN : '('
RPAREN : ')'
// 解析器实现
class Parser:
def __init__(self, lexer):
self.lexer = lexer
self.current_token = self.lexer.get_next_token()
def error(self):
raise Exception('Invalid syntax')
def eat(self, token_type):
if self.current_token.type == token_type:
self.current_token = self.lexer.get_next_token()
else:
self.error()
def factor(self):
token = self.current_token
if token.type == 'INTEGER':
self.eat('INTEGER')
return int(token.value)
elif token.type == 'LPAREN':
self.eat('LPAREN')
result = self.expr()
self.eat('RPAREN')
return result
def term(self):
result = self.factor()
while self.current_token.type in ('MUL', 'DIV'):
token = self.current_token
if token.type == 'MUL':
self.eat('MUL')
result = result * self.factor()
elif token.type == 'DIV':
self.eat('DIV')
result = result / self.factor()
return result
def expr(self):
result = self.term()
while self.current_token.type in ('PLUS', 'MINUS'):
token = self.current_token
if token.type == 'PLUS':
self.eat('PLUS')
result = result + self.term()
elif token.type == 'MINUS':
self.eat('MINUS')
result = result - self.term()
return result
```
使用方法:
```
lexer = Lexer('2 + 3 * (4 - 2)')
parser = Parser(lexer)
result = parser.expr()
print(result) # 8
```