main.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. /// Interactive semantic analysis
  23. #[clap(short)]
  24. interactive: bool,
  25. /// Examine decoded bytecode
  26. #[clap(long)]
  27. examine: bool,
  28. /// ZK script to compile
  29. input: String,
  30. }
  31. fn main() -> Result<()> {
  32. let cli = Cli::parse();
  33. let filename = cli.input.as_str();
  34. let source = read_to_string(filename)?;
  35. let lexer = Lexer::new(filename, source.chars());
  36. let tokens = lexer.lex();
  37. let parser = Parser::new(filename, source.chars(), tokens);
  38. let (constants, witnesses, statements) = parser.parse();
  39. let mut analyzer = Analyzer::new(filename, source.chars(), constants, witnesses, statements);
  40. analyzer.analyze_types();
  41. if cli.interactive {
  42. analyzer.analyze_semantic();
  43. }
  44. if cli.evaluate {
  45. println!("{:#?}", analyzer.constants);
  46. println!("{:#?}", analyzer.witnesses);
  47. println!("{:#?}", analyzer.statements);
  48. println!("{:#?}", analyzer.stack);
  49. return Ok(())
  50. }
  51. let compiler = Compiler::new(
  52. filename,
  53. source.chars(),
  54. analyzer.constants,
  55. analyzer.witnesses,
  56. analyzer.statements,
  57. !cli.strip,
  58. );
  59. let bincode = compiler.compile();
  60. let output: String;
  61. if let Some(o) = cli.output {
  62. output = o;
  63. } else {
  64. output = format!("{}.bin", cli.input);
  65. }
  66. let mut file = File::create(&output)?;
  67. file.write_all(&bincode)?;
  68. println!("Wrote output to {}", &output);
  69. if cli.examine {
  70. let zkbin = ZkBinary::decode(&bincode)?;
  71. println!("{:#?}", zkbin);
  72. }
  73. Ok(())
  74. }