26 if (
m_args.inputFile.empty())
34 std::ifstream file(
m_args.inputFile);
37 std::cerr <<
"Could not open file: " <<
m_args.inputFile <<
"\n";
41 std::stringstream buffer;
42 buffer << file.rdbuf();
43 std::string source = buffer.str();
51 catch (
const std::exception &e)
53 std::string errorMsg = std::string(e.what()) +
"\n";
66 auto program = parser.
parse();
70 std::cout <<
"AST:\n";
76 auto bytecode = codegen.
generate(*program);
78 return vm.
run(bytecode);
83 auto vm = std::make_unique<VM>();
90 vm->initFFI(
"plugins");
91#elif defined(__APPLE__)
92 vm->initFFI(
"/Library/Application Support/org.Phasor.Phasor/plugins");
93#elif defined(__linux__)
94 vm->initFFI(
"/usr/lib/phasor/plugins/");
97 vm->setImportHandler([
this, vm_ptr = vm.get()](
const std::filesystem::path &path) {
98 std::ifstream file(path);
100 throw std::runtime_error(
"Could not open imported file: " + path.string());
101 std::stringstream buffer;
102 buffer << file.rdbuf();
103 runSourceString(buffer.str(), *vm_ptr);
111 int defaultArgLocation = 1;
112 for (
int i = 1; i < argc; i++)
114 std::string arg = argv[i];
116 if (arg ==
"-v" || arg ==
"--verbose")
120 else if (arg ==
"-h" || arg ==
"--help")
127 defaultArgLocation = i;
132 m_args.scriptArgv = argv + defaultArgLocation;
133 m_args.scriptArgc = argc - defaultArgLocation;
138 std::string filename = std::filesystem::path(programName).filename().string();
139 std::cout <<
"Phasor Scripting Runtime\n\n";
140 std::cout <<
"Usage:\n";
141 std::cout <<
" " << filename <<
" [options] [file.phs] [...script args]\n\n";
142 std::cout <<
"Options:\n";
143 std::cout <<
" -v, --verbose Enable verbose output (print AST)\n";
144 std::cout <<
" -h, --help Show this help message\n";
Code generator for Phasor VM.
Bytecode generate(const AST::Program &program, const std::map< std::string, int > &existingVars={}, int nextVarIdx=0, bool replMode=false)
Generate bytecode from program.
std::vector< Token > tokenize()
std::unique_ptr< AST::Program > parse()
std::unique_ptr< VM > createVm()
void showHelp(const std::string &programName)
struct Phasor::ScriptingRuntime::Args m_args
ScriptingRuntime(int argc, char *argv[], char *envp[])
void parseArguments(int argc, char *argv[])
int runSourceString(const std::string &source, VM &vm)
static char ** argv
Command line arguments.
static void registerFunctions(VM &vm)
static int argc
Number of command line arguments.
static char ** envp
Environment variables.
int run(const Bytecode &bytecode)
Run the virtual machine Exits -1 on uncaught exception.
The Phasor Programming Language and Runtime.