parser: improve readability i guess

This commit is contained in:
anna 2021-04-15 01:51:58 +02:00
parent 1f86885424
commit 83441a7b57
Signed by: fef
GPG key ID: EC22E476DC2D3D84

View file

@ -15,23 +15,23 @@ impl <'a> Parser<'a> {
}
}
fn parse_node(&mut self, first: Token) -> Result<Node, SyntaxError> {
match first.kind {
TokenKind::Ident(name) => self.require_kind(
TokenKind::Eq
).and_then(|_| {
self.require_next()
}).and_then(|token| match token.kind {
TokenKind::TrueKeyword => self.make_node_result(name, NodeVal::Bool(true)),
TokenKind::FalseKeyword => self.make_node_result(name, NodeVal::Bool(false)),
TokenKind::IntLiteral(i) => self.make_node_result(name, NodeVal::Int(i)),
TokenKind::StringLiteral(s) => self.make_node_result(name, NodeVal::String(String::from(s))),
_ => self.lexer.syntax_error(String::from("Expected a value")),
}).and_then(|node| {
self.require_kind(TokenKind::Semi).and_then(|_| Ok(node))
}),
fn parse_node(&mut self) -> Option<Result<Node, SyntaxError>> {
Some(self.lexer.next()?.and_then(|token| match token.kind {
TokenKind::Ident(name) => {
self.require_kind(TokenKind::Eq ).and_then(|_| {
self.require_next()
}).and_then(|token| match token.kind {
TokenKind::TrueKeyword => self.node_result(name, NodeVal::Bool(true)),
TokenKind::FalseKeyword => self.node_result(name, NodeVal::Bool(false)),
TokenKind::IntLiteral(i) => self.node_result(name, NodeVal::Int(i)),
TokenKind::StringLiteral(s) => self.node_result(name, NodeVal::String(s)),
_ => self.lexer.syntax_error(String::from("Expected a value")),
}).and_then(|node| {
self.require_kind(TokenKind::Semi).and_then(|_| Ok(node))
})
},
_ => self.lexer.syntax_error(String::from("Expected identifier")),
}
}))
}
fn require_kind(&mut self, kind: TokenKind) -> Result<Token, SyntaxError> {
@ -51,7 +51,7 @@ impl <'a> Parser<'a> {
}
}
fn make_node_result<T>(&self, name: String, val: NodeVal) -> Result<Node, T> {
fn node_result<T>(&self, name: String, val: NodeVal) -> Result<Node, T> {
Ok(self.make_node(name, val))
}
@ -67,10 +67,7 @@ impl <'a> Iterator for Parser<'a> {
type Item = Result<Node, SyntaxError>;
fn next(&mut self) -> Option<Result<Node, SyntaxError>> {
Some(match self.lexer.next()? {
Ok(t) => self.parse_node(t),
Err(e) => Err(e),
})
self.parse_node()
}
}