main.rs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. use anyhow::Result;
  2. use clap::Parser as ClapParser;
  3. use std::fs::read_to_string;
  4. use zkas::{analyzer::Analyzer, compiler::Compiler, lexer::Lexer, parser::Parser};
  5. #[derive(clap::Parser)]
  6. #[clap(name = "zkas", version)]
  7. struct Cli {
  8. /// Place the output into <FILE>
  9. #[clap(short, value_name = "FILE")]
  10. output: Option<String>,
  11. /// Strip debug symbols
  12. #[clap(short)]
  13. strip: bool,
  14. /// Preprocess only; do not compile
  15. #[clap(short)]
  16. evaluate: bool,
  17. /// ZK script to compile
  18. input: String,
  19. }
  20. fn main() -> Result<()> {
  21. let cli = Cli::parse();
  22. let filename = cli.input.as_str();
  23. let source = read_to_string(filename)?;
  24. let lexer = Lexer::new(filename, source.chars());
  25. let tokens = lexer.lex();
  26. let parser = Parser::new(filename, source.chars(), tokens);
  27. let (constants, witnesses, statements) = parser.parse();
  28. let mut analyzer = Analyzer::new(filename, source.chars(), constants, witnesses, statements);
  29. analyzer.analyze_types();
  30. analyzer.analyze_semantic();
  31. if cli.evaluate {
  32. println!("{:#?}", analyzer.constants);
  33. println!("{:#?}", analyzer.witnesses);
  34. println!("{:#?}", analyzer.statements);
  35. println!("{:#?}", analyzer.stack);
  36. return Ok(())
  37. }
  38. let compiler = Compiler::new(
  39. filename,
  40. source.chars(),
  41. analyzer.constants,
  42. analyzer.witnesses,
  43. analyzer.statements,
  44. !cli.strip,
  45. );
  46. let bincode = compiler.compile();
  47. println!("{:?}", bincode);
  48. Ok(())
  49. }