Implement let expressions
This commit is contained in:
parent
e61385645e
commit
3d1e82b20e
1 changed files with 25 additions and 4 deletions
|
@ -159,7 +159,28 @@ impl Parser {
|
||||||
///
|
///
|
||||||
/// The leading `@let` should already be consumed.
|
/// The leading `@let` should already be consumed.
|
||||||
fn let_expr(&mut self, render: &mut Renderer) -> ParseResult<()> {
|
fn let_expr(&mut self, render: &mut Renderer) -> ParseResult<()> {
|
||||||
self.error("unimplemented")
|
let mut pat = Vec::new();
|
||||||
|
loop {
|
||||||
|
match self.next() {
|
||||||
|
Some(TokenTree { kind: TokenNode::Op('=', _), .. }) => break,
|
||||||
|
Some(token) => pat.push(token),
|
||||||
|
None => return self.error("unexpected end of @let expression"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut expr = Vec::new();
|
||||||
|
let body;
|
||||||
|
loop {
|
||||||
|
match self.next() {
|
||||||
|
Some(TokenTree { kind: TokenNode::Group(Delimiter::Brace, block), .. }) => {
|
||||||
|
body = self.block(block, render)?;
|
||||||
|
break;
|
||||||
|
},
|
||||||
|
Some(token) => expr.push(token),
|
||||||
|
None => return self.error("unexpected end of @let expression"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
render.emit_let(pat.into_iter().collect(), expr.into_iter().collect(), body);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses and renders an element node.
|
/// Parses and renders an element node.
|
||||||
|
@ -187,9 +208,9 @@ impl Parser {
|
||||||
|
|
||||||
/// Parses and renders the attributes of an element.
|
/// Parses and renders the attributes of an element.
|
||||||
fn attrs(&mut self, render: &mut Renderer) -> ParseResult<()> {
|
fn attrs(&mut self, render: &mut Renderer) -> ParseResult<()> {
|
||||||
let mut classes_static: Vec<String> = Vec::new();
|
let mut classes_static = Vec::new();
|
||||||
let mut classes_toggled: Vec<(TokenStream, String)> = Vec::new();
|
let mut classes_toggled = Vec::new();
|
||||||
let mut ids: Vec<String> = Vec::new();
|
let mut ids = Vec::new();
|
||||||
loop {
|
loop {
|
||||||
let start_position = self.input.save();
|
let start_position = self.input.save();
|
||||||
let maybe_name = self.namespaced_name();
|
let maybe_name = self.namespaced_name();
|
||||||
|
|
Loading…
Add table
Reference in a new issue