2020-09-01 17:32:48 -07:00
|
|
|
use cfgrammar::yacc::YaccKind;
|
|
|
|
|
use lrlex::LexerBuilder;
|
|
|
|
|
use lrpar::CTParserBuilder;
|
2020-09-17 13:26:38 -07:00
|
|
|
use rerun_except::rerun_except;
|
2020-09-01 17:32:48 -07:00
|
|
|
|
|
|
|
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
2020-09-17 13:26:38 -07:00
|
|
|
// Skip rerunning if it's just *.not files that have changed
|
|
|
|
|
rerun_except(&["*.not"]).unwrap();
|
|
|
|
|
|
|
|
|
|
// Build parser + lexer
|
2020-09-01 17:32:48 -07:00
|
|
|
let mut parser_builder = CTParserBuilder::new()
|
|
|
|
|
.yacckind(YaccKind::Grmtools)
|
|
|
|
|
.error_on_conflicts(false);
|
2020-10-20 16:21:50 -07:00
|
|
|
let lex_rule_ids_map = parser_builder.process_file_in_src("syn/parser.y")?;
|
2020-09-01 17:32:48 -07:00
|
|
|
if let Some((grm, _, _, conflicts)) = parser_builder.conflicts() {
|
|
|
|
|
eprintln!("{}", conflicts.pp(grm));
|
|
|
|
|
return Err("conflicts in parser".into());
|
|
|
|
|
}
|
|
|
|
|
LexerBuilder::new()
|
|
|
|
|
.rule_ids_map(lex_rule_ids_map)
|
|
|
|
|
.process_file_in_src("syn/lexer.l")?;
|
|
|
|
|
Ok(())
|
|
|
|
|
}
|