1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
use std::fs::File;
use std::io::{BufReader, BufWriter};
use std::path::{Path, PathBuf};

use crate::error::Error;
use crate::scanner::Scanner;

mod charclasses;
mod codegen;
mod dfa;
mod error;
mod nfa;
mod scanner;

pub fn process<T: AsRef<Path>>(path: T, output: Option<T>) -> Result<(), Error> {
    let f = File::open(path.as_ref())?;
    let mut reader = BufReader::new(f);
    let mut scanner = Scanner::new(&mut reader);

    scanner.scan()?;
    scanner.build();

    let path = if let Some(p) = output {
        PathBuf::from(p.as_ref())
    } else {
        path.as_ref().with_extension("rs")
    };

    let file = File::create(path)?;
    let mut writer = BufWriter::new(file);
    scanner.generate(&mut writer)?;
    Ok(())
}