summaryrefslogtreecommitdiff
path: root/audio/src/parse/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'audio/src/parse/mod.rs')
-rw-r--r--audio/src/parse/mod.rs32
1 files changed, 26 insertions, 6 deletions
diff --git a/audio/src/parse/mod.rs b/audio/src/parse/mod.rs
index 726aaa2..895ddbd 100644
--- a/audio/src/parse/mod.rs
+++ b/audio/src/parse/mod.rs
@@ -1,13 +1,33 @@
use crate::program::Instruction;
+use lexer::{Lexer, TokenKind};
use parser::Parser;
+use pos::Span;
-pub type Result<T> = std::result::Result<T, String>;
-
-mod lex;
+mod lexer;
mod macros;
mod parser;
+mod pos;
+mod util;
+
+pub type Result<T> = std::result::Result<T, ParserError>;
+
+#[derive(Clone, Debug)]
+pub struct ParserError {
+ pub span: Span,
+ pub msg: String,
+ pub file: Option<String>,
+}
-pub fn parse(raw_src: &str) -> Result<Vec<Instruction>> {
- let src = macros::process(raw_src);
- Parser::new(&src).parse()
+pub fn parse(src: &str) -> Result<Vec<Instruction>> {
+ let mut tokens = vec![];
+ let mut lexer = Lexer::new(src);
+ loop {
+ let token = lexer.next_token()?;
+ tokens.push(token);
+ if token.kind == TokenKind::Eof {
+ break;
+ }
+ }
+ tokens = macros::process(tokens)?;
+ Parser::new(tokens).parse()
}