Mscript Interpreter
it.py – Interpreter for the Mscript language
Version: 0.7.0
Author: Momo-AUX1
Date: 2025-05-21
- Overview
- Features
- Requirements
- Installation
- Usage
- Standard Library
- Python Interoperability
- Language Grammar
- Built-in Functions
- Examples
- Version History
- Roadmap
- Contributing
- License
Mscript is a small, Python-powered scripting language with braces-based blocks and built-in support for variables, arithmetic, control flow, functions, data structures, I/O, FFI, and seamless Python interop. This repository provides:
- it.py – the Lark-based interpreter
- language.def – the grammar definition
- mscript_builtins.py – core built-ins
- std/ – standard library modules written in Mscript
For enhanced language support, install the Mscript VS Code Extension from the Visual Studio Marketplace.
- Variable assignment and lookup
- Arithmetic (
+,-,*,/,%,**) - Control flow:
if/elif/else,while,for,break,continue - First-class functions, with parameters and
return - Lists and dictionaries
- Module import (
import "std/..."orimport python) - Exception handling:
try/catch - Built-in functions:
input,print,str,int,type, file I/O, math, JSON, regex, time, environment, FFI, and more - REPL with history
- Foreign Function Interface (FFI) to call C libraries via
ctypes - Seamless Python interop: any Python package installed via
pipis immediately accessible under thepythonmodule
- Python 3.7+
- Lark parser
Install Lark with:
pip install larkInstall via PyPI:
pip install mscript-langOr clone the repo:
git clone https://github.com/momo-AUX1/Mscript.git
cd mscriptStart the REPL with no arguments:
mscriptYou'll see:
Mscript REPL 0.6.9 by Momo-AUX1 (type Ctrl-D to exit)
>>>
Type Mscript statements or expressions; results and errors print immediately.
Run a .mscript file:
mscript myscript.mscript--version: print interpreter version and exit--debug: show parse tree
A collection of Mscript modules installed under std/, importable via:
import "std/module_name"
Included modules:
- datetime.mscript:
today(),now(),strftime(),parse() - ffi.mscript:
load(),sym(),func(),buffer(),buffer_ptr(),offset(), read/write helpers - json.mscript:
loads(),dumps() - math.mscript:
sin(),cos(),tan(),log(),log10(),exp(),sqrt(),floor(),ceil(),pow(), constantsPI,E - platform.mscript:
system(),node(),release(),version(),machine(),processor(),full() - random.mscript:
random(),seed(),randint(),uniform(),choice(),shuffle() - re.mscript:
search(),match(),findall(),sub() - string.mscript:
upper(),lower(),strip(),lstrip(),rstrip(),find(),replace(),split(),join(),substring() - sys.mscript:
argv(),getenv(),setenv(),unsetenv(),platformproxy - time.mscript:
sleep(),time()
Mscript exposes a special python module that proxies into Python’s ecosystem:
import python
# call built-in Python functions
hi = python.print
hi("mscript!") # prints to stdout
# import any pip-installed package
req = python.requests.get("https://api.example.com").text
print req
- Any library installed in your Python environment (via
pip install …) can be imported and used directly in Mscript usingimport python. - Access modules, functions, classes, and attributes exactly as in normal Python.
Defined in language.def (LALR):
?start: statement+
?statement: assign | index_assign | print_stmt | if_stmt | while_stmt
| for_stmt | func_def | return_stmt | expr_stmt | import_stmt
| break_stmt | continue_stmt | try_stmt
# (see full grammar in language.def)| Category | Examples |
|---|---|
| Core | input, print, str(), int(), type(), len(), keys(), values() |
| File I/O | read(), write(), system() |
| Math | _sin(), _cos(), _log(), _sqrt(), _pow() |
| JSON | _json_loads(), _json_dumps() |
| Regex | _re_search(), _re_findall(), _re_sub() |
| Date/Time | _date_today(), _datetime_now(), _strftime() |
| Env/Sys | _getenv(), _setenv(), exit() |
| FFI | _ffi_open(), _ffi_sym(), _ffi_buffer(), _ffi_read_uint32() |
| Random | _random_random(), _random_choice(), _random_shuffle() |
| Platform | _platform_system(), _platform_platform() |
See mscript_builtins.py for full list.
# hello.mscript
x = "hello world"
print str.upper(x)
Run:
mscript hello.mscript
# Output: HELLO WORLDimport "std/ffi"
SDL = ffi.load("libSDL2.dylib")
SDL_Init = ffi.func(SDL, "SDL_Init", "int", ["uint"])
SDL_Quit = ffi.func(SDL, "SDL_Quit", "void", [])
if SDL_Init(32) != 0 {
print "SDL_Init failed!"
exit(1)
}
# ...
SDL_Quit()
import python
# use Python’s `math` module
print python.math.sqrt(2)
# HTTP request via `requests` (must be installed in your env)
resp = python.requests.get("https://httpbin.org/ip").json()
print resp["origin"]
# define function pointers directly to Mscript variables
hello = python.print
# use them as if they were our own
hello("world!")
- 0.6.9 – Current release (2025-05-22)
- 0.6.0 – Supporting more built-ins, enhancements to error handling
- 0.5.0 – True standard library
- 0.4.0 – Added more built-ins,
try/exceptsupport - 0.3.0 – Dotted names in functions and assignments
- 0.2.0 – Core interpreter improvements
- 0.1.0 – Initial release
- Package manager
- Expanded standard library
- Module namespace support
- Advanced debugging tools
This project is licensed under the MIT License. See LICENSE for details.