lang: rewrite parser
This commit is contained in:
parent
6d8b79e8f7
commit
381ab45edc
25 changed files with 524 additions and 1161 deletions
14
crates/lang/src/parser/grammar/expression.rs
Normal file
14
crates/lang/src/parser/grammar/expression.rs
Normal file
|
@ -0,0 +1,14 @@
|
|||
use crate::parser::{syntax_kind::SyntaxKind::*, Parser};
|
||||
|
||||
use self::{instruction::instr, lit::literal};
|
||||
|
||||
mod instruction;
|
||||
mod lit;
|
||||
|
||||
pub fn expression(p: &mut Parser) {
|
||||
let expr = p.start();
|
||||
|
||||
instr(p);
|
||||
|
||||
expr.complete(p, EXPR);
|
||||
}
|
30
crates/lang/src/parser/grammar/expression/instruction.rs
Normal file
30
crates/lang/src/parser/grammar/expression/instruction.rs
Normal file
|
@ -0,0 +1,30 @@
|
|||
use crate::parser::{syntax_kind::SyntaxKind::*, Parser};
|
||||
|
||||
use super::lit::literal;
|
||||
|
||||
pub fn instr(p: &mut Parser) {
|
||||
let instr = p.start();
|
||||
|
||||
instr_name(p);
|
||||
instr_params(p);
|
||||
|
||||
instr.complete(p, INSTR);
|
||||
}
|
||||
|
||||
fn instr_name(p: &mut Parser) {
|
||||
let instr_name = p.start();
|
||||
|
||||
while p.at(IDENT) {
|
||||
p.do_bump();
|
||||
}
|
||||
|
||||
instr_name.complete(p, INSTR_NAME);
|
||||
}
|
||||
|
||||
fn instr_params(p: &mut Parser) {
|
||||
if let Some(start) = literal(p) {
|
||||
while literal(p).is_some() {}
|
||||
|
||||
start.precede(p).complete(p, INSTR_PARAMS);
|
||||
}
|
||||
}
|
20
crates/lang/src/parser/grammar/expression/lit.rs
Normal file
20
crates/lang/src/parser/grammar/expression/lit.rs
Normal file
|
@ -0,0 +1,20 @@
|
|||
use enumset::enum_set;
|
||||
|
||||
use crate::parser::{
|
||||
syntax_kind::{SyntaxKind::*, TokenSet},
|
||||
CompletedMarker, Parser,
|
||||
};
|
||||
|
||||
const LIT_TOKENS: TokenSet = enum_set!(INT_NUM | FLOAT_NUM | STRING);
|
||||
|
||||
pub fn literal(p: &mut Parser) -> Option<CompletedMarker> {
|
||||
if !LIT_TOKENS.contains(p.current()) {
|
||||
return None;
|
||||
}
|
||||
|
||||
let lit = p.start();
|
||||
|
||||
p.do_bump();
|
||||
|
||||
Some(lit.complete(p, LITERAL))
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue