16#define error(msg) MessageBoxA(NULL, std::string(msg).c_str(), "Phasor Runtime Error", MB_OK | MB_ICONERROR)
18#define error(msg) std::cerr << "Error: " << msg << std::endl
32 if (
m_args.inputFile.empty())
40 std::ifstream file(
m_args.inputFile);
43 std::cerr <<
"Could not open file: " <<
m_args.inputFile <<
"\n";
47 std::stringstream buffer;
48 buffer << file.rdbuf();
49 std::string source = buffer.str();
56 catch (
const std::exception &e)
58 std::string errorMsg = std::string(e.what()) +
"\n";
71 auto program = parser.
parse();
75 std::cout <<
"AST:\n";
81 auto bytecode = codegen.
generate(*program);
88 auto vm = std::make_unique<VM>();
95 FFI ffi(
"plugins", vm.get());
96#elif defined(__APPLE__)
97 FFI ffi(
"/Library/Application Support/org.Phasor.Phasor/plugins", vm.get());
98#elif defined(__linux__)
99 FFI ffi(
"/opt/Phasor/plugins", vm.get());
102 vm->setImportHandler([
this, vm_ptr = vm.get()](
const std::filesystem::path &path) {
103 std::ifstream file(path);
105 throw std::runtime_error(
"Could not open imported file: " + path.string());
106 std::stringstream buffer;
107 buffer << file.rdbuf();
108 runSourceString(buffer.str(), *vm_ptr);
116 int defaultArgLocation = 1;
117 for (
int i = 1; i < argc; i++)
119 std::string arg = argv[i];
121 if (arg ==
"-v" || arg ==
"--verbose")
125 else if (arg ==
"-h" || arg ==
"--help")
132 defaultArgLocation = i;
137 m_args.scriptArgv = argv + defaultArgLocation;
138 m_args.scriptArgc = argc - defaultArgLocation;
143 std::string filename = std::filesystem::path(programName).filename().string();
144 std::cout <<
"Phasor Scripting Runtime\n\n";
145 std::cout <<
"Usage:\n";
146 std::cout <<
" " << filename <<
" [options] [file.phs] [...script args]\n\n";
147 std::cout <<
"Options:\n";
148 std::cout <<
" -v, --verbose Enable verbose output (print AST)\n";
149 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.
Manages loading, registering, and unloading native FFI plugins.
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
void runSourceString(const std::string &source, VM &vm)
ScriptingRuntime(int argc, char *argv[], char *envp[])
void parseArguments(int argc, char *argv[])
static void registerFunctions(VM &vm)
Register all standard library functions.
static char ** argv
Command line arguments.
static int argc
Number of command line arguments.
static char ** envp
Environment variables.
void run(const Bytecode &bytecode)
Run the virtual machine.
The Phasor Programming Language and Runtime.