Add lexer dump to main and fix a couple of bugs
Signed-off-by: Alek Ratzloff <alekratz@gmail.com>
This commit is contained in:
27
src/main.rs
27
src/main.rs
@@ -2,6 +2,29 @@ mod common;
|
|||||||
//mod syn;
|
//mod syn;
|
||||||
mod vm;
|
mod vm;
|
||||||
|
|
||||||
fn main() {
|
use std::{
|
||||||
println!("Hello, world!");
|
io::{self, Read},
|
||||||
|
process,
|
||||||
|
};
|
||||||
|
|
||||||
|
type Result<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||||
|
|
||||||
|
fn get_input_string() -> io::Result<String> {
|
||||||
|
let mut buffer = String::new();
|
||||||
|
io::stdin().read_to_string(&mut buffer)?;
|
||||||
|
Ok(buffer)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<()> {
|
||||||
|
use vm::syn::parser::ProgramParser;
|
||||||
|
let contents = get_input_string()?;
|
||||||
|
let ast = match ProgramParser::new().parse(&contents) {
|
||||||
|
Ok(ast) => ast,
|
||||||
|
Err(err) => {
|
||||||
|
eprintln!("{}", err);
|
||||||
|
process::exit(1);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
println!("{:?}", ast);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use crate::vm::{inst::Inst, reg::Reg};
|
use crate::vm::inst::Inst;
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum Line {
|
pub enum Line {
|
||||||
@@ -10,6 +10,7 @@ pub enum Line {
|
|||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum Directive {
|
pub enum Directive {
|
||||||
Section(String),
|
Section(String),
|
||||||
|
Org(Value),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ Value: Value = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Label: String = {
|
Label: String = {
|
||||||
"[a-zA-Z]+" => String::from(<>),
|
r"[a-zA-Z]+" => String::from(<>),
|
||||||
}
|
}
|
||||||
|
|
||||||
Number: u64 = {
|
Number: u64 = {
|
||||||
@@ -69,11 +69,16 @@ Inst: Inst = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Directive: Directive = {
|
Directive: Directive = {
|
||||||
".section" <s:Label> => Directive::Section(s.to_string()),
|
r"\.section" <s:Label> => Directive::Section(s.to_string()),
|
||||||
|
r"\.org" <v:Value> => Directive::Org(v),
|
||||||
}
|
}
|
||||||
|
|
||||||
pub Line: Line = {
|
Line: Line = {
|
||||||
<Directive> => Line::Directive(<>),
|
<Directive> => Line::Directive(<>),
|
||||||
<Inst> => Line::Inst(<>),
|
<Inst> => Line::Inst(<>),
|
||||||
<LabelDef> => Line::LabelDef(<>),
|
<LabelDef> => Line::LabelDef(<>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub Program: Vec<Line> = {
|
||||||
|
<Line*> => <>,
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user