peg 0.3.13

A parser generator built on the Parsing Expression Grammar (PEG) formalism.
#![feature(quote, box_syntax, placement_in_syntax, rustc_private, box_patterns, slice_patterns)]
#[macro_use] extern crate syntax;

use std::env;
use std::fs::File;
use std::io::{Read, Write};
use std::io::{stdin, stdout, stderr};
use std::path::Path;
use std::process;
use translate::{compile_grammar};

mod translate;
mod grammar;
mod rustast;
mod fake_extctxt;

fn print_usage(prog: &str) {
	println!("Usage: {} [file]", prog)
}

fn main() {
	let args = env::args_os().collect::<Vec<_>>();
	let progname = args[0].to_str().unwrap();

	let mut source = String::new();
	match &args[1..] {
		&[ref arg] if arg.to_str() == Some("-h") => return print_usage(progname),
		&[ref fname] => File::open(&Path::new(fname.to_str().unwrap())).unwrap().read_to_string(&mut source).unwrap(),
		&[] => stdin().read_to_string(&mut source).unwrap(),
		_ => return print_usage(progname),
	};

	let grammar_def = grammar::grammar(&source);

	match grammar_def {
		Ok(grammar) => {
			fake_extctxt::with_fake_extctxt(|e| {

				let ast = compile_grammar(e, &grammar);
				let mut out = stdout();

				writeln!(&mut out, "// Generated by rust-peg. Do not edit.").unwrap();
				writeln!(&mut out, "#![allow(non_snake_case, unused)]").unwrap();

				for item in ast.items.iter() {
					writeln!(&mut out, "{}", &rustast::item_to_string(&**item)).unwrap();
				}
			})
		}

		Err(msg) => {
			let mut e = stderr();
			(writeln!(&mut e, "Error parsing language specification: {}", msg)).unwrap();
			process::exit(1);
		}
	}
}