tecta-peg 0.5.0

PDA-based TECTA PEG parser
Documentation
use std::{env::args, fs};

fn print_char_seq(n: usize, ch: char) {
    for _ in 0..n {
        print!("{ch}");
    }
}

fn main() {
    let contents =
        &fs::read_to_string(args().skip(1).next().expect("expected input grammar file")).unwrap();
    match tecta_peg::parse_module(&contents) {
        Ok(grammar) => println!("{}", grammar),
        Err(error) => {
            let span = error.span();
            let lines = contents.lines().skip(span.start_line - 1);
            for (line_number, line_content) in (span.start_line..=span.end_line).zip(lines) {
                println!("{line_number:>5}: {line_content}");
                print_char_seq(7, ' ');
                if line_number == span.start_line {
                    print_char_seq(span.start_column - 1, ' ');
                    print_char_seq(span.end_column - span.start_column + 1, '^');
                } else if line_number == span.end_line {
                    print_char_seq(span.end_column, '^');
                } else {
                    print_char_seq(line_content.len(), '^');
                }
                println!();
            }
            println!("error: {error}");
        }
    }
}