main.rs 2.1 KB

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