A TypeScript-based AST parser for the Mai language using Chevrotain. This parser implements the complete syntax specification for Mai, a domain-specific language used in financial/technical analysis.
- ✅ Complete Mai language syntax support
- ✅ Operator precedence and associativity
- ✅ Comments (line and block)
- ✅ Variable declarations with initialization
- ✅ Control flow (if-then-else with BEGIN/END blocks)
- ✅ Function calls and member access
- ✅ Assignment operators (
:=,:,^^,..) - ✅ Reserved market data keywords (O, H, L, C)
- ✅ Comprehensive error handling
- ✅ Full TypeScript support with type definitions
npm install mailang.jssee example
## Language Features
### Operators (by precedence)
1. **Multiplicative**: `*`, `/`
2. **Additive**: `+`, `-`
3. **Relational**: `>`, `<`, `>=`, `<=`, `<>`, `=`
4. **Logical AND**: `&&`
5. **Logical OR**: `||`
### Assignment Operators
- `:=` - Regular assignment
- `:` - Display assignment
- `^^` - Power assignment
- `..` - Range operator
### Reserved Keywords
- **Market Data**: `O` (Open), `H` (High), `L` (Low), `C` (Close)
- **Control Flow**: `IF`, `THEN`, `ELSE`, `BEGIN`, `END`
- **Declarations**: `VARIABLE`
- **Functions**: `RETURN`
### Comments
```mai
// Line comment
/* Block comment
spanning multiple lines */The parser produces a typed AST with the following main node types:
Program- Root node containing all statementsExpressionStatement- Expressions used as statementsVariableDeclaration- Variable declarationsGlobalVariableDeclaration- Global variable declarationsIfStatement- If-then-else statementsBlockStatement- BEGIN/END blocksReturnStatement- Return statementsBinaryExpression- Binary operationsAssignmentExpression- Assignment operationsUnaryExpression- Unary operationsCallExpression- Function callsMemberExpression- Property accessIdentifier- Variable namesNumberLiteral- Numeric literalsStringLiteral- String literals
The parser provides detailed error messages for:
- Lexical errors (invalid tokens)
- Syntax errors (invalid grammar)
- Missing semicolons
- Unclosed blocks
- Invalid expressions
const result = parseMai('invalid syntax');
if (result.errors.length > 0) {
console.log('Parse errors:', result.errors);
// Output: Parse errors: ["Parsing errors: Unexpected token: found 'invalid' but expected one of: ..."]
}# Install dependencies
npm install
# Build the project
npm run build
# Run tests
npm test
# Watch mode for development
npm run devMIT
Contributions are welcome! Please feel free to submit a Pull Request.