main.rs 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. use anyhow::Result;
  2. use clap::Parser as ClapParser;
  3. use std::{
  4. fs::{read_to_string, File},
  5. io::Write,
  6. };
  7. use zkas::{
  8. analyzer::Analyzer, compiler::Compiler, decoder::ZkBinary, lexer::Lexer, parser::Parser,
  9. };
  10. #[derive(clap::Parser)]
  11. #[clap(name = "zkas", version)]
  12. struct Cli {
  13. /// Place the output into <FILE>
  14. #[clap(short, value_name = "FILE")]
  15. output: Option<String>,
  16. /// Strip debug symbols
  17. #[clap(short)]
  18. strip: bool,
  19. /// Preprocess only; do not compile
  20. #[clap(short)]
  21. evaluate: bool,
  22. /// Examine decoded bytecode
  23. #[clap(long)]
  24. examine: bool,
  25. /// ZK script to compile
  26. input: String,
  27. }
  28. fn main() -> Result<()> {
  29. let cli = Cli::parse();
  30. let filename = cli.input.as_str();
  31. let source = read_to_string(filename)?;
  32. let lexer = Lexer::new(filename, source.chars());
  33. let tokens = lexer.lex();
  34. let parser = Parser::new(filename, source.chars(), tokens);
  35. let (constants, witnesses, statements) = parser.parse();
  36. let mut analyzer = Analyzer::new(filename, source.chars(), constants, witnesses, statements);
  37. analyzer.analyze_types();
  38. analyzer.analyze_semantic();
  39. if cli.evaluate {
  40. println!("{:#?}", analyzer.constants);
  41. println!("{:#?}", analyzer.witnesses);
  42. println!("{:#?}", analyzer.statements);
  43. println!("{:#?}", analyzer.stack);
  44. return Ok(())
  45. }
  46. let compiler = Compiler::new(
  47. filename,
  48. source.chars(),
  49. analyzer.constants,
  50. analyzer.witnesses,
  51. analyzer.statements,
  52. !cli.strip,
  53. );
  54. let bincode = compiler.compile();
  55. let output: String;
  56. if let Some(o) = cli.output {
  57. output = o;
  58. } else {
  59. output = format!("{}.bin", cli.input);
  60. }
  61. let mut file = File::create(&output)?;
  62. file.write_all(&bincode)?;
  63. println!("Wrote output to {}", &output);
  64. if cli.examine {
  65. let zkbin = ZkBinary::decode(&bincode)?;
  66. println!("{:#?}", zkbin);
  67. }
  68. Ok(())
  69. }