Need somebody good in C++ and rust programming on urgent basis
extern crate regex; use std::env; use std::fs; use std::collections::BTreeMap; use regex::Regex; struct Parser { target: String, //keys are variable names, values are variable values symbol_table: BTreeMap<String, String>, } impl Parser { // a program is a list of statements fn parse(&mut self) { self.statement_list(&self.target.clone()); } //a list of statements is a statement, a new line, and then more statments fn statement_list(&mut self, s:&str) { //breaks the program into lines let statements = s.lines(); for lines in statements { //evaluates each line as a statement self.statement(lines); } } //a statement is an assignment statement or a print statement fn statement(&mut self, s:&str) { let tokens: Vec<&str> = s.split(' ').collect(); if tokens[0] == "PRINT" { self.print_statement(s); } else { self.assignment_statement(s); } } //a print statement is PRINT variable fn print_statement(&mut self, s:&str) { let tokens: Vec<&str> = s.split(' ').collect(); if tokens.len() > 1 { let var = String::from(tokens[1]); self.variable(&var); if self.symbol_table.get(&var) == None { println!("Error, variable {} is not initialized", var); panic!(); } else { println!("{}", self.symbol_table.get(var.as_str()).unwrap()); } }else { //error when nothing follows PRINT println!("Error, expected variable after keyword PRINT"); panic!(); } } //an assignment statment is variable " = " expression fn assignment_statement(&mut self, s:&str) { let first = s.split_once(" ").unwrap(); let var = String::from(first.0); //evaluate first token as variable self.variable(&var); let second = first.1.split_once(" ").unwrap(); //assert second token is "=" if second.0 != "=" { println!("Syntax error, expected \"=\" found {}", second.0); panic!(); } //evaluate rest of tokens as an expression let value = String::from(self.expression(second.1).trim_matches('\"')); self.symbol_table.insert(var, value); } //a variable is X?[0-9] fn variable(&mut self, s:&str) { if !Regex::new(r"^X[\d]*$").unwrap().is_match(s) { println!("invalid variable name {}", s); panic!(); } } //an expression is a string literal or an operation fn expression(&mut self, s:&str) -> String{ let tokens: Vec<&str> = s.split(' ').collect(); match tokens[0] { "REST" => { if tokens.len() < 2 { println!("Error, expected variable after keyword REST"); panic!(); } let var = self.symbol_table.get(tokens[1]); if var == None { println!("Error, variable {} is not initialized", tokens[1]); panic!(); } let val = var.unwrap(); return String::from(val.get(1..val.len()).unwrap()); } "FIRST" => { if tokens.len() < 2 { println!("Error, expected variable after keyword FIRST"); panic!(); } let var = self.symbol_table.get(tokens[1]); if var == None { println!("Error, variable {} is not initialized", tokens[1]); panic!(); } let val = var.unwrap(); return String::from(val.clone().remove(0).to_string()); } "CONS" => { if tokens.len() < 3 { println!("Error, expected 2 variables after keyword CONS"); panic!(); } let var1 = self.symbol_table.get(tokens[1]); let var2 = self.symbol_table.get(tokens[2]); if var1 == None || var2 == None { println!("Error, variable is not initialized"); panic!(); } let val1 = var1.unwrap(); let val2 = var1.unwrap(); return String::from(val1) + val2; } _ => { if tokens[0].starts_with('\"') && tokens[0].ends_with('\"') { return String::from(tokens[0]); } else { println!("Syntax error, unrecognized expression {}", tokens[0]); panic!(); } } } } } fn main() { //read in the file as a String, call it "program" let args: Vec<_> = env::args().collect(); if args.len() > 1 { let filename = &args[1]; let tgt = fs::read_to_string(filename) .expect("Something went wrong reading the file"); let mut parser = Parser { target: tgt, symbol_table: BTreeMap::new() }; parser.parse(); } else { println!("No program provided"); panic!(); } }